1. 程式人生 > >《明解C語言》筆記及課後習題答案 【第五章】

《明解C語言》筆記及課後習題答案 【第五章】

練習5-1

/*---從頭順次為陣列中的元素賦值0,1,2,3,4---*/

#include <stdio.h>

int main(void)
{
	int i, v[5];
	
	for(i = 0;i < 5; i++){
		v[i] = i;
		printf("v[%d]=%d\n",i,v[i]);
	}
	
	return 0;
 } 

練習5-2

/*---從頭順次為陣列中的元素賦值5,4,3,2,1。---*/

#include <stdio.h>

int main(void)
{
	int i,v[5];
	
	for(i = 0; i < 5; i++){
		v[i] = 5 - i;
		printf("v[%d] = %d\n",i,v[i]);
	}
	
	return 0;
 } 

練習5-3

/*---修改程式,從頭開始依次使用5,4,3,2,1進行初始化。---*/

#include <stdio.h>

int main(void)
{
	int i, v[5] = {5, 4, 3, 2, 1};
	
	for(i = 0; i < 5; i++)
		printf("v[%d] = %d\n", i, v[i]);
		
	return 0;
 } 

練習5-4

/*---將初始化了的陣列倒序賦值到b陣列中---*/

#include <stdio.h>

int main(void)
{
	int i;
	int a[5] = {17, 23, 36};
	int b[5];
	
	for (i = 0; i< 5; i++)
		b[i] = a[5-i-1];
	
	puts(" a  b");
	puts("-------");
	for (i = 0; i< 5; i++)
		printf("%4d%4d\n", a[i], b[i]);
		
	return 0; 
 } 

練習5-5

/*---對程式進行修改,改為用物件式巨集來定義元素個數。---*/

#include <stdio.h>
#define NUMBER 7

int main(void)
{
	int i;
	int x[NUMBER];
	
	for (i = 0; i < NUMBER; i++){
		printf("x[%d]:", i);
		scanf("%d", &x[i]);
	}
	
	for (i = 0; i < NUMBER/2; i++){
		int  temp = x [i];
		x[i] = x[NUMBER - i - 1];
		x[NUMBER - i - 1] = temp;
	} 
	
	puts("倒序排列了。");
	for(i = 0; i < NUMBER; i++)
		printf("x[%d] = %d\n", i, x[i]);
	
	return 0;
 } 

練習5-7

/*---讀取陣列中的資料個數和元素值並顯示。顯示時,
各值之間用逗號和空格分割,並用大括號將所有值括起來---*/

#include <stdio.h> 

int main (void)
{
	int i, j[i], a;
	
	printf("資料個數:");
	scanf("%d",&i);
	
	for(a = 0; a < i; a++){
		printf("%d號:",a+1);
		scanf("%d",&j[a]);
	} 
	
	putchar('{');
	for(a = 0; a < i; a++){
		printf("%d",j[a]);
	}
	putchar('}');
	
	return 0;
 } 

練習5-8

/*
	輸入學生的分數並顯示出分佈情況
*/

#include <stdio.h>

#define NUMBER	80		/* 人數上限 */

int main(void)
{
	int i, j;
	int num;				/* 實際的人數 */
	int tensu[NUMBER];		/* 學生的分數 */
	int bunpu[11] = {0};	/* 分佈圖 */

	printf("請輸入學生人數:");

	do {
		scanf("%d", &num);
		if (num < 1 || num > NUMBER)
			printf("\a 請輸入1~%d 的數:", NUMBER);
	} while (num < 1 || num > NUMBER);

	printf("請輸入%d 人的分數。\n", num);

	for (i = 0; i < num; i++) {
		printf("%2d號:", i + 1);
		do {
			scanf("%d", &tensu[i]);
			if (tensu[i] < 0 || tensu[i] > 100)
				printf("\a請輸入1~100 的數:");
		} while (tensu[i] < 0 || tensu[i] > 100);
		bunpu[tensu[i] / 10]++;
	}

	puts("\n---分佈圖---");
	
	for (i = 0; i <= 9; i++) {				/* 不到100分 */
		printf("%3d - %3d:", i * 10, i * 10 + 9);
	for (j = 0; j < bunpu[i]; j++)
		putchar('*');
	putchar('\n');
	}

	printf("      100:");
	for (j = 0; j < bunpu[10]; j++)			/* 100分 */
		putchar('*');
	putchar('\n');

	return 0;
}

練習5-10

/*---求4行3列矩陣和3行4列矩陣的乘積。各構成元素的值從鍵盤輸入。---*/

#include <stdio.h>

#define a 3
#define b 4

int main(void)
{
	int la[a][b], lb[b][a], i, j;
	
	printf("請輸入一個3行4列矩陣的值。");
	
	for(i = 0; i < a; i++){
		printf("第%d行:",i+1);
		for(j = 0; j < b; j++){
			scanf("%d",&la[i][j]);
		}
	}
	
	printf("請輸入一個4行3列矩陣的值。");
	
	for(i = 0; i < b; i++){
		printf("第%d行:",i+1);
		for(j = 0; j < a; j++){
			scanf("%d",&lb[i][j]);
		}
	}

	for(i = 0; i < a; i++){
		printf("第%d行:",i+1);
		for(j = 0; j < b; j++){
			printf("%d ",la[i][j]*lb[j][i]);
		}
	}
	
	return 0;
 } 

練習5-11

/*---輸入6名學生2門課程(語文,數學)的分數,顯示各門課程的
總分和平均分,以及各個學生的總分和平均分。---*/

#include <stdio.h>

#define stu 6
#define lesson 2 

int main (void)
{
	int a, b;
	
	double la[stu][lesson], sum0, sum1 = 0, sum2 = 0;
	//sum0為各學生總成績,sum1為語文總成績, sum2為數學總成績。 
	
	for(a = 0; a < stu; a++){
		sum0 = 0;
		for(b = 0; b < lesson; b++){
			do{
				printf("請輸入第%d名學生第%d門成績。",a+1,b+1);
				scanf("%lf",&la[a][b]);
				if (b == 0) 
					sum1+=la[a][b];
				else
					sum2+=la[a][b];
				if(la[a][b] > 100 || la[a][b] < 0){
					printf("您輸入的值過大,請重新輸入。");
				}
			} while (la[a][b] > 100 || la[a][b] < 0);
			
			sum0+=la[a][b];
	}
			printf("第%d名學生的總分為%f,平均分為%f\n",a+1,sum0,sum0/lesson);
}

	printf("語文成績的總分為%f,平均分為%f,數學成績的總分為%f,平均分為%f\n",sum1,sum1/stu,sum2,sum2/stu);
	 
	return 0;
 }

練習5-12

/*
	兩次考試的分數儲存在三維陣列中。 
*/

#include <stdio.h>

int main(void)
{
	int i, j, k;
	int tensu[4][2][3] = { { {91, 63, 78},{97, 67, 82} }, { {67, 72, 46},{73, 43, 46} }, { {89, 34, 53},{97, 56, 21} }, { {32, 54, 34},{85, 46, 35} } };

	/* 輸出三維陣列 */
	for (i = 0; i < 4; i++) {							
		for (j = 0; j < 2; j++)	
			for (k = 0; k < 3; k++)						
				printf("%d ",tensu[i][j][k]);
		printf("\n");
	printf("\n");
	}


	return 0;
}

注意事項:

                C語言不支援可變引數。n未輸入之前是一個隨機值,一般都很大。那麼int v[n+1]就可能是一個很大的陣列,可能會導致棧溢位,再加上idx[n]更可能會導致棧溢位。