【问题标题】:Is it possible to input 2 data types in a 2d array?是否可以在二维数组中输入 2 种数据类型?
【发布时间】:2021-04-03 12:20:57
【问题描述】:

因此,我被要求编写一个程序,该程序获取学生姓名和分数的列表并计算平均分数。您需要声明两个名为名称和标记的数组。假设学生人数为 5。

声明数组名:(使用二维数组) 字符名称[num_std][name_len]; //名字长度可以是20个字符

声明数组标记: 浮动标记[num_std];

让我恼火的是,当我尝试运行调用名称和标记的循环时,我不知道为什么会得到 null。而且我还想知道以这种方式对我的二维数组进行编码是否正确? 抱歉,我还是个二维数组的新手,这让我很困惑。

谁能给我一个完整的代码,因为我想指出我错在哪里。 非常感谢:D

////////////////////代码/////////////////// /

#include <stdio.h>

int main ()
{
    int n,i;
    char num_std;
    char name_len[20];
    char name[num_std][name_len[20]];
    float sum = 0,marks [5];
    for (n=0;n<5;n++)
    {
        printf("\nEnter student name:");
        scanf("%s",&name[n][1]);

        printf("Enter student marks:");
        scanf("%f",&marks[n]);
        sum += marks[n];
    }

        for(n=1;n<5;n++)
        {
        printf("%s %f",name[n][1],marks[n]);
         }

    float average = sum/5.0;
    printf("\nAverage mark of 5 students = %.2f",average);
    
    return 0;
    }

//////////////////////////////////////////////p > 输入学生姓名:布赖恩 输入学生分数:99 输入学生姓名:爱德华 输入学生分数:79 输入学生姓名:Fred 输入学生分数:69 输入学生姓名:阿德里安 输入学生分数:45 输入学生姓名:Smith 输入学生分数:55 (空) 45.000000 5 名学生的平均分 = 69.40 进程返回 35 (0x23) 执行时间:40.064 s 按任意键继续。

【问题讨论】:

  • 启用编译器警告,您的编译器将报告您的代码存在许多问题。使用 C 开发时,应始终启用警告。

标签: arrays c loops


【解决方案1】:

你的代码怎么错了:

#include <stdio.h>

int main ()
{
    /* i is declared but not used (legal) */
    int n,i;
    char num_std;
    char name_len[20];
    /* uninitialized variable num_std is used as array length (critical) */
    /* out-of-range name_len[20] is used (critical) */
    char name[num_std][name_len[20]];
    float sum = 0,marks [5];
    for (n=0;n<5;n++)
    {
        printf("\nEnter student name:");
        /* the first element of the array name[n] is not used (legal) */
        scanf("%s",&name[n][1]);

        printf("Enter student marks:");
        scanf("%f",&marks[n]);
        sum += marks[n];
    }

    /* indentation is broken (legal) */
        /* the first data is not printed (legal) */
        for(n=1;n<5;n++)
        {
        /* char (name[n][1]) is passed where char* is required (critical) */
        /* data is printed without being separated (legal) */
        printf("%s %f",name[n][1],marks[n]);
         }

    float average = sum/5.0;
    /* newline character is not printed at end of output (legal) */
    printf("\nAverage mark of 5 students = %.2f",average);
    
    return 0;
    /* but indentation is broken (legal) */
    }

这里的“严重”表示错误将引发未定义的行为,“合法”表示错误不会引发未定义的行为,但行为可能不是想要或不典型。

固定代码:

#include <stdio.h>

int main (void)
{
    int n;
    char name[5][21]; /* 20-character name + 1 terminating null-character */
    float sum = 0,marks [5];
    for (n=0;n<5;n++)
    {
        printf("\nEnter student name:");
        scanf("%20s",name[n]); /* specify length limit to avoid buffer overrun */

        printf("Enter student marks:");
        scanf("%f",&marks[n]);
        sum += marks[n];
    }

    for(n=0;n<5;n++)
    {
        printf("%s %f\n",name[n],marks[n]);
    }

    float average = sum/5.0;
    printf("\nAverage mark of 5 students = %.2f\n",average);
    
    return 0;
}

【讨论】:

    【解决方案2】:

    char name[num_std][name_len[20]]; 是错误的。 name_len 是一个包含 20 个元素的数组,因此这些元素的索引范围从 0 到 19。访问 name_len[20] 是不正确的。此外,此时name_len 中的任何元素都没有被赋值。 C 标准允许在程序执行期间设置长度的数组,但必须在定义数组时给出长度。它不能是在变量更改时调整的长度。在您学习的这一点上,将长度更改为给定的最大值:char name[num_std][21];。 21 个数组元素(每个 char)允许名称中有 20 个字母加上一个空字符来标记结束。 (稍后您将学习管理多个不同长度的字符串的其他方法。)

    您还需要在此定义之前给num_std 一个值。目前尚不清楚该值应该是什么。程序的其他部分是为五名学生硬编码的。在这种情况下,您可以使用char num_std = 5; 定义num_std。在这样的分配中,程序通常会首先从输入中读取num_std。在这种情况下,您需要在char name[num_std][21]; 行之前使用scanf 来读取num_std

    scanf("%s",&amp;name[n][1]); 是错误的。我们希望将字符串放在名称空格的开头,该空格以name[n][0] 开头,而不是name[n][1]。所以你可以使用&amp;name[n][0]。表达式 name[n] 将具有相同的值,因为在 C 中,表达式中的数组会自动转换为指向其第一个元素的指针(除非用作 sizeof 或一元 &amp; 的操作数或用作字符串字面量初始化数组)。

    printf("%s %f",name[n][1],marks[n]); 中,您还应该使用name[n][0],并且您再次需要传递其地址,&amp;name[n][0]name[n]

    【讨论】:

    • 另外不要忘记在做char name[num_std][20];之前初始化num_std
    【解决方案3】:

    在 foror 循环中使用 i 是一种很好的技术

    #include <stdio.h>
    
    int main ()
    {
    char name[5][20];
    float marks [5],sum=0;
    for (int i=0;i<5;i++)
    {
        printf("\nEnter student name :");
        scanf("%s[^\n]",name[i]);
        printf("Enter student marks :");
        scanf("%f",&marks[i]);
        sum += marks[i];
    }
    
        for(int i=0;i<5;i++)
        {
              printf("\n%s : %f",name[i],marks[i]);
        }
      printf("\nAverage mark of 5 students = %.2f",(double)sum/5.0);
     //float average=(float) sum/5.0;
     //printf("\nAverage mark of 5 students = %.2f",average);
     return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 2021-02-24
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 2022-11-04
      相关资源
      最近更新 更多