鱼C论坛

 找回密码
 立即注册
查看: 1146|回复: 7

[已解决]执行函数时会过一遍求解让他不要先过一遍结束了也是要再自己过一遍,帮忙加一个j结...

[复制链接]
发表于 2018-12-18 20:37:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <string.h>
int login()
{
        char secretCode[6];
        int number=3;
        printf("\t\t*********************************************************\n\t\t  *     *\t\t\t\t\t*     *\n");
        printf("\t\t    *   ******欢迎使用学生管理系统***************   *\n");
        printf("\t\t      * *\t\t\t17级计算机二区  * *\n\t\t\t*\t\t\t\t  友哥*\n\t\t\t  *\t\t\t\t      *\n\t\t\t    *\t\t\t\t    *\n\t\t\t     *******************************     \n");
        printf("\t\t\t   请输入密码:");
        scanf("%s",secretCode);
        while(number>0)
        {
                if(strcmp(secretCode,"888888")==0)break;
                else
                {
                        number--;
                        if(number<=0)break;
                        printf("\n\t\t\t您还有%d次机会",number);
                        printf("\n\t\t\t请输入密码:");
                        scanf("%s",secretCode);       
                }
        }
        if(number>0) return 1;
        else return 0;       
}
mainMenu()
{        
        char c,xm[81];                                                  /*通过学生姓名间的空格判断学生个数*/
        int k,word=0,N=0;                                               /*N为学生个数*/
             
        char dengji,cj[20];                                         /*输入成绩,计算成绩,输出成绩,输出等级*/
        int t1,t2,t3,t4,bingjia,chidao,zaotui,i;
        float avg;        
       
        float biaoxian,min,max;
        /*通过学生姓名间的空格判断学生个数*/
        printf("\t\t\t输入学生姓名以空格分隔:\n\t\t\t");
        gets(xm);
        for(k=0;(c=xm[k])!='\0';k++)
                if(c==' ')word=0;
                else if(word==0)
                {
                        word=1;
                        N++;
                }
        /*输入成绩,计算成绩,输出成绩,输出等级*/              /*算法:成绩=(语文+数学+英语+专业课)/4*0.6+表现成绩*0.4 -(迟到次数*5+早退次数*1+病假次数*2)*/
       
        for(i=0;i<N;i++)
                {
                        printf("\n\t\t\t请输入第%d位的成绩(用空格隔开)\n\t\t\t语文 数学 英语 专业课 病假 迟到 早退 表现成绩\n\t\t\t",i+1);
                        scanf("%d %d %d %d %d %d %d %f",&t1,&t2,&t3,&t4,&bingjia,&chidao,&zaotui,&biaoxian);        
                        avg=(float)(t1+t2+t3+t4)/4;                                   
                        cj[i]=avg*0.6+biaoxian*0.4-(bingjia*2+chidao*5+zaotui);
                        switch((int)cj[i]/10)
                                {
                                        case 10:
                                        case 9: dengji='A';break;
                                        case 8: dengji='B';break;
                                        case 7:
                                        case 6: dengji='C';break;
                                        default: dengji='D';
                                }
                        printf("\t\t\tNO%d    成绩;%d   等级%c\n",i+1,cj[i],dengji);
                }
        /*对成绩进行排序,取最大最小值*/
        int j,t;                                                /*i在上面已经定义*/
                /*当N=1时跳过下面*/                                          
        for(j=1;j<N;j++)
                for(i=0;i<N-j;i++)
                        if(cj[i]>cj[i+1]){t=cj[i];cj[i]=cj[i+1];cj[i+1]=t;}
                printf("\t\t\t排序后的成绩:\n\t\t\t");
        for(i=0;i<N;i++)
                        printf("%4d",cj[i]);
        printf("\n\n\t\t\t最高分%d       最低分%d",cj[N-1],cj[0]);
        /*不及格人数统计*/               
                        int jgrs=0,bjgrs=0;
                        for(i=0;i<N;i++)
                        if(cj[i]>=60) jgrs++;
                        else bjgrs++;
        printf("\n\t\t\t及格人数=%d   不及格人数=%d\n",jgrs,bjgrs);
}
main()
{
        if(login()==0);
                mainMenu();
        while(1){
        mainMenu();       
        }       
}
最佳答案
2018-12-18 21:14:32
本帖最后由 TyCk 于 2018-12-18 21:15 编辑
友哥 发表于 2018-12-18 21:03
我是小白不懂什么是子线程,可以用return ;来搞不,我其他的方法也不怎么会了!


提醒你一下,回帖的话要点回复,不然别人收不到提醒的。

这样的话,你可以在while循环开始的位置,打印一行"输入0退出,其他则继续”,然后scanf接收用户输入,判断是否为0,为0就退出循环退出程序,否则就继续循环。
不知道这样是否符合你的要求? 退出循环的话,直接break就好,其他的也就是个输入输出外加判断的运用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-12-18 20:46:21 | 显示全部楼层
还有帮忙加个按零退出程序,我尝试了很多方法都搞不定!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-18 20:54:19 | 显示全部楼层
本帖最后由 TyCk 于 2018-12-18 20:56 编辑

给你提供个思路,个人感觉可以开一个子线程,检测键盘键入情况,当按下0时,直接退出整个程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-18 21:03:22 | 显示全部楼层
我是小白不懂什么是子线程,可以用return ;来搞不,我其他的方法也不怎么会了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-18 21:14:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 TyCk 于 2018-12-18 21:15 编辑
友哥 发表于 2018-12-18 21:03
我是小白不懂什么是子线程,可以用return ;来搞不,我其他的方法也不怎么会了!


提醒你一下,回帖的话要点回复,不然别人收不到提醒的。

这样的话,你可以在while循环开始的位置,打印一行"输入0退出,其他则继续”,然后scanf接收用户输入,判断是否为0,为0就退出循环退出程序,否则就继续循环。
不知道这样是否符合你的要求? 退出循环的话,直接break就好,其他的也就是个输入输出外加判断的运用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-18 22:39:40 | 显示全部楼层
#include <stdio.h>
#include <string.h>
main()
{
        char secretCode[6];
        int number=3;
        printf("\t\t*********************************************************\n\t\t  *     *\t\t\t\t\t*     *\n");
        printf("\t\t    *   ******欢迎使用学生管理系统***************   *\n");
        printf("\t\t      * *\t\t\t17级计算机二区  * *\n\t\t\t*\t\t\t\t  杨文友*\n\t\t\t  *\t\t\t\t      *\n\t\t\t    *\t\t\t\t    *\n\t\t\t     *******************************     \n");
        printf("\t\t\t   请输入密码:");
        scanf("%s",secretCode);
        while(number>0)
        {
                if(strcmp(secretCode,"888888")==0)break;
                else
                {
                        number--;
                        if(number<=0)break;
                        printf("\n\t\t\t您还有%d次机会",number);
                        printf("\n\t\t\t请输入密码:");
                        scanf("%s",secretCode);       
                }
        }
                        char c,xm[81];                                                 
                        int k,word=0,N=0;                                                                       /*N为学生个数*/
                     
                        char dengji,cj[20];                                        
                        int t1,t2,t3,t4,bingjia,chidao,zaotui,i;
                        float avg;        
               
                        float biaoxian,min,max;
        if(number>0)
        {
                do
                {
                printf("\t\t\t输入学生姓名以空格分隔:\n\t\t\t");                 /*通过学生姓名间的空格判断学生个数*/
                gets(xm);
                for(k=0;(c=xm[k])!='\0';k++)
                        if(c==' ')word=0;
                        else if(word==0)
                        {
                                word=1;
                                N++;
                        }
                /*输入成绩,计算成绩,输出成绩,输出等级*/              /*算法:成绩=(语文+数学+英语+专业课)/4*0.6+表现成绩*0.4 -(迟到次数*5+早退次数*1+病假次数*2)*/
               
                for(i=0;i<N;i++)
                        {
                        printf("\n\t\t\t请输入第%d位的成绩(用空格隔开)\n\t\t\t语文 数学 英语 专业课 病假 迟到 早退 表现成绩\n\t\t\t",i+1);
                        scanf("%d %d %d %d %d %d %d %f",&t1,&t2,&t3,&t4,&bingjia,&chidao,&zaotui,&biaoxian);        
                        avg=(float)(t1+t2+t3+t4)/4;                                   
                        cj[i]=avg*0.6+biaoxian*0.4-(bingjia*2+chidao*5+zaotui);
                        switch((int)cj[i]/10)
                                {
                                        case 10:
                                        case 9: dengji='A';break;
                                        case 8: dengji='B';break;
                                        case 7:
                                        case 6: dengji='C';break;
                                        default: dengji='D';
                                }
                        printf("\t\t\tNO%d    成绩;%d   等级%c\n",i+1,cj[i],dengji);
                        }
                                                /*对成绩进行排序,取最大最小值*/
                int j,t;        /*i在上面已经定义*/
                /*当N=1时跳过下面*/                                          
                for(j=1;j<N;j++)
                        for(i=0;i<N-j;i++)
                                if(cj[i]>cj[i+1]){t=cj[i];cj[i]=cj[i+1];cj[i+1]=t;}
                printf("\t\t\t--》--》--》--》——>——》——》——》——》——》\n");
                printf("\t\t\t排序后的成绩:\n\t\t\t");
                for(i=0;i<N;i++)
                        printf("%4d",cj[i]);
                printf("\n\n\t\t\t最高分%d       最低分%d",cj[N-1],cj[0]);
                /*不及格人数统计*/               
                                int jgrs=0,bjgrs=0;
                                for(i=0;i<N;i++)
                                if(cj[i]>=60) jgrs++;
                                else bjgrs++;
                printf("\n\t\t\t及格人数=%d   不及格人数=%d\n",jgrs,bjgrs);
                printf("\n\t\t\t输入0结束其他键继续\n");
                scanf("%d",&i);
                }while(i!=0);
        }
               
}
改了一下现在直接就运行到底了,不能输入数据了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-18 22:41:32 | 显示全部楼层
TyCk 发表于 2018-12-18 21:14
提醒你一下,回帖的话要点回复,不然别人收不到提醒的。

这样的话,你可以在while循环开始的位置, ...

好蒙!源码发下面了!用cfree跑一下,解决不来了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-19 10:02:54 From FishC Mobile | 显示全部楼层
自己解决了!
原因:将回车当做字符执行了gets语句!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-1 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表