编译器:vc++6.0
问题:请问这里getchar和scanf颠倒,为什么出现了以下不一样的结果?
我的代码1:
- #include<stdio.h>
- typedef struct student_score
- {
- int number;
- int score[5];
- int average;
- }data;
- void average_subject(data **p)
- {
- int i,sum=0;
- for(i=0;i<5;i++)
- {
- sum=0;
- for(int j=0;j<10;j++)
- {
- sum+=(*(p+j))->score[i];
- }
- printf("the %dth subject's average score is:%d\n",i+1,sum/10);
- }
- printf("\n");
- }
- void failed(data **p)
- {
- puts("\nthe fail mark:socre<80");
- int i,sum=0;
- int k=0;
- int flag=0;
- data student1[10];
- for(i=0;i<10;i++)
- {
- sum=0;
- for(int j=0;j<5;j++)
- sum+=(*(p+i))->score[j];
- if(sum/5<80)
- {
- student1[k].average=sum/5;
- student1[k++].number=(*(p+i))->number;
- flag=1;
- }
- else
- continue;
- }
- if(!flag)
- {
- printf("there're no falied student\n");
- }
- else if(flag)
- {
- int temp=0;
- for(i=0;i<k-1;i++)
- for(int j=i+1;j<k;j++)
- {
- if(student1[i].average>student1[j].average)
- {
- temp=student1[i].average;
- student1[i].average=student1[j].average;
- student1[j].average=temp;
- }
- }
- printf("the list of faild students:\n");
- for(i=0;i<k;i++)
- {
- printf("the number is:%d,average score is:%d\n",student1[i].number,student1[i].average);
- }
- }
- printf("\n");
- }
- void average_individual(data **p)
- {
- int i,sum=0;
- for(i=0;i<10;i++)
- {
- sum=0;
- for(int j=0;j<5;j++)
- sum+=(*(p+i))->score[j];
- printf("the %dth student's average score is%d\n",(*(p+i))->number,sum/5);
- }
- printf("\n");
- }
- void total(void (*pfun)(data**),data **p1)
- {
- pfun(p1);
- }
- void main()
- {
- char ch;
- data student[10];
- data *pdata[10];
- puts("please input the data of thrity students:");
- for(int i=0;i<10;i++)
- {
- student[i].number=i+1;
- printf("the %dth student scores:",i+1);
- for(int j=0;j<5;j++)
- {
- scanf("%d",&student[i].score[j]);
- }
- pdata[i]=&student[i];
- }
- void (*ptotal)(void(*)(data**),data**)=total;
- do
- {
- printf("\n");
- printf("the average of student's subjects-----1\n");
- printf("the failed student number and socre---2\n");
- printf("the average of individuals------------3\n");
- printf("if you want break please input--------0\n");
- printf("please make a option:");
- scanf("%c",&ch);
- getchar();
- switch(ch)
- {
- case '1':ptotal(average_subject,pdata);break;
- case '2':ptotal(failed,pdata);break;
- case '3':ptotal(average_individual,pdata);break;
- case '0':break;
- }
- }while(ch!='0');
- }
代码1的运行结果:
出现一直重复的情况
我的代码2:
#include<stdio.h>
typedef struct student_score
{
int number;
int score[5];
int average;
}data;
void average_subject(data **p)
{
int i,sum=0;
for(i=0;i<5;i++)
{
sum=0;
for(int j=0;j<10;j++)
{
sum+=(*(p+j))->score[i];
}
printf("the %dth subject's average score is:%d\n",i+1,sum/10);
}
printf("\n");
}
void failed(data **p)
{
puts("\nthe fail mark:socre<80");
int i,sum=0;
int k=0;
int flag=0;
data student1[10];
for(i=0;i<10;i++)
{
sum=0;
for(int j=0;j<5;j++)
sum+=(*(p+i))->score[j];
if(sum/5<80)
{
student1[k].average=sum/5;
student1[k++].number=(*(p+i))->number;
flag=1;
}
else
continue;
}
if(!flag)
{
printf("there're no falied student\n");
}
else if(flag)
{
int temp=0;
for(i=0;i<k-1;i++)
for(int j=i+1;j<k;j++)
{
if(student1[i].average>student1[j].average)
{
temp=student1[i].average;
student1[i].average=student1[j].average;
student1[j].average=temp;
}
}
printf("the list of faild students:\n");
for(i=0;i<k;i++)
{
printf("the number is:%d,average score is:%d\n",student1[i].number,student1[i].average);
}
}
printf("\n");
}
void average_individual(data **p)
{
int i,sum=0;
for(i=0;i<10;i++)
{
sum=0;
for(int j=0;j<5;j++)
sum+=(*(p+i))->score[j];
printf("the %dth student's average score is%d\n",(*(p+i))->number,sum/5);
}
printf("\n");
}
void total(void (*pfun)(data**),data **p1)
{
pfun(p1);
}
void main()
{
char ch;
data student[10];
data *pdata[10];
puts("please input the data of thrity students:");
for(int i=0;i<10;i++)
{
student[i].number=i+1;
printf("the %dth student scores:",i+1);
for(int j=0;j<5;j++)
{
scanf("%d",&student[i].score[j]);
}
pdata[i]=&student[i];
}
void (*ptotal)(void(*)(data**),data**)=total;
do
{
printf("\n");
printf("the average of student's subjects-----1\n");
printf("the failed student number and socre---2\n");
printf("the average of individuals------------3\n");
printf("if you want break please input--------0\n");
printf("please make a option:");
getchar();
scanf("%c",&ch);
switch(ch)
{
case '1':ptotal(average_subject,pdata);break;
case '2':ptotal(failed,pdata);break;
case '3':ptotal(average_individual,pdata);break;
case '0':break;
}
}while(ch!='0');
}
运行结果:
程序正常进行。
请问我这两个地方颠倒为什么会出现这样的差别?代码1中我将getchar放在scanf后面,在输入队列中难道不是字符赋给了ch,按键盘回车刚好被getchar吸收了吗,而代码2中颠倒过来却是正确的,希望大神能解答一下其中的原理,谢谢~~