C语言:编程中的细节

以下的细节是个人在完成几道编程题时发现:

此次分享依然分成两部分:

  1. 代码展示
  2. 代码分析

示例一:

关于二维数组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);子函这部分的功能是检验输入的学号是否存在,若存在则对其成绩求其平均值。

这道编程题不算难,但不好做到完全。
原因:

  1. 定义的数组名 及其其他变量名过于繁琐易敲错。
  2. 算的得值,应记得(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。

此外对于现阶段学习的考试别太紧张,幸好这次凭实力过了。

猜你喜欢

转载自blog.csdn.net/yooppa/article/details/112371461