版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計創(chuàng)建第一個C語言程序項目1“學生成績管理系統(tǒng)”中相關數(shù)據(jù)設計及簡單處理項目2項目中學生成績的等級判定項目3項目中的設計數(shù)據(jù)處理及封面與菜單的初步項目4學生成績的分組匯總程序項目5利用數(shù)組完善項目中數(shù)據(jù)的處理項目6利用函數(shù)進行項目的整體框架設計項目7利用結(jié)構(gòu)體實現(xiàn)項目項目8利用指針優(yōu)化項目項目9利用文件完善項目項目10項目9利用指針優(yōu)化項目目標TARGET知識目標掌握指針的定義與使用。掌握指針的運算。掌握指向數(shù)組的指針。掌握指向結(jié)構(gòu)體的指針。掌握指向函數(shù)的指針。目標TARGET技能目標能夠熟練使用數(shù)組指針解決多個數(shù)據(jù)處理問題。能夠利用指針操作結(jié)構(gòu)體,對結(jié)構(gòu)體成員進行訪問。能夠使用指針解決函數(shù)相關問題,提高執(zhí)行效率。用指針實現(xiàn)學生最高、最低成績查找任務9.1用指針實現(xiàn)學生成績排序任務9.2任務9.1用指針實現(xiàn)學生最高、最低成績查找
任務描述
改進學生成績管理系統(tǒng),用指針來實現(xiàn)學生成績管理系統(tǒng)中的最值的查找,提高程序執(zhí)行效率。任務分析
項目8中開發(fā)的學生成績管理系統(tǒng),對數(shù)據(jù)的操作是通過結(jié)構(gòu)成員訪問實現(xiàn)的,顯然執(zhí)行效率低,處理批量數(shù)據(jù)速度太慢。本任務將利用指針知識優(yōu)化程序主要功能模塊—最值查找,用指針來訪問結(jié)構(gòu)成員,處理批量數(shù)據(jù),以提高系統(tǒng)的訪問效率。
本任務的要點是:用指向結(jié)構(gòu)的指針作為函數(shù)的參數(shù)。1認識指針Part◎指針與數(shù)組◎指針的概念指針的概念
在內(nèi)存中,每個內(nèi)存單元都有一個地址,如在一個32位計算機的內(nèi)存中,內(nèi)存地址的編號按十六進制從00000000-FFFFFFFF,共有232個內(nèi)存單元(字節(jié)),如果一個整型變量占據(jù)4個字節(jié),那么4個字節(jié)中編號最小的字節(jié)的地址即是該整型變量所占存儲單元的地址。通常我們把指向內(nèi)存存儲單元的地址叫指針。如果一個整型變量占據(jù)4個字節(jié),那么4個字節(jié)中編號最小的字節(jié)的地址即是該整型變量所占存儲單元的地址。通常我們把指向內(nèi)存存儲單元的地址叫指針。如一個整型變量inta=247,在內(nèi)存中占據(jù)4個字節(jié),存儲的內(nèi)容是247,假如所占據(jù)的4個字節(jié)從地址為0012FF7C開始,則變量a的地址就是0012FF7C,該地址也叫整型變量所占存儲單元的首地址,也是變量a的指針,記作&a。一個變量的地址稱為該變量的“指針”。如果有一個變量專門用來存放其他變量的地址(指針),這個變量被稱為“指針變量”。指針的概念
(1)指針變量的定義、初始化和使用指針變量在使用前首先需要定義,定義指針變量的語法格式如下所示:
類型標識符*指針變量名;一般指針變量初始化格式如下所示:類型標識符*指針變量名=&變量名;指針的概念
指針變量的初始化方式:1)定義指針變量,由系統(tǒng)進行初始化操作,或者不進行初始化。如:inta,*p;2)定義指針變量的同時進行初始化。如:inta,*p=&a;或者inta;int*p=&a;3)指針變量初始化為空值。如:inta,*p=NULL;指針的概念
指針變量的引用:指引用指針變量指向的變量,就是根據(jù)指針變量中存放的地址,訪問該地址對應的變量。訪問指針變量指向變量的方式非常簡單,只需在指針變量前加一個“*”(取值運算符)即可,訪問指針變量的語法格式如下所示:*指針表達式;指針的概念
(2)指針變量作為函數(shù)參數(shù)指針變量作為變量,它具有變量的一切特征,它也可以作為函數(shù)的形參,接受在函數(shù)調(diào)用時實參傳過來的值,那么指針變量作為函數(shù)的參數(shù)時,實參必須是指針變量、變量的地址、地址常量等。指針的概念
#include<stdio.h>voidmain(){intnum=1;int*ptr=#//定義一個指針變量,指針printf("\nnum的值=%dnum地址=%p",num,&num);//顯示num的地址printf("\nptr的地址是%pptr存放的值是地址為%pptr指向的值=%d",&ptr,ptr,*ptr);getchar();}例9-1寫一個程序,獲取一個int變量num的地址,并顯示到終端,將num的地址賦給指針ptr,并通過ptr去修改num的值。指針的概念
執(zhí)行結(jié)果說明:(1)int*表示類型為指針類型,變量名稱為ptr,ptr就是一個int*類型,ptr指向了一個int類型的變量的地址。(2)如果要輸出一個變量的地址,使用格式是%p,&num表示取出num這個變量的對應地址。(3)指針變量,本身也有地址,ptr的地址為&ptr;ptr表示指針變量存放的地址,通過*ptr獲取指針指向的值。注意:(1)指針和指針變量是兩個完全不同的概念,指針是一個地址,而指針變量是存放地址(指針)的變量。(2)基本數(shù)據(jù)類型都有對應的指針類型,形式為數(shù)據(jù)類型*,比如int的對應的指針就是int*,float對應的指針類型就是float*,依次類推。指針與數(shù)組
(1)數(shù)組的指針和指向數(shù)組的指針變量
數(shù)組的指針是指數(shù)組在內(nèi)存中的起始地址,數(shù)組元素的指針是數(shù)組元素在內(nèi)存中的起始地址。
類似于指向簡單變量的指針,指向數(shù)組的指針變量只要將數(shù)組的首地址(或數(shù)組名)賦給指針變量即可。例如:intiData[5];/*定義iData為整型數(shù)據(jù)的數(shù)組*/int*p;/*定義p為指向整型變量的指針*/則語句:p=&iData[0];(或p=iData;)/*p指向iData數(shù)組的第0號元素*/稱為p指針為指向數(shù)組iData的指針變量。指針與數(shù)組
(2)數(shù)組元素的引用假設指針變量p指向了數(shù)組iData,若想引用數(shù)組中的元素,可以通過下列兩種方式。1)下標法iData[i] //①數(shù)組名下標法p[i] //②指針變量下標法2)指針法*(iData+i) //①數(shù)組名指針法*(p+i) //②指針變量指針法指針與數(shù)組
(3)數(shù)組名作為函數(shù)參數(shù)當數(shù)組名作為函數(shù)參數(shù)時,在函數(shù)調(diào)用時,實際傳遞給函數(shù)的是該數(shù)組的起始地址,即指針值。所以,實參可以是數(shù)組名或指向數(shù)組的指針變量。而被調(diào)函數(shù)的形參,既可以說明為數(shù)組,也可以說明為指針。指針與數(shù)組
(4)字符串與指針訪問一個字符串可以通過兩種方式,第一種就是前面學習過的使用字符數(shù)組來存放一個字符串,從而實現(xiàn)對字符串的操作;另一種方法就是下面要介紹的使用字符指針指向一個字符串,此時可以不定義數(shù)組。例如:char*p="IloveC";指針與數(shù)組
(5)指針數(shù)組如果一個數(shù)組的每個元素都是指針類型的數(shù)據(jù),則這種數(shù)組稱指針數(shù)組。指針數(shù)組定義的一般形式為:類型標識符*數(shù)組名[常量表達式];比如:int*ptr[3];ptr聲明為一個指針數(shù)組,由3個整數(shù)指針組成。因此,ptr中的每個元素,都是一個指向int值的指針。指針與數(shù)組
#include<stdio.h>voidmain(){intarray[10]={1,2,3,4,5,6,7,8,9,10};inti,*p;p=array;for(i=0;i<10;p++,i++){printf("%d",*p);}printf("\n");}例9-2定義一個一維數(shù)組,并用指針依次訪問數(shù)組元素。指針與數(shù)組
執(zhí)行結(jié)果說明:(1)在第7行for語句中,int類型的指針變量p指向數(shù)組array,第7~10行,通過for循環(huán)移動指針p,依次指向數(shù)組中的每個元素,并輸出。(2)指針是一個用數(shù)值表示的地址,可以對指針執(zhí)行四種算術運算:++、--、+、-。當對指針進行++時,指針會按照它指向的數(shù)據(jù)類型字節(jié)數(shù)大小增加,例如int*指針,每++,就增加4個字節(jié),指向了下一個數(shù)組元素。注意:(1)數(shù)組名并不代表整個數(shù)組,只代表數(shù)組首元素的地址。(2)和指針變量不同的是,數(shù)組名array中的地址是不可變的,而指針p中的地址是可變的。指針與數(shù)組
#include<stdio.h>voidfunc(int*p){*p=20;}voidmain(){intnum=10;printf("num=%d\n",num);func(&num);printf("num=%d\n",num);getchar();}例9-3指針作為函數(shù)參數(shù)應用。指針與數(shù)組
執(zhí)行結(jié)果說明:在程序中第2行代碼定義一個func()函數(shù),該函數(shù)的參數(shù)類型為指針類型。在main()函數(shù)中調(diào)用該函數(shù)時傳入變量num的地址,對其取值運算后賦新的值。注意:func()函數(shù)必須寫在main()函數(shù)的前面,否則需要在main()函數(shù)前聲明func()函數(shù)。指針與數(shù)組
#include<stdio.h>voidmain(){//定義一個指針數(shù)組,該數(shù)組的每個元素,指向的是一個字符串char*books[]={"三國演義","西游記","紅樓夢","水滸傳"};inti,len=4;//遍歷for(i=0;i<len;i++){printf("\nbooks[%d]指向字符串是=%s",i,books[i]);}getchar();}例9-4請編寫程序,定義一個指向字符的指針數(shù)組來存儲字符串列表(四大名著書名),并通過遍歷該指針數(shù)組,顯示字符串信息。指針與數(shù)組
執(zhí)行結(jié)果說明:1)本例中定義了一個指針數(shù)組,該數(shù)組的每個元素,指向的是一個字符串。2)使用循環(huán)依次輸出指針數(shù)組指向字符串的值,格式控制為%s。注意:數(shù)組指針和指針數(shù)組不是同一個概念,數(shù)組指針是指一個指向數(shù)組的指針,指針數(shù)組是指數(shù)組中的元素類型都是指針類型。任務9.2用指針實現(xiàn)學生成績排序
任務描述改進學生成績管理系統(tǒng),用指針來實現(xiàn)學生成績管理系統(tǒng)中的學生成績的排序,提高程序執(zhí)行效率。任務分析我們將利用指針知識優(yōu)化程序主要功能模塊--學生成績的排序,用指針來訪問結(jié)構(gòu)成員,處理批量數(shù)據(jù),達到提高系統(tǒng)的訪問效率。本任務的要點是:在函數(shù)體內(nèi)直接用指針訪問結(jié)構(gòu)成員。2指針的更多應用Part◎指針與函數(shù)◎指針與結(jié)構(gòu)體指針與結(jié)構(gòu)體
(1)指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針稱為結(jié)構(gòu)體指針,其定義格式和基本數(shù)據(jù)類型的指針變量定義一樣。一般形式為:struct結(jié)構(gòu)類型名*指針變量名當結(jié)構(gòu)體指針指向一個結(jié)構(gòu)體變量時,該指針變量的值就是該結(jié)構(gòu)體變量的起始地址。用取地址運算符“&”就可獲得結(jié)構(gòu)變量的指針。一般形式為:指針變量名=&結(jié)構(gòu)體變量名;指針與結(jié)構(gòu)體
(1)指向結(jié)構(gòu)體變量的指針例如:structStudent{charname[20];//姓名intid;//學號floatscore;//分數(shù)}stu;指向結(jié)構(gòu)體student的指針變量定義并賦值為:structstudent*p=&stu;指針與結(jié)構(gòu)體
(1)指向結(jié)構(gòu)體變量的指針在定義了指向結(jié)構(gòu)體類型變量的指針后,可以通過結(jié)構(gòu)體指針操作結(jié)構(gòu)體變量的成員,常用的訪問方式是:結(jié)構(gòu)體變量名.成員名(*結(jié)構(gòu)體指針變量名).成員名結(jié)構(gòu)體指針變量名->成員名例如:根據(jù)如上例子指針變量p指向了結(jié)構(gòu)體變量stu,則三種訪問方式分別為:stu.成員名、(*p).成員名、p->成員名。指針與結(jié)構(gòu)體
(3)指向結(jié)構(gòu)體數(shù)組的指針類似于用指向結(jié)構(gòu)體變量的指針,間接訪問結(jié)構(gòu)體成員一樣,也可以用指向結(jié)構(gòu)體數(shù)組及其元素的指針來處理結(jié)構(gòu)體數(shù)組。可以把結(jié)構(gòu)體數(shù)組的數(shù)組名賦值給結(jié)構(gòu)體指針,也就是把結(jié)構(gòu)體數(shù)組的首地址賦值給結(jié)構(gòu)體指針。指針與結(jié)構(gòu)體
(3)指向結(jié)構(gòu)體的指針作為函數(shù)參數(shù)類似于普通指針變量作為函數(shù)參數(shù)一樣,用指向結(jié)構(gòu)的指針變量作實參時,是屬于“地址傳遞”方式。指針與結(jié)構(gòu)體
(4)使用指針優(yōu)化學生成績的錄入和瀏覽模塊①使用typedef給學生信息類型定義別名typedefstructstudent //定義學生成績結(jié)構(gòu)體{intnum; //學號charname[16]; //姓名floatmath; //數(shù)學成績floatyw; //語文成績floateng; //英語成績floatsum; //總分}STUDENT,*PSTUDENT;指針與結(jié)構(gòu)體
(4)使用指針優(yōu)化學生成績的錄入和瀏覽模塊②修改成績錄入模塊用指向結(jié)構(gòu)體的指針作為函數(shù)參數(shù),函數(shù)體內(nèi)用指針法訪問結(jié)構(gòu)體成員。voidfnInputData(PSTUDENTs){inti;charch[2];PSTUDENTstu=s;stu+=m;//m已錄入的記錄總數(shù)PSTUDENTtemp;do{printf("\n\t請輸入學生信息:\n\t\t學號:");scanf("%ld",&stu->num);for(temp=s,i=0;i<m;i++,temp++)if(temp->num==stu->num)指針與結(jié)構(gòu)體
{printf("\n\t該學號已存在,請按任意鍵繼續(xù)!");getchar();}printf("\t\t姓名:");//輸入姓名、數(shù)學、英語、語文成績scanf("%s",stu->name);printf("\t\t數(shù)學:");scanf("%f",stu->math);printf("\t\t英語:");scanf("%f",stu->eng);printf("\t\t語文:");scanf("%f",stu->yw);stu->sum=stu->math+stu->yw+stu->eng;//計算總成績m++;stu++;printf("\t\t是否繼續(xù)?(y/n):");scanf("%s",ch);}while(strcmp(ch,"y")==0||strcmp(ch,"Y")==0);}指針與結(jié)構(gòu)體
(4)使用指針優(yōu)化學生成績的錄入和瀏覽模塊③修改成績?yōu)g覽模塊voidfnMod(PSTUDENTs){inti;PSTUDENTstu=s;printf("\t學號\t姓名\t數(shù)學\t語文\t英語\t總分\n");if(m==0)printf("\n\n\t\t沒有記錄");for(i=0;i<m;i++,stu++)printf("\t%-8ld%-8s%-8.1f%-8.1f%-8.1f%-8.1f\n",stu->num,stu->name,stu->math,stu->yw,stu->eng,stu->sum);}指針與結(jié)構(gòu)體
#include"stdio.h"structstudent{charchName[13];charchSex;intiAge;};structstudentstStu[3]={{"zhang",'M',17},{"Li",'F',18},{"Wang",'M',19}};voidmain(){ structstudent*pStr=stStu; for(;pStr<stStu+3;pStr++) printf("\n%-10s%2c,%4d",pStr->chName,pStr->chSex,pStr->iAge);Getchar();}例9-5已知3名學生的信息,包含姓名、性別和年齡,請自定義結(jié)構(gòu)體類型,然后利用指向結(jié)構(gòu)體數(shù)組的指針變量來訪問學生的信息,并在屏幕上輸出。指針與結(jié)構(gòu)體
執(zhí)行結(jié)果說明:1)構(gòu)造結(jié)構(gòu)體類型,包含姓名、性別、年齡三個成員。2)定義學生結(jié)構(gòu)體數(shù)組并初始化。3)在main()函數(shù)中定義學生結(jié)構(gòu)體類型指針變量,并指向結(jié)構(gòu)體數(shù)組。4)構(gòu)造循環(huán),利用結(jié)構(gòu)體指針變量訪問結(jié)構(gòu)體數(shù)組成員。注意:如果pStr指向結(jié)構(gòu)體數(shù)組的一個元素,則pStr+1就指向同一結(jié)構(gòu)體數(shù)組的下一個元素。指針與結(jié)構(gòu)體
例9-6已知3名學生的信息,包含編號、姓名、性別和年齡,請自定義結(jié)構(gòu)體類型,輸出3名學生信息,輸出過程通過函數(shù)實現(xiàn)。指針與結(jié)構(gòu)體
#include<stdio.h>structstudent{intid;intage;charname[10];charsex;};voidshow(structstudent*stu,intcount){structstudent*p;for(p=stu;p<stu+count;p++){printf("id:%d,age:%d,name:%s,sex:%c\n",p->id,p->age,p->name,p->sex);}}voidmain(){structstudentstu[3]={{1001,18,"ZhangSan",'M'},{1002,16,"LiSi",'W'},{1003,19,"ZhaoLiu",'M'}}; show(stu,3); getchar();}指針與結(jié)構(gòu)體
執(zhí)行結(jié)果說明:1)聲明show()函數(shù)并實現(xiàn)功能。2)聲明main()函數(shù),在main()函數(shù)中,定義并初始化結(jié)構(gòu)體數(shù)組。3)調(diào)用show()函數(shù),遍歷結(jié)構(gòu)體數(shù)組并輸出其成員的值。4)在該案例中,由于無法通過數(shù)組直接獲取到其長度,因此,在定義的show()函數(shù)中,需要傳遞兩個參數(shù),其中一個是結(jié)構(gòu)體數(shù)組的首地址,另一個是數(shù)組的長度。show()函數(shù)接收到傳遞來的數(shù)組首地址和長度后,使用for循環(huán),將結(jié)構(gòu)體數(shù)組中的所有成員輸出。注意:結(jié)構(gòu)體指針變量用于存放結(jié)構(gòu)體變量的首地址,所以將指針作為函數(shù)參數(shù)傳遞時,其實就是傳遞結(jié)構(gòu)體變量的首地址。指針與函數(shù)
(1)函數(shù)的返回值是指針類型一個函數(shù)不僅可以返回int型、float型、char型和結(jié)構(gòu)類型等數(shù)據(jù)類型,也可以返回指針類型的數(shù)據(jù)。返回指針類型的函數(shù)定義格式為:類型名*函數(shù)名([參數(shù)表]){
函數(shù)體;}指針與函數(shù)
(1)函數(shù)的返回值是指針類型例如:int*func(){int*p;.../*省略的其它操作語句*/return(p);}func()函數(shù)的返回值是一個指向整型變量的指針。指針與函數(shù)
(2)指向函數(shù)的指針變量①指向函數(shù)的指針變量的定義函數(shù)在內(nèi)存中也占據(jù)一定的存儲空間并有一個入口地址(函數(shù)開始運行的地址),這個地址就稱為該函數(shù)的指針。可以用一個指針變量來存放函數(shù)的入口地址,這時稱該指針指向這個函數(shù),并稱該指針變量為“指向函數(shù)的指針變量”,簡稱為“函數(shù)的指針變量”或“函數(shù)指針”,可以通過函數(shù)指針來調(diào)用函數(shù),這是函數(shù)指針的主要用途。函數(shù)指針定義的一般形式為:類型標識符
(*指針變量名)(參數(shù));指針與函數(shù)
(2)指向函數(shù)的指針變量②指向函數(shù)的指針變量的賦值與其它指針的定義一樣,函數(shù)指針定義后,應給它賦一個函數(shù)的入口地址,即使它指向一個函數(shù),才能使用這個指針。C語言中,函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù)名給指向函數(shù)的指針變量賦值:指向函數(shù)的指針變量=函數(shù)名;指針與函數(shù)
(2)指向函數(shù)的指針變量③用函數(shù)指針變量調(diào)用函數(shù)通過函數(shù)指針來調(diào)用函數(shù)的一般格式是:(*函數(shù)指針)(實參表)指針與函數(shù)
(3)指向函數(shù)的指針變量作函數(shù)參數(shù)假設函數(shù)A在運行過程中要根據(jù)不同情況多次調(diào)用下列函數(shù):B、C、D和E之一來協(xié)助它進行處理,按照以往的做法是,用條件選擇語句將上述函數(shù)寫在函數(shù)A的函數(shù)體中的多個位置上,這是一種笨拙的、靈活性較差的處理方法。現(xiàn)在,可以通過使用函數(shù)指針作為函數(shù)參數(shù)的方式向函數(shù)A傳遞其它函數(shù)的入口地址,從而靈活地調(diào)用其他函數(shù)。指針與函數(shù)
例9-7函數(shù)指針實例,聲明add()函數(shù)和times()函數(shù)分別實現(xiàn)兩個整數(shù)相加和相乘。在main()函數(shù)體內(nèi)定義函數(shù)指針。用函數(shù)指針分別調(diào)用add()函數(shù)和times()函數(shù)計算兩個數(shù)的和及乘積。指針與函數(shù)
#include<stdio.h>intadd(inta,intb){returna+b;}inttimes(inta,intb){returna*b;}intfunc(int(*p)(int,int),inta,intb){returnp(a,b);}voidmain(){inta,b,result;int(*p)(int,int);a=32;b=12;p=add;result=func(p,a,b);printf("%d+%d=%d\n",a,b,result);p=times;result=func(times,a,b);printf("%d*%d=%d\n",a,b,result);getchar();}指針與函數(shù)
執(zhí)行結(jié)果說明:
在該案例中,第2~9行代碼定義了add()函數(shù)和times()函數(shù),分別用于對兩個參數(shù)進行相加和相乘處理。第10~13行代碼定義了一個func()函數(shù)接收一個函數(shù)指針p和兩個int類型變量作為參數(shù),在函數(shù)中通過函數(shù)指針p來決定用哪個函數(shù)處理這兩個int類型的參數(shù),最后將結(jié)果返回。第20~25行代碼分別將函數(shù)指針p指向add()函數(shù)和times()函數(shù),func()函數(shù)調(diào)用參數(shù)p,然后使用result變量來接收func()的返回值,并在控制臺輸出結(jié)果。注意:1)指針函數(shù)本質(zhì)是一個函數(shù),其返回值為指針。函數(shù)指針本質(zhì)是一個指針,其指向一個函數(shù)。其寫法分別為:指針函數(shù):int*fun(intx,inty);函數(shù)指針:int(*fun)(intx,inty);2)指針函數(shù)的*是屬于數(shù)據(jù)類型的,而函數(shù)指針的星號是屬于函數(shù)名的。拓展案例案例9-1寫出下面問題的算法問題描述請編寫一個函數(shù)strlong(),返回兩個字符串中較長的一個,通過指針函數(shù)實現(xiàn)。拓展案例
#include<string.h>char*strlong(char*str1,char*str2){//函數(shù)返回的char*(指針)printf("\nstr1的長度%dstr2的長度%d",strlen(str1),strlen(str2));if(strlen(str1)>=strlen(str2)){returnstr1;}else{returnstr2;}}intmain(){charstr1[30],str2[30],*str;printf("\n請輸入第1個字符串");gets(str1);printf("\n請輸入第2個字符串");gets(str2);str=strlong(str1,str2);printf("\nLongerstring:%s\n",str);getchar();return0;}拓展案例案例1-2寫出下面問題的算法問題描述本題是一個經(jīng)典的數(shù)學問題。對于一個大于2的正整數(shù),判斷它是不是一個素數(shù)。。說明:1)本例中定義了一個返回類型為char*的strlong()指針函數(shù),通過strlen()求出兩個字符串的長度,將長度長的字符串返回。2)在main()函數(shù)中通過gets方法輸入兩個字符串,調(diào)用strlong()指針函數(shù)求出結(jié)果。注意:1)用指針作為函數(shù)返回值時需要注意,函數(shù)運行結(jié)束后會銷毀在它內(nèi)部定義的所有局部數(shù)據(jù),包括局部變量、局部數(shù)組和形式參數(shù),函數(shù)返回的指針不能指向這些數(shù)據(jù)。2)函數(shù)運行結(jié)束后會銷毀該函數(shù)所有的局部數(shù)據(jù),這里所謂的銷毀并不是將局部數(shù)據(jù)所占用的內(nèi)存全部清零,而是程序放棄對它的使用權限,后面的代碼可以使用這塊內(nèi)存。拓展案例
執(zhí)行結(jié)果拓展案例案例9-2寫出下面問題的算法問題描述使用指針修改學生成績管理系統(tǒng)的記錄查找、修改、刪除模塊。拓展案例
voidfnDel(structstudentstu[]) //自定義刪除函數(shù){inti,j;longsnum;charch[2];structstudent*p;p=stu;if(m==0){printf("\n\t\t沒有記錄!\n");return;}printf("\n\t請輸入你要刪除的學號:");scanf("%ld",&snum);for(i=0,p=stu;i<m;i++,p++)if(snum==p->no)break;if(i==m){printf("\n\t\t沒有你要刪除的學號");getch();return;}printf("\t查找到,你確定要刪除嗎?(y/n)");scanf("%s",ch);if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)//判斷是否要進行刪除{for(j=i;j<m;j++,p++)*p=*(p+1);//將后一個記錄移到前一個記錄的位置m--; //記錄的總個數(shù)減1printf("\t\t刪除成功!\n");}}拓展案例
voidfnSearch(structstudentstu[]) //自定義查找函數(shù){inti;longsnum;structstudent*p;p=stu;if(m==0){printf("沒有記錄!\n");return;}printf("\t\t請輸入你要查找的學號:");scanf("%ld",&snum);for(i=0,p=stu;i<m;i++,p++) /*查找匹配*/if(snum==p->num) /*查找到,輸出記錄*/{printf("\n\t\t查找到的學生,信息如下:\n\n");printf("\t學號\t姓名\t數(shù)學\t語文\t英語\t總\n");printf("\t%-8ld%-8s%-8.1f%-8.1f%-8.1f%-8.1f\n",p->num,p->name,p->math,p->yw,p->eng,p->sum);//printf(FORMAT,DATA); //將查找出的結(jié)果按指定格式輸出return;}if(i==m)printf("\t\t未找到要查找的學生息!\n");}
voidfnModify(structstudentstu[]) //自定義修改函數(shù)inti;longsnum;structstudent*p;p=stu;if(m==0)
{printf("沒有記錄!\n");
return;}拓展案例
printf("\t\t請輸入你要修改的學號:");scanf("%ld",&snum); //輸入待修改的學號for(i=0,p=stu;i<m;i++,p++) //檢索記錄中是否有該學號記錄信息if(snum==p->num)break; if(i<m){printf("\t學號\t姓名\t數(shù)學\t語文\t英語\t總\n");//將查找出的結(jié)果按指定格式輸出printf("\t%-8ld%-8s%-8.1f%-8.1f%-8.1f%-8.1f\n",p->num,p->name,p->math,p->yw,p->eng,p->sum);printf("\t\t找到了,輸入修改信息!\n");printf("\t\t姓名:");
scanf("%s",p->name); //輸入名字printf("\t\t數(shù)學:");scanf("%f",&p->math); //輸入數(shù)學課成績printf("\t\t語文:");scanf("%f",&p->yw); //輸入語文課成績printf("\t\t英語:");scanf("%f",&p->eng); //輸入英語課成績p->sum=p->math+p->yw+p->eng; }else{printf("\n\t\t沒有找到!");getch();return;}}說明:1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024商鋪托管與全面物業(yè)服務標準合同3篇
- 個人敬業(yè)奉獻先進事跡(6篇)
- 2024年新能源項目土石方居間服務合同范本3篇
- 服務合同單次服務期限
- 小區(qū)供水合同協(xié)議模板
- 信用逾期證明書
- 淡水魚采購合同樣本
- 回遷安置房買賣合同風險防范
- 2024年樹林木材加工與銷售一體化買賣合同3篇
- 分家財產(chǎn)分配合同樣本
- 工程倫理學智慧樹知到期末考試答案章節(jié)答案2024年廣東工業(yè)大學
- 國際經(jīng)濟法智慧樹知到期末考試答案章節(jié)答案2024年中南大學
- GB/T 18488-2024電動汽車用驅(qū)動電機系統(tǒng)
- 腫瘤的預防與早診早治
- 2023-2024學年成都市武侯區(qū)九年級上英語(一診)期末考試題(含答案)
- DZ∕T 0130-2006 地質(zhì)礦產(chǎn)實驗室測試質(zhì)量管理規(guī)范(正式版)
- 25題戰(zhàn)略規(guī)劃崗位常見面試問題含HR問題考察點及參考回答
- 電子課件-《液壓傳動與氣動技術(第二版)》
- 人工智能基礎題庫(含答案)
- 部編初中歷史八年級上冊期末專題復習觀點論述題
- 音樂與健康智慧樹知到期末考試答案2024年
評論
0/150
提交評論