[英]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
。 在這種情況下,您需要scanf
在char 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.