C 添加具有给定条件的数组元素

C 添加具有给定条件的数组元素,c,for-loop,scanf,variable-length-array,C,For Loop,Scanf,Variable Length Array,有一个n个学生的数组(stu[n])。如果性别是男孩,那么我的代码会添加 对于boyb,第2、第4、第6、……偶数位置数组和 对于girlg,数组的第一、第三、第五……奇数位置元素 1> 男孩的性别以b表示。 2> 女孩的性别以g表示 输入信息>> 第一行包含n,表示类中的学生数,因此表示数组中的元素数 后面的每一行都包含n个学生的分数 最后一行包含性别b/g 输出信息>> 输出应包含上述标记的所有替代元素的总和 #include <stdio.h> int main() {

有一个n个学生的数组(stu[n])。如果性别是男孩,那么我的代码会添加

  • 对于boy
    b
    ,第2、第4、第6、……偶数位置数组和
  • 对于girl
    g
    ,数组的第一、第三、第五……奇数位置元素
1> 男孩的性别以b表示。 2> 女孩的性别以g表示

输入信息>>

  • 第一行包含n,表示类中的学生数,因此表示数组中的元素数
  • 后面的每一行都包含n个学生的分数
  • 最后一行包含性别b/g 输出信息>>

    输出应包含上述标记的所有替代元素的总和

    #include <stdio.h>
    
    int main() {
    int n,i;
    scanf("%d",&n);//n denotes number of students.
    int stu[n],sum=0;
    
    
    for(i=1;i<=n;++i)
    scanf("%d",&stu[i]);//for accepting input in array.
    
    char gen;
    scanf("%s",&gen);//for accepting input gender b/g.
    
    
     for(i=1;i<=n;i++){
     if(gen=='g' && i%2!=0){ //girl g adds alternate odd position  elements.
    sum=sum+stu[i];
    printf("%d",sum);
    }
    
    else if(gen=='b' && i%2==0){ //boy b adds alternate even position elements.
    
    sum=sum+stu[i];
    printf("%d",sum);
    }
    
    }
    //code
    return 0;
    }
    
    #包括
    int main(){
    int n,i;
    scanf(“%d”,&n);//n表示学生人数。
    int stu[n],和=0;
    对于(i=1;i
    标记=[3,2,5]和性别=b,因此它将添加3+5(甚至位置0,2个备用元素)。如果代替b的性别是g,则它将产生输出=2


    我的代码是在所有测试用例中显示0的输出。

    您遇到的主要问题是

    int n,i;
    int stu[n],sum=0;
    
    这里,
    n
    是一个具有自动存储的未初始化局部作用域变量,初始值是不确定的

    现在,由于变量的地址从未被获取,并且它的类型可能具有陷阱表示,因此尝试使用该值(
    int stu[n]
    )将调用未定义的行为

    首先需要将值扫描到
    n
    ,然后使用该值定义VLA
    stu

    int n,i;
    scanf("%d",&n);//n denotes number of students.
     // **Note: please check for errors in input with scanf return value.**
    int stu[n],sum=0;   // here, n has the scanned value.
    
    也就是说

    char gen;
    scanf("%s",&gen);
    

    这也是一个可怕的错误,你想扫描一个
    char
    ,而不是一个字符串,并且使用一个普通
    char
    变量的地址,
    %s
    转换规范同样是UB。你应该使用
    %c
    并完全丢弃缓冲区中存在的所有空格。

    你让事情变得比他们需要这样做。以下是您可以做的:

    #include <stdio.h>
    
    int main(void)
    {
        int mark;
        int b = 0;
        int g = 0;
        char students_marks[5];
    
        for (int i=0; i<5; i++) {
            scanf("%d", &mark);
            students_marks[i] = mark;
        }
        for (int i=0; i<5; i++) {
            if (i%2 == 0) b += students_marks[i];
            if (i%2 == 1) g += students_marks[i];
        }
        printf("Boys: %d\nGirls: %d\n", b, g);
        return 0;
    }
    
    #包括
    内部主(空)
    {
    整数标记;
    int b=0;
    int g=0;
    char学生_分数[5];
    
    对于(int i=0;i您可能不应该使用数组,而只需忽略第一个数据点。它是(可能)使用链表更容易。或者只使用两个列表,在它们之间交替输入。我绝对不会使用scanf。如果你是C新手,不要浪费时间学习scanf格式字符串语言的缺点。scanf唯一有用的时间是在指导老师错误地相信你的入门课程中将能够比花时间学习其他方法更快地获得输入。但事实上,如果你不学习
    fread
    ,那么在学习何时使用格式字符串中的空格时,你将消耗更多的时间。在介绍C之后,你将(几乎)永远不要使用scanf。另外,将判别式放在输入的末尾似乎是一种可怕的设计。要求和的值(性别)应该作为命令行参数给出。也就是说,您可以这样做:

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    FILE *
    xfopen(const char *path, const char *mode)
    {
            FILE *rv;
            if( (rv = fopen(path, mode)) == NULL ) {
                    perror(path);
                    exit(EXIT_FAILURE);
            }
            return rv;
    }
    
    int
    main(int argc, char **argv)
    {
            int i;
            int size;  /* Should probably be size_t.  Skipping that for now. */
            FILE *in = argc > 1 ? xfopen(argv[1], "r") : stdin;
            int sum = 0;
            if( fscanf(in, "%d", &size) != 1 || size <= 0 ) {
                    fprintf( stderr, "invalid input\n" );
                    exit(EXIT_FAILURE);
            }
            int grades[size];
            for( i = 0; i < size; i++ ) {
                    if(fscanf(in, "%d", grades + i) != 1) {
                            fprintf( stderr, "invalid input on line %d\n", i );
                            exit(EXIT_FAILURE);
                    }
            }
            char gender;
            if(fscanf(in, " %c", &gender) != 1) {
                    fprintf( stderr, "invalid input on line %d\n", i );
                    exit(EXIT_FAILURE);
            }
            if(strchr("bBgG", gender) == NULL) {
                    fprintf( stderr, "invalid gender: %c\n", gender);
                    exit(EXIT_FAILURE);
            }
            for( i = tolower(gender) == 'b'; i < size; i += 2 ) {
                    sum += grades[i];
            }
            printf("sum: %d\n", sum);
    }
    
    #包括
    #包括
    #包括
    #包括
    文件*
    xfopen(常量字符*路径,常量字符*模式)
    {
    文件*rv;
    如果((rv=fopen(路径、模式))==NULL){
    佩罗尔(路径);
    退出(退出失败);
    }
    返回rv;
    }
    int
    主(内部argc,字符**argv)
    {
    int i;
    int size;/*应该是size\u t。现在跳过它*/
    文件*in=argc>1?xfopen(argv[1],“r”):stdin;
    整数和=0;
    
    如果(fscanf(in,“%d”,&size)!=1 | | sizeHmm…我对您的代码做了一点修改,希望它能按描述运行

    int main() {
    
           int n, index, sum=0;
           int* stu;
           scanf("%d", &n); // input number of studens
    
           if(n>0)
              stu = malloc(n*sizeof(int)); // allocate memory
           else
              return 0;
    
           for(index=0;index<n;index++)
              scanf("%d", &stu[index]);
    
           char gen;
           scanf("%c", &gen);
    
           for(index=0; index<n; index++){
              if(gen=='g' && index%2!=0) {
                 sum += stu[index];
                 printf("%d", sum);
              } else if(gen=='b' && index%2==0) {
                 sum += stu[index];
                 printf("%d", sum);
              }
           }
    
           return 0;
        }
    
    intmain(){
    int n,索引,和=0;
    int*stu;
    scanf(“%d”,&n);//输入studen的数目
    如果(n>0)
    stu=malloc(n*sizeof(int));//分配内存
    其他的
    返回0;
    
    对于(index=0;indexen即使编辑后也不会显示任何输出。请再次帮助。@Ayushaad您能在阅读答案后显示您尝试了什么以及失败的原因吗?我将scanf放在正确的位置,并将其更改为!==到!=我后来看到了,但编译器仍然不会显示任何输出。括号的位置可能错误,但我不这么认为。我在c上运行了这两个选项ode chef和geeks编译器。我是一名初学者,我不太会处理指针,因为我觉得缺乏实践,而且应用>>如int*标记还为时过早,所以我使用了vla和for循环。@Ayushaad这与指针是否有关,无论您使用什么,请确保正确使用它们。仍然没有显示任何输出(%s已更改为%c)我们无法添加输入{4,5,6,7,8}正如问题所说,我们必须接受用户使用scanf的输入,数组大小可以是随机的n;因此,请您提出一些改进建议。我是一名初学者,在数小时内尝试正确使用。循环a
    scanf
    并将扫描的值添加到数组中,就完成了。好的,我循环了scanf,但b和g仍然是字符值ues为什么在int中使用它?请注意,您不需要这些
    char
    ,因为条件是均匀的或不均匀的;您选择一个,另一个是无用的。此外,在
    if else
    循环中的嵌套
    if else
    条件中,您也可以做完全相同的事情。我必须在haker rank compi中编写b或g性别作为输入字符ler然后只有if-else语句将相应地作为偶数或奇数运行??您能再次阅读问题并请再次帮助我吗?这是正确解释的链接您说该文件有多行,但您给出的示例都在一行上。输入中的每个数据点是由换行符分隔的,还是由空格分隔的?详细信息很重要,并且将它们精确分开很重要。以新行分隔数据以新行分隔。我是否应该将\n添加到所有scanf并检查??如果您使用scanf,实际上并不重要。但在我看来,您不应该使用scanf。下面我给出的解决方案适用于每种情况。感谢这种新方法,但我是c语言的初学者。它只有20天