执行函数时会过一遍求解让他不要先过一遍结束了也是要再自己过一遍,帮忙加一个j结...
#include <stdio.h>#include <string.h>
int login()
{
char secretCode;
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; /*通过学生姓名间的空格判断学生个数*/
int k,word=0,N=0; /*N为学生个数*/
char dengji,cj; /*输入成绩,计算成绩,输出成绩,输出等级*/
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)!='\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=avg*0.6+biaoxian*0.4-(bingjia*2+chidao*5+zaotui);
switch((int)cj/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,dengji);
}
/*对成绩进行排序,取最大最小值*/
int j,t; /*i在上面已经定义*/
/*当N=1时跳过下面*/
for(j=1;j<N;j++)
for(i=0;i<N-j;i++)
if(cj>cj){t=cj;cj=cj;cj=t;}
printf("\t\t\t排序后的成绩:\n\t\t\t");
for(i=0;i<N;i++)
printf("%4d",cj);
printf("\n\n\t\t\t最高分%d 最低分%d",cj,cj);
/*不及格人数统计*/
int jgrs=0,bjgrs=0;
for(i=0;i<N;i++)
if(cj>=60) jgrs++;
else bjgrs++;
printf("\n\t\t\t及格人数=%d 不及格人数=%d\n",jgrs,bjgrs);
}
main()
{
if(login()==0);
mainMenu();
while(1){
mainMenu();
}
} 还有帮忙加个按零退出程序,我尝试了很多方法都搞不定! 本帖最后由 TyCk 于 2018-12-18 20:56 编辑
给你提供个思路,个人感觉可以开一个子线程,检测键盘键入情况,当按下0时,直接退出整个程序。 我是小白不懂什么是子线程,可以用return ;来搞不,我其他的方法也不怎么会了! 本帖最后由 TyCk 于 2018-12-18 21:15 编辑
友哥 发表于 2018-12-18 21:03
我是小白不懂什么是子线程,可以用return ;来搞不,我其他的方法也不怎么会了!
提醒你一下,回帖的话要点回复,不然别人收不到提醒的。
这样的话,你可以在while循环开始的位置,打印一行"输入0退出,其他则继续”,然后scanf接收用户输入,判断是否为0,为0就退出循环退出程序,否则就继续循环。
不知道这样是否符合你的要求? 退出循环的话,直接break就好,其他的也就是个输入输出外加判断的运用。 #include <stdio.h>
#include <string.h>
main()
{
char secretCode;
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;
int k,word=0,N=0; /*N为学生个数*/
char dengji,cj;
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)!='\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=avg*0.6+biaoxian*0.4-(bingjia*2+chidao*5+zaotui);
switch((int)cj/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,dengji);
}
/*对成绩进行排序,取最大最小值*/
int j,t; /*i在上面已经定义*/
/*当N=1时跳过下面*/
for(j=1;j<N;j++)
for(i=0;i<N-j;i++)
if(cj>cj){t=cj;cj=cj;cj=t;}
printf("\t\t\t--》--》--》--》——>——》——》——》——》——》\n");
printf("\t\t\t排序后的成绩:\n\t\t\t");
for(i=0;i<N;i++)
printf("%4d",cj);
printf("\n\n\t\t\t最高分%d 最低分%d",cj,cj);
/*不及格人数统计*/
int jgrs=0,bjgrs=0;
for(i=0;i<N;i++)
if(cj>=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);
}
}
改了一下现在直接就运行到底了,不能输入数据了! TyCk 发表于 2018-12-18 21:14
提醒你一下,回帖的话要点回复,不然别人收不到提醒的。
这样的话,你可以在while循环开始的位置, ...
好蒙!源码发下面了!用cfree跑一下,解决不来了! 自己解决了!
原因:将回车当做字符执行了gets语句!
页:
[1]