两种不同,问题烦请大神解答

背景链接:http://codeup.cn/problem.php?cid=100000572&pid=4



进行了一天的搜索但还是没整明白,所以请您看看



问题代码段:

void input(student* &p){
    int i, j;
    int n = 10; 
    for(i=0; i<n; i++){     
        scanf("%d%s%d%d%d", &(p->num), p->name, p->grade, &(p->grade[1]), &(p->grade[2]));
        int len = strlen((*p).name);              //名字(长度不超过19,无空格)
        if(len == 1 || len > 19 ){
            printf("不符合规范");
            n++;
            memset(p->name, 0, sizeof(p->name));
            continue;
        }
        if((*p).grade[0] > 100 || (*p).grade[1] > 100 || (*p).grade[2] > 100        //成绩(0至100)
        || (*p).grade[0] < 0 || (*p).grade[1] < 0 || (*p).grade[2] < 0){
            printf("不符合规范");          
            n++;
            continue;   
        }

        p = p + 1;
    }    
} 

情况1:name有空格时,%s在遇到空格结束输入后,len的值为1;



调试样例:101 a a 11 22 33


结果:continue之后,并没能够重新scanf,而是直接继续向下执行,跳过了第一个if,进入了第二个if,并输出不符合规范,然后不断的循环。


图片说明



图片说明








情况2:grade大于100时


调试样例:101 aaa 111 22 33


结果:continue之后,能够重新scanf,并按照正常的逻辑往下实现。





为什么前者没有重新执行scanf呢!?





附完整源码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

using namespace std;

struct student{
    int num;
    char name[20];
    int grade[20];
};

void input(student* &p);        //输入函数 
void print(student* &p);        //输出函数 
void caculate(double ave_s[], double ave_p[], int top[], student* &p);  //计算单科总平均成绩与个人总平均成绩最高 

void input(student* &p){
    int i, j;
    int n = 10; 
    for(i=0; i<n; i++){     
        scanf("%d%s%d%d%d", &(p->num), p->name, p->grade, &(p->grade[1]), &(p->grade[2]));
        int len = strlen((*p).name);              //名字(长度不超过19,无空格)
        if(len == 1 || len > 19 ){
            printf("不符合规范");
            n++;
            memset(p->name, 0, sizeof(p->name));
            continue;
        }
        if((*p).grade[0] > 100 || (*p).grade[1] > 100 || (*p).grade[2] > 100        //成绩(0至100)
        || (*p).grade[0] < 0 || (*p).grade[1] < 0 || (*p).grade[2] < 0){
            printf("不符合规范");          
            n++;
            continue;   
        }

        p = p + 1;
    }    
} 

void caculate(double ave_s[], double ave_p[], int top[], student* &p){
    double sum_1, sum_2, sum_3;
    int i, j, k;
    int temp;
    double copy[20];        //用于复制平均分数组 
    for(i=0; i<10; i++){ 
        sum_1 += p->grade[0];
        sum_2 += p->grade[1];
        sum_3 += p->grade[2];
        p = p + 1;
    }
    ave_s[0] = sum_1 / 10;          //单科总平均分 
    ave_s[1] = sum_2 / 10; 
    ave_s[2] = sum_3 / 10; 
    p = p - 10;
    for(j=0; j<10; j++){
        double sum_p = (*p).grade[0] + (*p).grade[1] + (*p).grade[2];
        ave_p[j] = sum_p / 3;
        p = p + 1;
        sum_p = 0;
    } 
    for(k=0; k<10; k++){
        copy[k] = ave_p[k];
    }
    for(i=1; i<10; i++){            //将复制的数组冒泡排序 
        for(j=0; j<=10-i-1; j++){
            if(copy[j] > copy[j + 1]){
                temp = copy[j];
                copy[j] = copy[j + 1];
                copy[j + 1] = temp;
            }
        }
    }
    for(i=0, j=0; j<10; j++){
        if(ave_p[j] == copy[9]){
            top[i++] = j;       //按顺序将最高分的同学加入数组 
        }
    }
} 

void print(student* &p){
    int top[5] = {0, 0, 0, 0, 0};       
    double ave_s[10], ave_p[10];        
    p = p - 10;         //回到第一个student 
    caculate(ave_s, ave_p, top, p); 
    p = p - 10;
    printf("%.2f %.2f %.2f \n", ave_s[0], ave_s[1], ave_s[2]);      
    p = p + top[0];             //如果有多位相同,则输出第一个最高分同学 
    printf("%d %s %d %d %d\n", (*p).num, (*p).name, (*p).grade[0], (*p).grade[1], (*p).grade[2]);
}


int main(){
    student stu[10];
    student* p = stu;
    input(p);
    print(p);
    return 0;
} 

/*101 AAA 80 81 82
102 BBB 83 84 85
103 CCC 86 87 88
104 DDD 89 90 91
105 EEE 92 93 94
106 FFF 80 90 100
107 GGG 85 90 95
108 HHH 80 85 90
109 III 90 91 92
110 JJJ 91 88 87 */

2个回答

什么语言?C#吗?还是C++

TrROAD
桃花镇的一棵树 C和C++,在输入输出上采用C语言,不过头文件是C++的模式,cmath和algorithm没有用到,源码是用C++的cpp保存和运行。
一年多之前 回复
        scanf("%d%s%d%d%d", &(p->num), p->name, p->grade, &(p->grade[1]), &(p->grade[2]));

这一行的p->grade要加引用&吧

TrROAD
桃花镇的一棵树 谢谢帮忙!这个应该不需要加,p->grade,首元素就是它的地址。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐