本文目錄一覽:
c語言中用函數做參數怎麼用
數組元素就是下標變數,它與普通變數並無區別。 因此它作為函數實參使用與普通變數是完全相同的,在發生函數調用時,把作為實參的數組元素的值傳送給形參,實現單向的值傳送。【例5-4】說明了這種情況。
【例8-7】判別一個整數數組中各元素的值,若大於0 則輸出該值,若小於等於0則輸出0值。編程如下:#include stdio.hvoid nzp(int v){ if(v0) printf(“%d “,v); else printf(“%d “,0);}int main(void){ int a[5],i; printf(“input 5 numbers\n”); for(i=0;i5;i++){ scanf(“%d”,a[i]); nzp(a[i]); } return 0;}
本程序中首先定義一個無返回值函數nzp,並說明其形參v為整型變數。在函數體中根據v值輸出相應的結果。在main函數中用一個for語句輸入數組各元素,每輸入一個就以該元素作實參調用一次nzp函數,即把a[i]的值傳送給形參v,供nzp函數使用。
數組名作為函數參數
用數組名作函數參數與用數組元素作實參有幾點不同。
1) 用數組元素作實參時,只要數組類型和函數的形參變數的類型一致,那麼作為下標變數的數組元素的類型也和函數形參變數的類型是一致的。因此,並不要求函數的形參也是下標變數。換句話說,對數組元素的處理是按普通變數對待的。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。當形參和實參二者不一致時,即會發生錯誤。
2) 在普通變數或下標變數作函數參數時,形參變數和實參變數是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送是把實參變數的值賦予形參變數。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組並不存在,編譯系統不為形參數組分配內存。那麼,數據的傳送是如何實現的呢?在我們曾介紹過,數組名就是數組的首地址。因此在數組名作函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之後,也就等於有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。
上圖說明了這種情形。圖中設a為實參數組,類型為整型。a佔有以2000為首地址的一塊內存區。b為形參數組名。當發生函數調用時,進行地址傳送,把實參數組a的首地址傳送給形參數組名b,於是b也取得該地址2000。於是a,b兩數組共同佔有以2000為首地址的一段連續內存單元。從圖中還可以看出a和b下標相同的元素實際上也占相同的兩個內存單元(整型數組每個元素佔二位元組)。例如a[0]和b[0]都佔用2000和2001單元,當然a[0]等於b[0]。類推則有a[i]等於b[i]。
【例8-8】數組a中存放了一個學生5門課程的成績,求平均成績。#include stdio.hfloat aver(float a[5]){ int i; float av,s=a[0]; for(i=1;i5;i++) s=s+a[i]; av=s/5; return av;}int main(void){ float sco[5],av; int i; printf(“\ninput 5 scores:\n”); for(i=0;i5;i++) scanf(“%f”,sco[i]); av=aver(sco); printf(“average score is %5.2f”,av); return 0;}
本程序首先定義了一個實型函數aver,有一個形參為實型數組a,長度為5。在函數aver中,把各元素值相加求出平均值,返回給主函數。主函數main 中首先完成數組sco的輸入,然後以sco作為實參調用aver函數,函數返回值送av,最後輸出av值。 從運行情況可以看出,程序實現了所要求的功能。
3) 前面已經討論過,在變數作函數參數時,所進行的值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參並不變化,兩者的終值是不同的。而當用數組名作函數參數時,情況則不同。由於實際上形參和實參為同一數組,因此當形參數組發生變化時,實參數組也隨之變化。當然這種情況不能理解為發生了「雙向」的值傳遞。但從實際情況來看,調用函數之後實參數組的值將由於形參數組值的變化而變化。為了說明這種情況,把【例5.4】改為【例5.6】的形式。
【例8-9】題目同【例8.7】。改用數組名作函數參數。#include stdio.hvoid nzp(int a[5]){ int i; printf(“\nvalues of array a are:\n”); for(i=0;i5;i++){ if(a[i]0) a[i]=0; printf(“%d “,a[i]); }}int main(void){ int b[5],i; printf(“\ninput 5 numbers:\n”); for(i=0;i5;i++) scanf(“%d”,b[i]); printf(“initial values of array b are:\n”); for(i=0;i5;i++) printf(“%d “,b[i]); nzp(b); printf(“\nlast values of array b are:\n”); for(i=0;i5;i++) printf(“%d “,b[i]); return 0;}
本程序中函數nzp的形參為整數組a,長度為5。主函數中實參數組b也為整型,長度也為5。在主函數中首先輸入數組b的值,然後輸出數組b的初始值。然後以數組名b為實參調用nzp函數。在nzp中,按要求把負值單元清0,並輸出形參數組a的值。 返回主函數之後,再次輸出數組b的值。從運行結果可以看出,數組b的初值和終值是不同的,數組b的終值和數組a是相同的。這說明實參形參為同一數組,它們的值同時得以改變。
用數組名作為函數參數時還應注意以下幾點:
①形參數組和實參數組的類型必須一致,否則將引起錯誤。
②形參數組和實參數組的長度可以不相同,因為在調用時,只傳送首地址而不檢查形參數組的長度。當形參數組的長度與實參數組不一致時,雖不至於出現語法錯誤(編譯能通過),但程序執行結果將與實際不符,這是應予以注意的。
【例8.10】如把例8.9修改如下:#include stdio.hvoid nzp(int a[8]){ int i; printf(“\nvalues of array aare:\n”); for(i=0;i8;i++){ if(a[i]0)a[i]=0; printf(“%d “,a[i]); }}int main(void){ int b[5],i; printf(“\ninput 5 numbers:\n”); for(i=0;i5;i++) scanf(“%d”,b[i]); printf(“initial values of array b are:\n”); for(i=0;i5;i++) printf(“%d “,b[i]); nzp(b); printf(“\nlast values of array b are:\n”); for(i=0;i5;i++) printf(“%d “,b[i]); return 0;}
本程序與【例8.9】程序比,nzp函數的形參數組長度改為8,函數體中,for語句的循環條件也改為i8。因此,形參數組a和實參數組b的長度不一致。編譯能夠通過,但從結果看,數組a的元素a[5]、a[6]、a[7]顯然是無意義的。
③在函數形參表中,允許不給出形參數組的長度,或用一個變數來表示數組元素的個數。例如,可以寫為:
void nzp(int a[])
或寫為
void nzp( int a[], int n )
其中形參數組a沒有給出長度,而由n值動態地表示數組的長度。n的值由主調函數的實參進行傳送。由此,【例8-10】又可改為【例8-11】的形式。
【例8-11】複製純文本新窗口
#include stdio.hvoid nzp(int a[],int n){ int i; printf(“\nvalues of array a are:\n”); for(i=0;in;i++){ if(a[i]0) a[i]=0; printf(“%d “,a[i]); }}int main(void){ int b[5],i; printf(“\ninput 5 numbers:\n”); for(i=0;i5;i++) scanf(“%d”,b[i]); printf(“initial values of array b are:\n”); for(i=0;i5;i++) printf(“%d “,b[i]); nzp(b,5); printf(“\nlast values of array b are:\n”); for(i=0;i5;i++) printf(“%d “,b[i]); return 0;}
關於c語言文件查找
//讀數
#includestdio.h
#includestdlib.h
#define N 20
struct stud
{
int num;
int sco1;
int sco2;
int sco3;
}stu[N];
void main()
{
FILE *fp;
double ave;
int i=0,x;
if((fp=fopen(“STUDENT.DAT”,”r”))==NULL)
{
printf(“無法打開該文件!\n”);
exit(0);
}
else
printf(“文件打開成功!\n”);
for(i=0;iN;i++){
fread(stu[i],sizeof(struct stud),1,fp);
i++;
}
fclose(fp);
printf(“請輸入要查找的學生學號:\n”);
scanf(“%d”,x);
for(i=0;iN;i++)
{
if(x==stu[i].num)
{
ave=(double)(stu[i].sco1+stu[i].sco2+stu[i].sco3)/3.0;
break;
}
else
i++;
}
if(i==10||ave0||ave100)
printf(“查無該生成績!\n”);
else
printf(“該生平均成績為:%.2lf\n”,ave);
}
//存數
#includestdio.h
#includestdlib.h
#define N 20
struct stud
{
int num;
int sco1;
int sco2;
int sco3;
}stu[N];
void main()
{
FILE *fp;
int i,n;
float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0;
if((fp=fopen(“STUDENT.DAT”,”wb”))==NULL)
{
printf(“無法打開該文件!\n”);
exit(0);
}
else
printf(“文件打開成功!\n”);
printf(“請輸入要輸入的學生數:\n”);
scanf(“%d”,n);
for(i=0;in;i++)
{
printf(“請輸入學生學號,數學成績,政治成績和英語成績:\n”);
scanf(“%d%d%d%d/n”,stu[i].num,stu[i].sco1,stu[i].sco2,stu[i].sco3);
sum1+=stu[i].sco1;
sum2+=stu[i].sco2;
sum3+=stu[i].sco3;
if(fwrite(stu[i],sizeof(struct stud),1,fp)!=1)
printf(“file write error\n”);
}
fclose(fp);
ave1=sum1/n;
ave2=sum2/n;
ave3=sum3/n;
printf(“————————————\n”);
printf(“NUM Math Prolitics English\n”);
for(i=0;in;i++)
{
printf(“%d%7d%10d%14d\n”,stu[i].num,stu[i].sco1,stu[i].sco2,stu[i].sco3);
}
printf(“————————————\n”);
printf(“對應三門成績均分為:\n”);
printf(” %7.2f%10.2f%14.2f\n”,ave1,ave2,ave3);
}
C語言中sco是什麼意思?求解,有分哦~~~
你這sco是定義的一個數組
同下
int array[10];
while(i10)
{
scanf(“%d”,array[i]);
}
C語言編寫的程序:十個學生的五門成績的各科平均值
#include
/*定義結構體*/
struct
student
{
int
a;
int
b;
int
c;
float
ave;
};
int
main()
{
struct
student
sco[5];
printf(“輸入5個學生的3們成績:\n”);
for(i=0;i5;i++)
{
scanf(“%d%d%d”,sco[i].a,sco[i].b,sco[i].c);
sco[i].ave=(float)(sco[i].a+sco[i].b+sco[i].c)/3;
}
printf(“5名學生平均成績分別為:\n”);
for(i=0;i5;i++)
{
printf(“%.2f\n”,sco[i].ave);
}
return
0;
}
————————————————
如果以上出現「%」符號,那是為何防止系統誤識我把半形符號寫成全形符號了,注意改回來。
————————————————
親愛的lz,如果我的回答能夠幫你解決問題,或是對你有幫助,或是對你今後的發展造成積極的影響,那麼請您採納我的回答吧,同時更迫切地希望您能夠在採納的時候幫我打上「能解決」和「原創」,然後把兩行的五顆五角星分別點亮,點亮五角星就是點亮你我的希望。
我沖11級了,需要很多綜合聲望,感謝您的幫助,衷心祝願您快樂每一天~
c語言編程
第一題核心是排序,我先用冒泡排序來實現吧。
#include stdio.h
#define LEN 30 /*學生人數*/
void bubbleSort(int arr[], int len) { /*由大到小冒泡排序*/
int i, j, temp;
for (i = 0; i len – 1; i++)
for (j = 0; j len – 1 – i; j++)
if (arr[j] arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
int main()
{
int i;
int sco[LEN] = {70,99,87,65,59,98,85,73,65,59,62,70,80,92,54,35,90,87,37,66,80,33,45,62,68,48,76,56,78,90};
float sum=0,aver=0;
printf (“原始30名學生成績:\n”);
for (i=0;iLEN;i++) {
printf (“%d\t”,sco[i]);
}
printf (“======================================================\n\n”);
bubbleSort (sco,LEN);
printf (“30名學生成績由高到低排序:\n”);
for (i=0;iLEN;i++) {
printf (“%d\t”,sco[i]);
sum += sco[i];
}
printf (“======================================================\n\n”);
aver = sum/LEN;
printf (“高於平均分%.2f的學生成績:\n”,aver);
for (i=0;iLEN;i++) {
if (sco[i]aver) {
printf (“%d\t”,sco[i]);
}
}
printf (“\n”);
return 0;
}
運行結果
第二題沒太看懂,具體要求是啥,感覺就是考察函數調用,我先隨便寫個簡答的吧。
#include stdio.h
int x (int y) { /*輸入y,返回y平方*/
return y*y;
}
int main()
{
int y;
printf (“請輸入y:”);
scanf (“%d”,y);
printf (“\n”);
y = x(y);
printf (“調用x函數求y平方:%d\n”,y);
printf (“\n”);
return 0;
}
運行結果
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/256461.html