桃花镇的一棵树 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 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题