以下的细节是个人在完成几道编程题时发现:
此次分享依然分成两部分:
- 代码展示
- 代码分析
示例一:
关于二维数组6门课,求其学号对应学生的平均成绩;
代码展示:
#include<stdio.h>
#define NOT_FIND -1
#define TOTAL_STU 8
float aver(int (*pStu)[7], int stuNo);
int main(void)
{
int student[TOTAL_STU][7];
float averScore;
int i, j, stuNumber;
printf("Input the %d student's number and score: \n", TOTAL_STU);
for (i = 0; i < TOTAL_STU; i++)
{
for (j = 0; j < 7; j++)
{
scanf("%d", &student[i][j]);
}
}
printf("Input a student's number to compute: ");
scanf("%d", &stuNumber);
averScore = aver(student, stuNumber);
printf("Output:");
if (NOT_FIND == averScore)
{
printf("\nstudent of No.%d not Find!\n", stuNumber);
}
else
{
printf("\nThe No.%d student's average is %.2f\n", stuNumber, averScore);
}
return 0;
}
float aver(int pStu[TOTAL_STU][7], int stuNo)
{
int i, j;
double sum = 0;
for (i = 0; i < TOTAL_STU; i++)
{
if (pStu[i][0] == stuNo)
{
for (j = 1; j < 7; j++)
{
sum += pStu[i][j];
}
return (float)(sum/6);
}
}
return NOT_FIND;
}
代码分析:
#define NOT_FIND -1
#define TOTAL_STU 8
此部分是宏定义。
*float aver(int (pStu)[7], int stuNo);子函这部分的功能是检验输入的学号是否存在,若存在则对其成绩求其平均值。
这道编程题不算难,但不好做到完全。
原因:
- 定义的数组名 及其其他变量名过于繁琐易敲错。
- 算的得值,应记得(float)(sum/6)强制转换,且定义变量时注意数据类型为double(每次都定义float,这不是不行只是欠妥)此处运用括号加数据类型进行强制转换会很省事。
示例二:
求任意的一个m×m矩阵的主副对角线上元素之和(注:每个元素只计一次)
代码展示:
#include <stdio.h>
int main(void)
{
int i, j, m, sum = 0;
int array[20][20];
printf("Please input m:");
scanf("%d", &m);
printf("\nPlease input array:\n");
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &array[i][j]);
}
}
for (i = 0; i < m; i++)
{
sum = sum + array[i][i] + array[i][m - i - 1];
}
if (m % 2 == 1)
{
sum = sum - array[m / 2][m /2];
}
printf("Output:\nsum=%d\n", sum);
return 0;
}
代码分析
此段代码的核心在这部分:
for (i = 0; i < m; i++)
{
sum = sum + array[i][i] + array[i][m - i - 1];
}
if (m % 2 == 1)
{
sum = sum - array[m / 2][m /2];
}
printf("Output:\nsum=%d\n", sum);
这部分做主副对角线元素之和的计算;
其中:
for (i = 0; i < m; i++)
{
sum = sum + array[i][i] + array[i][m - i - 1];
}
array[i][i]是对主对角线元素之和的计算,这个算法不难想,
其次对于副对角线元素之和的计算第一次拿到的时候没想出来。
其实这将输入的个数总和m与和行数i联系起来规律就可发现。
不难发现,对于此类找规律的算法,除了关注行列关系,更应注意数组是从0开始的脚标,其次就是想到起初规定的是输入多少个数,也就是m。
此外对于现阶段学习的考试别太紧张,幸好这次凭实力过了。