第13周練兵區編程題
1. 尋找最高分成績的學生
題目內容:
下面程序的功能是用動態數組編程輸入任意m個班學生(每班n個學生)的某門課的成績,計算最高分,並指出具有該最高分成績的學生是第幾個班的第幾個學生。其中,m和n的值由用戶從鍵盤任意輸入(不限定m和n的上限值)。
#include <stdio.h>
#include <stdlib.h>
void InputScore(int *p, int m, int n);
int FindMax(int *p, int m, int n, int *pRow, int *pCol);
int main()
{
int *pScore, m, n, maxScore, row, col;
printf("Input array size m,n:\n");
scanf("%d,%d", &m, &n);
pScore = (int*)malloc(m*n*sizeof(int)); /* 申請動態內存 */
if (pScore == NULL)
{
printf("No enough memory!\n");
exit(0);
}
InputScore(pScore, m, n);
maxScore = FindMax(pScore,m,n,&row,&col);
printf("maxScore = %d, class = %d, number = %d\n", maxScore, row+1, col+1);
free(pScore); /* 釋放動態內存 */
return 0;
}
/* 函數功能:輸入m行n列二維數組的值 */
void InputScore(int *p, int m, int n)
{
int i, j;
printf("Input %d*%d array:\n", m, n);
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
scanf("%d",p + i*n + j);
}
}
}
/* 函數功能:計算任意m行n列二維數組中元素的最大值,並指出其所在行列下標值 */
int FindMax(int *p, int m, int n, int *pRow, int *pCol)
{
int i, j, max = p[0];
*pRow = 0;
*pCol = 0;
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
if (p[i*n+j] > max)
{
max = p[i*n+j];
*pRow = i; /*記錄行下標*/
*pCol = j; /*記錄列下標*/
}
}
}
return max;
}
2. 程序改錯
題目內容:
下面程序的功能是輸入m個學生(最多爲30人)n門課程(最多爲5門)的成績,然後計算並打印每個學生各門課的總分和平均分。其中,m和n的值由用戶從鍵盤輸入。
#include <stdio.h>
#define STUD 30 /* 最多可能的學生人數 */
#define COURSE 5 /* 最多可能的考試科目數 */
void Total(int *pScore, int sum[], float aver[], int m, int n);
void Print(int *pScore, int sum[], float aver[], int m, int n);
int main()
{
int i, j, m, n, score[STUD][COURSE], sum[STUD];
float aver[STUD];
printf("How many students?\n");
scanf("%d", &m);
printf("How many courses?\n");
scanf("%d", &n);
printf("Input scores:\n");
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
scanf("%d", &score[i][j]);
}
}
Total(*score, sum, aver, m, n);
Print(*score, sum, aver, m, n);
return 0;
}
void Total(int *pScore, int sum[], float aver[], int m, int n)
{
int i, j;
for (i=0; i<m; i++)
{
sum[i] = 0;
for (j=0; j<n; j++)
{
sum[i] = sum[i] + pScore[i*COURSE+j];
}
aver[i] = (float) sum[i] / n;
}
}
void Print(int *pScore, int sum[], float aver[], int m, int n)
{
int i, j;
printf("Result:\n");
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("%4d\t", pScore[i*COURSE+j]);
}
printf("%5d\t%6.1f\n", sum[i], aver[i]);
}
}
4. 矩陣轉置
題目內容:
下面程序的功能是用二維數組的列指針作爲函數實參,計算並輸出m×n階矩陣的轉置矩陣。其中,m和n的值由用戶從鍵盤輸入。已知m和n的值都不超過10。程序的運行結果如下所示:
#include <stdio.h>
#define M 10
#define N 10
void Transpose(int *a, int *at, int m, int n);
void InputMatrix(int *a, int m, int n);
void PrintMatrix(int *at, int n, int m);
int main()
{
int s[M][N], st[N][M], m, n;
printf("Input m, n:\n");
scanf("%d,%d", &m, &n);
InputMatrix(*s, m, n);
Transpose(*s, *st, m, n);
printf("The transposed matrix is:\n");
PrintMatrix(*st, n, m);
return 0;
}
/* 函數功能:計算m*n矩陣a的轉置矩陣at */
void Transpose(int *a, int *at, int m, int n)
{
int i, j;
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
at[j*M+i] = a[i*N+j];
}
}
}
/* 函數功能:輸入m*n矩陣a的值 */
void InputMatrix(int *a, int m, int n)
{
int i, j;
printf("Input %d*%d matrix:\n", m, n);
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
scanf("%d", &a[i*N+j]);
}
}
}
/* 函數功能:輸出n*m矩陣at的值 */
void PrintMatrix(int *at, int n, int m)
{
int i, j;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
printf("%-5d", at[i*M+j]);
}
printf("\n");
}
}
5. 在升序排序的數組中插入一個元素
題目內容:
用函數編程實現在一個按升序排序的數組中查找x應插入的位置,將x插入數組中,使數組元素仍按升序排列。
#include<stdio.h>
int main()
{
int n,x;
int i, j = 0;
int a[200] = {0};
printf("Input array size:\n");
scanf("%d",&n);
printf("Input array:\n");
for(i = 0; i < n; i++)
scanf("%d",&a[i]);
printf("Input x:\n");
scanf("%d",&x);
while(a[j] < x)
j++;
for(i = n - 1;i >= j; i--)
{
a[i + 1] = a[i];
}
a[j] = x;
printf("After insert %d:\n",x);
for(i = 0; i <= n; i++)
printf("%4d",a[i]);
return 0;
}
6. 計算平均數、中位數和衆數
題目內容:
在調查數據分析(Survey data analysis)中經常需要計算平均數、中位數和衆數。用函數編程計算40個輸入數據(是取值1—10之間的任意整數)的平均數(Mean)、中位數(Median)和衆數(Mode)。中位數指的是排列在數組中間的數。衆數是數組中出現次數最多的那個數(不考慮兩個或兩個以上的輸入數據出現次數相同的情況)。
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* a,const void* b)
{
const int *x = (const int*)a;
const int *y = (const int*)b;
if(*x -*y == 0)
return 0;
else if(*x - *y > 0)
return 1;
else
return -1;
}
int Mean(int a[], int n);
int Median(int a[], int n);
int Mode(int a[], int n);
int main()
{
int stu[40] = {0};
int mean,med,mode;
printf("Input the feedbacks of 40 students:\n");
for(int i = 0; i < 40; i++)
scanf("%d",&stu[i]);
mean = Mean(stu,40);
med = Median(stu,40);
mode = Mode(stu,40);
printf("Mean value=%d\n",mean);
printf("Median value=%d\n",med);
printf("Mode value=%d\n",mode);
return 0;
}
int Mean(int a[], int n)
{
int i,sum = 0;
for(i = 0; i < n; i++)
sum += a[i];
return sum / n;
}
int Median(int a[], int n)
{
qsort(a,n,sizeof(int),cmp);
return a[n/2];
}
int Mode(int a[], int n)
{
int num[11] = {0};
int max = 0;
int pos = 1;
for(int i = 0; i < n; i++)
num[a[i]]++;
for(int i = 1; i <= 10; i++)
{
if(num[i] > max)
{
max = num[i];
pos = i;
}
}
return pos;
}