iT邦幫忙

3

成績與字串輸入問題

1.題目:輸入4個人的名字(一個英文字母)和成績,最後顯示最高分與最低分的分數和名字
2.程式碼

# include <stdio.h>
main() 
{
    float a[4];
	int i;
	int j;
	float k;
	float Ave = 0;
	char b[4][2];
	char l;
	
	
	for(i = 0; i < 4; i = i + 1)	
		scanf("%s %f", &b[i], &a[i]);
	for(i = 0; i < 4; i = i + 1)
		for(j = 0; j < (4 - i) - 1; j = j + 1)
		{
			if(a[j] > a[j + 1])
			{
				k = a[j];
				a[j] = a[j + 1];
				a[j + 1] = k;
				
				l = b[j][2];
				b[j][2] = b[j + 1][2];
				b[j + 1][2] = l;
					
			
			}	
		}
	for(i = 0; i < 4; i = i + 1)
		Ave = Ave + a[i];
	Ave = Ave / 4;
	
	printf("Max = %.2f %s\n", a[3], b[3]);
	printf("min = %.2f %s\n", a[0], b[0]);
	printf("Ave = %.2f\n", Ave);
	
}

3.顯示畫面
https://ithelp.ithome.com.tw/upload/images/20200910/20128427wwOUBdo3C9.png

4.問題:請問要怎麼使最高分是f,最低分是v?

2
海綿寶寶
iT邦大神 1 級 ‧ 2020-09-11 09:13:13
最佳解答

排序的地方小改一下即可

# include <stdio.h>
int main() 
{
    float a[4];
	int i;
	int j;
	float k;
	float Ave = 0;
	char b[4][2];
	char l;
	
	for(i = 0; i < 4; i = i + 1)	
		scanf("%s %f", &b[i], &a[i]);
	for(i = 0; i < 4; i = i + 1)
		for(j = 0; j < (4 - i) - 1; j = j + 1)
		{
			if(a[j] > a[j + 1])
			{
				k = a[j];
				a[j] = a[j + 1];
				a[j + 1] = k;
				
				// l = b[j][2];
				// b[j][2] = b[j + 1][2];
				// b[j + 1][2] = l;
				l = b[j][0];
				b[j][0] = b[j + 1][0];
				b[j + 1][0] = l;
				l = b[j][1];
				b[j][1] = b[j + 1][1];
				b[j + 1][1] = l;
			
			}	
		}
	for(i = 0; i < 4; i = i + 1)
		Ave = Ave + a[i];
	Ave = Ave / 4;
	
	printf("Max = %.2f %s\n", a[3], b[3]);
	printf("min = %.2f %s\n", a[0], b[0]);
	printf("Ave = %.2f\n", Ave);
	
}
2
wrxue
iT邦新手 2 級 ‧ 2020-09-10 22:38:33

首先不知道你為什麼要宣告為char b[4][2],看起來沒有用到,所以我擅自把它拿掉改為char b[4],所以回圈內的那個[2]也可以拿掉了,另外要提醒的是printf("Max = %.2f %s\n", a[3], b[3]);內的%s是給一個字串,但b[3]是字元,所以應該改為%c,若引用錯誤很可能造成Access violation reading location 0x00000066.

改完如下

# include <stdio.h>
main()
{
	float a[4];
	int i;
	int j;
	float k;
	float Ave = 0;
	char b[4];
	char l;


	for (i = 0; i < 4; i = i + 1)
		scanf("%s %f", &b[i], &a[i]);
	for (i = 0; i < 4; i = i + 1)
		for (j = 0; j < (4 - i) - 1; j = j + 1)
		{
			if (a[j] > a[j + 1])
			{
				k = a[j];
				a[j] = a[j + 1];
				a[j + 1] = k;

				l = b[j];
				b[j] = b[j + 1];
				b[j + 1] = l;


			}
		}
	for (i = 0; i < 4; i = i + 1)
		Ave = Ave + a[i];
	Ave = Ave / 4;

	printf("Max = %.2f %c\n", a[3], b[3]);
	printf("min = %.2f %c\n", a[0], b[0]);
	printf("Ave = %.2f\n", Ave);

}

輸出

k 85
v -5
f 89
d 10
Max = 89.00 f
min = -5.00 v
Ave = 44.75

新增1-以字串處理方式

# include <stdio.h>
main()
{
	float a[4];
	int i;
	int j;
	float k;
	float Ave = 0;
	char b[4][2];
	char l;


	for (i = 0; i < 4; i = i + 1)
		scanf("%s %f", &b[i][0], &a[i]);  // 名字存到b[i][0],'\0'會存到b[i][1]
	for (i = 0; i < 4; i = i + 1)
		for (j = 0; j < (4 - i) - 1; j = j + 1)
		{
			if (a[j] > a[j + 1])
			{
				k = a[j];
				a[j] = a[j + 1];
				a[j + 1] = k;
                
                // b[j][1]都是'\0'
                // 只需換名字就好 因此只須換b[j][0]與b[j+1][0]
				l = b[j][0];
				b[j][0] = b[j + 1][0];
				b[j + 1][0] = l;


			}
		}
	for (i = 0; i < 4; i = i + 1)
		Ave = Ave + a[i];
	Ave = Ave / 4;

	printf("Max = %.2f %s\n", a[3], &b[3][0]);  // %s要給字串的指標 所以用&
	printf("min = %.2f %s\n", a[0], &b[0][0]);  // %s要給字串的指標 所以用&
	printf("Ave = %.2f\n", Ave);

}
看更多先前的回應...收起先前的回應...
憤怒鳥 iT邦新手 5 級 ‧ 2020-09-10 23:16:29 檢舉

因為我想要練習字串的輸入與顯示

小魚 iT邦大師 1 級 ‧ 2020-09-10 23:17:47 檢舉

只是要最大最小跟平均應該不需要用排序,
這樣是O(n^2),
其實只要跑O(n)就夠了.

憤怒鳥 iT邦新手 5 級 ‧ 2020-09-10 23:18:56 檢舉

[2]中的2除了英文字母,還包含\0

wrxue iT邦新手 2 級 ‧ 2020-09-11 08:17:29 檢舉

既然你說出你的想法,我就照你的想法去改,讓你參考,內文中新增。

wrxue iT邦新手 2 級 ‧ 2020-09-11 08:23:54 檢舉

然而 小魚 大大說的沒錯,可以不用排序後才知道最大最小,但我當作你是練習排序然後找出大小,所以就不幫你改邏輯了。

2
小魚
iT邦大師 1 級 ‧ 2020-09-10 23:58:33
l = b[j][2];
b[j][2] = b[j + 1][2];
b[j + 1][2] = l;

這蠻有趣的,
宣告b[4][2]應該只會有b[j][0]跟b[j][1]而已吧,
所以b[j][2]是跑到下一個記憶體位置了?
變成b[j+1][0]的位置??

2
richardsuma
iT邦大師 1 級 ‧ 2020-09-11 00:45:48

可以將成績讀進來就直接處理:

for (i = 0; i < 4; i = i + 1)
{
scanf("%s %f", &b[i], &a[i]);
SUM=SUM+a[i];
if(a[i]>MAX)
MAX=i;
if(a[i]<MIN)
MIN=i;
}

我要發表回答

立即登入回答