在给定条件下添加数组元素

时间:2019-07-18 12:56:23

标签: c for-loop scanf variable-length-array

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

  • 对于男孩b,第二,第四,第六,........甚至数组和
  • 的位置元素
  • 对于女孩g,第1,第3,第5。...数组的奇数个位置元素。

1>用b表示的男孩的性别。 2>用g表示的女孩性别。

输入信息>>

  1. 第一行包含n,表示班级的学生人数,因此表示数组中元素的数量。
  2. 随后的每一行都包含n个学生的分数。
  3. 最后一行包含性别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;
}

样本输入

3 3 2 5 b

样本输出 8

说明>> 标记= [3,2,5]和性别= b,所以它将添加3 + 5(甚至位置0,2个备用元素)。如果代替b的性别是g,那么它将产生输出= 2。

我的代码显示所有测试用例的输出均为0。

4 个答案:

答案 0 :(得分:1)

您遇到的主要问题

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,而不是 string ,并使用简单的char变量%s的地址进行扫描转换规范将再次为UB。您应该使用%c并丢弃缓冲区中全部存在的空白。

答案 1 :(得分:0)

您正在使事情变得复杂得多。这是您可能的方法:

#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;
}

答案 2 :(得分:0)

您可能不应该使用数组,而只需忽略第一个数据点。使用(可能)更容易使用链表。或者也许只是使用两个列表,在它们之间交替输入。而且我绝对不会使用scanf。如果您不熟悉C,请不要浪费您的时间来学习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);
}

答案 3 :(得分:0)

嗯...我对您的代码做了一些更改,希望它能按说明运行。

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;
    }