《明解C語言》筆記及課後習題答案 【第五章】
阿新 • • 發佈:2019-02-17
練習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]更可能會導致棧溢位。