余從開始決定自學嵌入式到現在已經一年了,回顧一路走來學了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;
}
}
摘自 K-Style的技術宅