菜鸟修炼C语言小设计之——成绩统计
余从开始决定自学嵌入式到现在已经一年了,回顾一路走来学了linux系统管理、ARM编程、系统移植、驱动一系列课程,但是现在仍然感觉动手写代码的能力差之甚远,痛定思痛,于是重新开始修炼C语言,以求达到深入理解C语言并能写出高质量C代码的层次。我相信很多同学肯定和我一样,虽然了解C语言的基本语法,能写单片机和ARM程序或者解一些简单的题目,但都只停留在了解阶段,对C语言的精髓及其重点知之甚少。我决定一些编写一些C语言的小设计来改变这个状态,我会陆续更新我的学习轨迹,希望大家共同学习,高手请无视。这些设计将由浅入深的应用到C语言的各方面重点知识。
这个小设计主要是为了理解数组和指针的用法牵涉的重点有:
指针数组;
指针的下标引用法;
动态内存的分配及其释放。
数组和指针是C语言的重要概念,数组与指针之间的关系又容易混淆。另外,字符串数组的使用方法与普通的数值型数组的用法也有所不同,它们与指针之间的关系也较特殊。
1.1 设计题目
本课程设计主要练习数组和指针的使用。
假定给定班级各科考试平均成绩的原始资料如下:
数学:75
物理:80
外语:83
政治:85
体育:86
人数:30
要求统计出全班学期总平均成绩以及得分最低的科目和该科目的成绩。要求的输出结果如下:
全班各科平均成绩如下:
数学:75
物理:80
外语:83
政治:85
体育:86
则统计结果如下:
人数:30
平均成绩:81
最低分科目的成绩:75
最低分数的科目:数学
1.2 设计要求
对存放原始数据的要求如下:
(1)使用整型数组a存放数学、物理、外语、政治、体育、人数、平均成绩、最低分数科目的成绩。
(2)使用字符串数组name存放数学、物理、外语、政治、体育、最低分数的科目。
(3)使用字符串数组MeanLow存放人数、平均成绩、最低分数科目的成绩、最低分数的科目。
实现本设计功能的方法很多,在此给出3种难易程度不同的要求,以便加深对数组和指针知识的理解。
1、使用数组实现
使用数组和指针数组实现。
2、使用分配的内存实现
要求将数组a的内容存入到分配的内存中,使用指针实现对内存内容的存取和计算。
3、将数组内容全部存入内存
为字符分配内存,并将字符数组的内容存入所分配的内存中,使用指针来实现。
2. 设计代码
#include <stdio.h> #define SUB_NUM 5 void init_name(char *name[]); void init_mean_low(char *mean_low[]); void input_messge(char *name[], char *mean_low[], int *a); void analysis_message(int *a, char *name[]); void print_message(char *name[], char *mean_low[], int *a); void recycle_memory(char *name[], char *mean_low[], int *a); int main(int argc, char *argv[]) { int *a; char *name[SUB_NUM+1]; char *mean_low[3]; /*数组a存放数学、物理、外语、政治、体育、人数、平均成绩、最低分数科目的成绩*/ a=(int *)malloc((8*sizeof(int))); memset(a, 0, 8*sizeof(int)); init_name(name); init_mean_low(mean_low); input_messge(name, mean_low, a); analysis_message(a, name); print_message(name, mean_low, a); recycle_memory(name, mean_low, a); getch(); return 0; } void init_name(char *name[]) { name[0] = "数学"; name[1] = "物理"; name[2] = "外语"; name[3] = "政治"; name[4] = "体育"; name[5] = "科目"; } void init_mean_low(char *mean_low[]) { mean_low[0]="人数"; mean_low[1]="平均成绩"; mean_low[2]="最低分数科目的成绩"; mean_low[3]="最低分数低的科目"; } void input_messge(char *name[], char *mean_low[], int *a) { int i; printf("请输入你的各科目成绩:\n"); for(i=0; i<SUB_NUM; i++){ printf("%s:", name[i]); scanf("%d", a+i); while((a[i]>100) || (a[i]<0)){ printf("输入错误,请重新输入\n%s:", name[i]); scanf("%d", a+i); } } printf("请输入你班的人数:"); scanf("%d", a+SUB_NUM); } void analysis_message(int *a, char *name[]) { int aver,i, sum=0, sm=200, j=0; for(i=0; i<SUB_NUM; i++){ sum += a[i]; if(a[i] < sm){ sm = a[i]; j = i; } } a[SUB_NUM+1] = sum/SUB_NUM; a[SUB_NUM+2] = sm; name[SUB_NUM] = name[j]; } void print_message(char *name[], char *mean_low[], int *a) { int i; printf("分析结果为:\n"); for(i=0; i<SUB_NUM; i++){ printf("%s:%d\n",name[i], a[i]); } printf("人数:%d\n", a[SUB_NUM]); printf("平均成绩:%d\n", a[SUB_NUM+1]); printf("最低科目成绩:%d\n", a[SUB_NUM+2]); printf("最低科目:%s\n", name[SUB_NUM]); } void recycle_memory(char *name[], char *mean_low[], int *a) { int i; free(a); a=NULL; for(i=0; i<SUB_NUM+1; i++){ free(name[i]); name[i] = NULL; } for(i=0; i<4; i++){ free(mean_low[i]); mean_low[i] = NULL; } }