有n个学生数组(stu [n])。如果性别是男孩,那么我的代码会添加
b
,第二,第四,第六,........甚至数组和g
,第1,第3,第5。...数组的奇数个位置元素。1>用b表示的男孩的性别。 2>用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。
答案 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;
}