桃花镇的一棵树 2019-03-13 19:36 采纳率: 0%
浏览 356

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

背景链接: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条回答 默认 最新

  • 无心含笑 2019-03-13 21:32
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!