桃花镇的一棵树 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++

    评论

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的