第一篇:C語(yǔ)言結(jié)構(gòu)體與指針實(shí)驗(yàn)
實(shí)驗(yàn)一 C語(yǔ)言結(jié)構(gòu)體與指針
一、實(shí)驗(yàn)內(nèi)容
1)學(xué)生信息的顯示,具體要求如下: ??定義一個(gè)結(jié)構(gòu)體描述學(xué)生信息(學(xué)號(hào),姓名,性別,年齡,住址); ??設(shè)計(jì)一個(gè)函數(shù),用于顯示單個(gè)學(xué)生信息,函數(shù)的參數(shù)為前面定義的結(jié)構(gòu)體類(lèi)型; ??設(shè)計(jì)一個(gè)主函數(shù),在主函數(shù)中輸入學(xué)生的信息,并調(diào)用前面定義的函數(shù)進(jìn)行顯示(學(xué)生人數(shù)不少于5人)。
2)輸入若干個(gè)整數(shù)作為數(shù)組元素值,然后按輸入時(shí)順序的就地逆置排序,最后打印出逆置后的元素值。要求用指針和動(dòng)態(tài)內(nèi)存分配方法實(shí)現(xiàn)。例如 輸入:10 2 30 4 5,逆置后顯示為:5 4 30 2 10。
二、代碼
1)#include
struct Student { int studentID;char name[20];char sex[2];//m=male f=female int age;char address[50];};
void showTheDetail(struct Student s){ printf(“%dn”,s.studentID);printf(“%sn”,s.name);printf(“%sn”,s.sex);printf(“%dn”,s.age);printf(“%snn”,s.address);}
void main(){ int i;struct Student student[5];for(i=0;i<5;i++){
printf(“student%dn”,i);
scanf(“%d”,&student[i].studentID);
}
scanf(“%s”,&student[i].name);scanf(“%s”,&student[i].sex);scanf(“%d”,&student[i].age);scanf(“%s”,&student[i].address);} for(i=0;i<5;i++){ showTheDetail(student[i]);} 2)#include
int temp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++)
{
j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;
}
return;}
int main(){
int n,i;printf(“please insert the amount of the numbers:n”);scanf(“%d”,&n);int array[n];printf(“please insert the numbers:n”);for(i=0;i scanf(“%d”,&array[i]);} change(array,n);for(i=0;i printf(“%d”,array[i]);} } 三、心得體會(huì) 復(fù)習(xí)了c語(yǔ)言中的數(shù)組,結(jié)構(gòu)體的知識(shí),編程中沒(méi)有出現(xiàn)問(wèn)題。 C語(yǔ)言結(jié)構(gòu)體指針變量作函數(shù)參數(shù) 在ANSI C標(biāo)準(zhǔn)中允許用結(jié)構(gòu)變量作函數(shù)參數(shù)進(jìn)行整體傳送。但是這種傳送要將全部成員逐個(gè)傳送,特別是成員為數(shù)組時(shí)將會(huì)使傳送的時(shí)間和空間開(kāi)銷(xiāo)很大,嚴(yán)重地降低了程序的效率。因此最好的辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進(jìn)行傳送。這時(shí)現(xiàn)金網(wǎng)96y.org由實(shí)參傳向形參的只是地址,從而減少了時(shí)間和空間的開(kāi)銷(xiāo)。 計(jì)算一組學(xué)生的平均成績(jī)和不及格人數(shù)。用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程。 struct stu{ int num; char *name; char sex; float score; }boy[5]={ {101,Li ping,M,45},{102,Zhang ping,M,62.5},{103,He fang,F,92.5},{104,Cheng ling,F,87},{105,Wang ming,M,58} }; main(){ struct stu *ps; void ave(struct stu *ps); ps=boy; ave(ps); } void ave(struct stu *ps){ int c=0,i; float ave,s=0; for(i=0;i5;i++,ps++){ s+=ps-score; if(ps-score60)c+=1; } printf(s=%fn,s); ave=s/5; printf(average=%fncount=%dn,ave,c); } 本程序中定義了函數(shù)ave,其形參為結(jié)構(gòu)指針變量ps。boy被定義為外部結(jié)構(gòu)數(shù)組,因此在整個(gè)源程序中有效。在main函數(shù)中定義說(shuō)明了結(jié)構(gòu)指針變量ps,并把boy的首地址賦予它,使ps指向boy數(shù)組。然后博彩娛樂(lè)棋牌q07i5.org以ps作實(shí)參調(diào)用函數(shù)ave。在函數(shù)ave中完成計(jì)算平均成績(jī)和統(tǒng)計(jì)不及格人數(shù)的工作并輸出結(jié)果。 由于本程序全部采用指針變量作運(yùn)算和處理,故速度更快,程序效率更高。 C語(yǔ)言指向結(jié)構(gòu)體數(shù)組的指針 指針變量可以指向一個(gè)結(jié)構(gòu)數(shù)組,這時(shí)結(jié)構(gòu)指針變量的值是整個(gè)結(jié)構(gòu)數(shù)組的首地址。結(jié)構(gòu)指針變量也可指向結(jié)構(gòu)數(shù)組的一個(gè)元素,這時(shí)結(jié)構(gòu)指針變量的值是該結(jié)構(gòu)數(shù)組元素的首地址。 設(shè)ps為指向結(jié)構(gòu)數(shù)組的指針變量,則ps也指向該結(jié)構(gòu)數(shù)組的0號(hào)元素,ps+1指向1號(hào)元素,ps+i則指向i號(hào)元素。這與普通數(shù)組的情況現(xiàn)金網(wǎng)96y.org是一致的。 用指針變量輸出結(jié)構(gòu)數(shù)組。 struct stu{ int num; char *name; char sex; float score; }boy[5]={ {101,Zhou ping,M,45},{102,Zhang ping,M,62.5},{103,Liou fang,F,92.5},{104,Cheng ling,F,87},{105,Wang ming,M,58} }; main(){ struct stu *ps; printf(NotNametttSextScoretn); for(ps=boy;psboy+5;ps++) printf(%dt%stt%ct%ftn,ps-num,ps-name,ps-sex,ps-score); } 在程序中,定義了stu結(jié)構(gòu)類(lèi)型的外部數(shù)組boy并作了初始化賦值。在main函數(shù)內(nèi)定義ps為指向stu類(lèi)型的指針。在循環(huán)語(yǔ)句for的表達(dá)式1中,ps被賦予boy的首地址,然后循環(huán)5次,輸出boy數(shù)組中各成員值。 應(yīng)該注意的是,一個(gè)結(jié)構(gòu)指針變量雖然可以用來(lái)訪問(wèn)結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組元素的成員,但是,不能博彩公司排名q07i5.org使它指向一個(gè)成員。也就是說(shuō)不允許取一個(gè)成員的地址來(lái)賦予它。因此,下面的賦值是錯(cuò)誤的。 ps=boy[1].sex; 而只能是: ps=boy;(賦予數(shù)組首地址) 或者是: ps=boy[0];(賦予0號(hào)元素首地址) C語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)十——指針 【實(shí)驗(yàn)1】 實(shí)驗(yàn)題目: 1、下列代碼片段哪里有錯(cuò)誤? char var1,ptr1; var1 = ?x?; ptr1 = &var1; 2、設(shè)有如下定義: Double var1, *ptr1, *ptr2; Float* ptr3; Int var2, *var4; 那么,var1, *ptr1, ptr2,*ptr2,ptr3,* ptr3,var2, var4,*var4個(gè)屬于哪種數(shù)據(jù)類(lèi)型? 3、下列代碼片段在哪里有錯(cuò)誤? Char c = ? A ?; Char * p; p = c;或*p=?A?; 4、下列代碼片段的輸出結(jié)果是什么? charvar1 = ? S ?; charvar2 = ? X ?; char*ptr1, *ptr2; ptr1 = &var1; ptr2 = &var2; *ptr2 = *ptr1; printf(“%ct%cn”, *ptr1, var2); 【實(shí)驗(yàn)2】 實(shí)驗(yàn)題目:輸入3個(gè)整數(shù),按由小到大的順序輸出。 【實(shí)驗(yàn)3】 實(shí)驗(yàn)題目:輸入10個(gè)整數(shù),將其中最小的數(shù)與第一個(gè)數(shù)對(duì)換,把最大的數(shù)與最后一個(gè)數(shù)對(duì)換。 實(shí)驗(yàn)要求:寫(xiě)3個(gè)函數(shù):(1)輸入10個(gè)數(shù);(2)進(jìn)行處理;(3)輸出10個(gè)數(shù)。 【實(shí)驗(yàn)4】輸入年和天數(shù),輸出對(duì)應(yīng)的年、月、日。 例如:輸入2000和61,輸出2000-3-1。 要求:都用指針實(shí)現(xiàn)。 一 實(shí)驗(yàn)?zāi)康?/p> 實(shí)驗(yàn)七 指針 了解指針的概念,學(xué)會(huì)定義和使用指針變量。2 掌握指針、變量和數(shù)組的關(guān)系及使用方法。3 學(xué)會(huì)使用指向函數(shù)的指針變量。 二 實(shí)驗(yàn)內(nèi)容 編寫(xiě)函數(shù)fun(float *sn,int n),其功能是:根據(jù)以下公式計(jì)算s,計(jì)算結(jié)果通過(guò)形參sn傳回;n通過(guò)實(shí)參傳入,n的值大于等于0。上機(jī)運(yùn)行并記錄輸入輸出(主函數(shù)已給出)。 s?1?1111 ????3572n?1fun(float *sn,int n){ 定義變量:和s,通項(xiàng)w,符號(hào)f,循環(huán)控制變量i; /* 其中s、f要初始化 */ 循環(huán)求累加和s { 改變符號(hào);/* 由負(fù)變正或由正變負(fù) */ 求通項(xiàng)w;累加:s+=w;} 形參指針變量sn賦值;/* 通過(guò)形參sn傳回累加和s */ } main(){ float s;int n;printf(“n=”);scanf(“%d”,&n);fun(&s,n);printf(“s=%fn”,s);} 完整程序如下: #include 輸出結(jié)果如下圖: 想使指針變量pt1指向a和b中的大者,pt2指向小者,以下程序能否實(shí)現(xiàn)此目的? swap(int *p1,int *p2){ int *p;p=p1;p1=p2;p2=p } main(){ int a,b;int *pt1,*pt2;scanf(“%d,%d”,&a,&b);pt1=&a;pt2=&b;if(a 上機(jī)調(diào)試此程序。如果不能實(shí)現(xiàn)題目要求,指出原因并修改之。 子函數(shù)swap改成下面程序方可實(shí)現(xiàn)目的,主函數(shù)不變: swap(int *p1,int *p2){ int p;p=*p1;*p1=*p2;*p2=p;} 下面的程序用來(lái)實(shí)現(xiàn)將一個(gè)3×3的矩陣轉(zhuǎn)置。#include 程序修改如下: #include 第二篇:C語(yǔ)言結(jié)構(gòu)體指針變量作函數(shù)參數(shù)
第三篇:C語(yǔ)言指向結(jié)構(gòu)體數(shù)組的指針
第四篇:C語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)十指針
第五篇:C語(yǔ)言實(shí)驗(yàn)程序、總結(jié) 實(shí)驗(yàn)七 指針