簡體   English   中英

是否可以在二維數組中輸入 2 種數據類型?

[英]Is it possible to input 2 data types in a 2d array?

因此,我被要求編寫一個程序,該程序獲取學生姓名和分數的列表並計算平均分數。 您需要聲明兩個稱為名稱和標記的 arrays。 假設學生人數為 5。

聲明數組名稱:(使用二維數組)char names[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;
    }

////////////////////輸出///////////////////////

Enter student name:Brian
Enter student marks:99

Enter student name:Edward
Enter student marks:79

Enter student name:Fred
Enter student marks:69

Enter student name:Adrian
Enter student marks:45

Enter student name:Smith
Enter student marks:55
(null) 45.000000
Average mark of 5 students = 69.40
Process returned 35 (0x23)   execution time : 40.064 s
Press any key to continue.

你的代碼是怎么錯的:

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

char name[num_std][name_len[20]]; 是錯的。 name_len是一個包含 20 個元素的數組,因此這些元素的索引范圍從 0 到 19。訪問name_len[20]是不正確的。 此外,此時尚未為name_len中的任何元素賦值。 C 標准允許 arrays 在程序執行期間設置長度,但必須在定義數組時給出長度。 它不能是在變量更改時調整的長度。 在您學習的這一點上,將長度更改為給定的最大值: char name[num_std][21]; . 21 個數組元素(每個一個char )允許名稱中有 20 個字母加上一個 null 字符來標記結束。 (稍后您將學習管理多個不同長度的字符串的其他方法。)

您還需要在此定義之前給num_std一個值。 目前尚不清楚該值應該是什么。 程序的其他部分是為五名學生硬編碼的。 在這種情況下,您可以使用char num_std = 5;定義num_std . 在這樣的分配中,程序通常會首先從輸入中讀取num_std 在這種情況下,您需要scanfchar name[num_std][21];行之前讀取num_std .

scanf("%s",&name[n][1]); 是錯的。 我們希望將字符串放在名稱空間的開頭,並且該空間以name[n][0]開頭,而不是name[n][1] 所以你可以使用&name[n][0] 表達式name[n]將具有相同的值,因為在 C 中,表達式中的 arrays 會自動轉換為指向其第一個元素的指針(除非用作sizeof或一元&的操作數或用作初始化大批)。

printf("%s %f",name[n][1],marks[n]); ,您還應該使用name[n][0] ,並且您再次需要傳遞其地址&name[n][0]name[n]

在 for 循環中使用 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM