數組與函數的綜合應用
- 基礎回顧
-
-
- 1.數組基礎知識回顧
- 2.函數基礎知識回顧
-
- 數組與函數綜合
-
-
- 1.初步實作
- 2.問題引入與解決
-
- 綜合應用典例
基礎回顧
1.數組基礎知識回顧
int array[10]; //無初始化的數組,僅僅申請了10個整型數的記憶體,最好初始化:int array[10]={0};
int array2[3]={1,2,3}; //有初始化的數組,完整初始化,數組申請了三個整型數的記憶體,并指派1,2,3
int array3[10]={1,2,3}; //有初始化的數組,但不完整,數組申請了100個整型的記憶體空間
//但隻指派三個數1 2 3,放在數組前三個位置
int n;
n=10;
int array4[n]; //實際可使用,但教材、考試中認為非法;
//數組通過下标來引用某個元素,從0開始
//數組的中括号[]隻有在定時時才表示數組大小,其餘任何情況,都表示用下标來通路數組
printf("array2 的第一個元素是:%d\n",array2[0]);
//通過循環周遊數組
for(int i=0;i<3;i++){
printf("array2中第%d個數:%d\n",i+1,array2[i]);
}
2.函數基礎知識回顧
//自定義函數的結構
/*
函數傳回類型 函數名(形參1;形參2;......形參n)
{
函數體
}
*/
常見自定義函數的幾種類型
void begin() //無參數、無傳回類型
{
printf("****start****\n");
}
void PingFang(int i) //有參數、無傳回類型
{
printf("%d的平方為:%d\n",i,i*i);
}
//單片機軟體延時函數用了以上兩種方法
int add(int i,int j)
{
int sum,y;
y=2*i+j;
sum=i+j;
return i+j; //把函數執行的結果傳回給調用者
}
//如果調用的函數有參數,必須傳參!!
//調用的時候。傳遞的參數叫實際參數,對格式沒有要求,對資料類型嚴格要求
//1.形式參數,作用域僅限于該函數
//2.形式參數,也是一個變量,局部變量,有自己的記憶體空間
/*
空間生存期和死亡期
何時申請了空間
當該函數被調用的時候,才申請了該記憶體的空間,才有了這個變量
同時空間内的資料被指派變成實際參數的值,函數調用把實際參數的值拷貝一份給形式參數
何時釋放了該空間
函數執行結束後,該空間由内部管理單元自動回收(釋放)
*/
int main()
{
int i=10,j=5,sum;
sum=add(i,j);
printf("%d\n",sum);
return 0;
}
//看懂一個函數
//1.參數怎麼傳+參數的類型、參數的個數
//2.函數的傳回值 傳回值的類型
//3.功能 函數名
數組與函數綜合
1.初步實作
#include<stdio.h>
void fun(int data[3])
{
int i;
for(i=0;i<3;i++){
printf("%d\n",data[i]);
}
}
int main()
{
int score[3]={90,88,93};
//數組和函數結合,數組名當做實際參數
fun(score);
}
2.問題引入與解決
問題提出1:如何計算數組中元素的個數
解:個數=數組總大小/一個類型的大小
//有何異同
int a[3]; //一個int型占用空間4個位元組,三個占用空間12個位元組
char b[3]; //一個char型占用空間1個位元組,三個占用空間3個位元組
//同:數組元素個數為3
//異:數組類型不同,數組記憶體大小不同
//計算所占記憶體大小
printf("數組a的大小:%d\n",sizeof(a));
printf("int 型所占記憶體大小:%d\n",sizeof(int));
//問題提出1:如何計算數組中元素的個數
//解:個數=數組總大小/一個類型的大小
printf("數組a的個數為:%d",sizeof(a)/sizeof(a[0])); //sizeof(a)/sizeof(int)
問題提出2:數組在函數中的大小
void fun(int data[3])
{
printf("in fun 數組data的個數為:%d\n",sizeof(data)/sizeof(int));
for(i=0;i<3;i++){
printf("### %d\n",data[i]);
}
}
printf("in fun data的大小為:%d\n",sizeof(data));
printf("in fun int的大小為:%d\n",sizeof(int));

小結:
形參中,雖然寫的是一個數組的樣子,但其中的數字是無效的!!!
不管中括号中寫多少,都不能代表形參的數組有多大,甚至可以省略
這裡的中括号的作用僅僅用來表示,該參數是一個(位址!)
問題提出3:形參大小不變,i邊界很難控制
解決方法:引入第二個參數:n(表示數組大小)
//數組傳參列印通用函數
//第一個參數是數組的首位址,第二個參數是數組的個數
void fun(int data[10],int n)
{
int i;
for(i=0;i<n;i++){
printf("%d\n",data[i]);
}
}
調用:fun(score,sizeof(score)/sizeof(score[0]));
fun(&score[0],sizeof(score)/sizeof(score[0]));
綜合應用典例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//自定義函數的聲明
void InitArray(int score[] , int size);
int GetMax(int score[] , int size);
int GetMin(int score[] , int size);
float GetAve(int score[] , int size);
void GetRes(int num1 , int num2 , float num3);
int main()
{
int score[5],i,max,min,total=0;
float ave;
int len=sizeof(score)/sizeof(score[0]);
//1.初始化數組
InitArray(score,len);
//找到最高分
max=GetMax(score,len);
//找到最低分
min=GetMin(score,len);
//算出平均分
ave=GetAve(score,len);
//輸出結果
GetRes(max,min,ave);
system("pause");
return 0;
}
void InitArray(int score[] , int size)
{
int i;
printf("***************學生成績分析*************\n");
printf("******成績輸入********\n");
for(i=0;i<size;i++)
{
printf("請輸入第%d個學生的成績:",i+1);
scanf("%d",&score[i]);
if(score[i]>100 || score[i]<0)
{
printf("你輸的是成績嗎??!\n不給你用了\n");
system("pause");
exit(0);
}
}
printf("******成績輸出********\n");
for(i=0;i<size;i++)
printf("第%d個學生的成績為:%d\n",i+1,score[i]);
}
int GetMax(int score[] , int size)
{
int max,i;
max=score[0];
for(i=0;i<size;i++)
{
if(score[i]>max)
max=score[i];
}
return max;
}
int GetMin(int score[] , int size)
{
int min,i;
min=score[0];
for(i=0;i<size;i++)
{
if(score[i]<min)
min=score[i];
}
return min;
}
float GetAve(int score[] , int size)
{
int total,i;
float ave;
total=0;
for(i=0;i<size;i++)
{
total+=score[i];
}
ave=(float)total/size;
return ave;
}
void GetRes(int num1 , int num2 , float num3)
{
printf("最高分:%d\n",num1);
printf("最低分:%d\n",num2);
printf("平均分:%.2f\n",num3);
}
運作環境:DEV-C++ 5.11
運作結果: