教學(xué)相關(guān)函數(shù)-循環(huán)數(shù)組指針_第1頁
教學(xué)相關(guān)函數(shù)-循環(huán)數(shù)組指針_第2頁
教學(xué)相關(guān)函數(shù)-循環(huán)數(shù)組指針_第3頁
教學(xué)相關(guān)函數(shù)-循環(huán)數(shù)組指針_第4頁
教學(xué)相關(guān)函數(shù)-循環(huán)數(shù)組指針_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

11關(guān)于數(shù)組、指針、函數(shù)

的綜合討論(1)2011.05.2022任務(wù)3:姓名排序電視歌手大獎(jiǎng)賽開賽報(bào)名時(shí),由于人數(shù)較多,一些參賽信息需要及時(shí)錄入計(jì)算機(jī)并用計(jì)算機(jī)進(jìn)行管理。其中一個(gè)很重要的工作就是:要按選手姓名(漢語拼音)排序后編號(hào),以決定選手比賽的順序。請(qǐng)你編程實(shí)現(xiàn)對(duì)姓名拼音串按英文字典順序排序的程序。為測(cè)試程序,假定共有10名選手,選手姓名拼音最長不超過20個(gè)英文字符,且中間無空格。引子33#include<stdio.h>voidmain()

{ charnamelist[10][20]; for(inti=0;i<10;i++)

{ printf("inputthe%dsingername:“,i); scanf(“%s”,&namelist[i]); }

//此處代碼省略(見后)-用冒泡排序法對(duì)姓名進(jìn)行排序 for(inti=0;i<10;i++)

printf(“the%d%s\n”,namelist[i]);

}44#include<stdio.h>voidmain()

{

charnamelist[10][20];//數(shù)組下標(biāo)從0開始! for(inti=0;i<10;i++)

{ printf("inputthe%dsingername:“,i); scanf(“%s”,&namelist[i]); }

//此處代碼省略(見后)-用冒泡排序法對(duì)姓名進(jìn)行排序 for(inti=0;i<10;i++)

printf(“the%d%s\n”,namelist[i]);}55#include<stdio.h>Voidmain()

{

charnamelist[10][20];//數(shù)組下標(biāo)從0開始! for(inti=0;i<10;i++)

{ printf("inputthe%dsingername:“,i); scanf(“%s”,&namelist[i]); }

//此處代碼省略(見后)-用冒泡排序法對(duì)姓名進(jìn)行排序 for(inti=0;i<10;i++)

printf(“the%d%s\n”,namelist[i]);}66#include<stdio.h>voidmain()

{

charnamelist[10][20];//數(shù)組下標(biāo)從0開始! for(inti=0;i<10;i++)

{ printf("inputthe%dsingername:“,i); scanf(“%s”,&namelist[i]); }

//此處代碼省略(見后)-用冒泡排序法對(duì)姓名進(jìn)行排序

for(inti=0;i<10;i++)

printf(“the%d%s\n”,namelist[i]);}77先看看整數(shù)數(shù)組的冒泡算法for(j=0;j<n-1;j++)//比較n-1趟{(lán)

for(i=0;i<n-1-j;i++)//每一趟比較n-j-1次

{

if(a[i]<a[i+1])//若小數(shù)在前交換

{

p=a[i];

a[i]=a[i+1];

a[i+1]=p;

}

}}Page88完整的程序代碼#include<stdio.h>#include<memory.h>intmain()

{ inti,j,p,a[10];

memset(a,0,sizeof(a)); for(i=0;i<10;i++)

{ printf("請(qǐng)輸入待排序的數(shù)a[%d]=“,i); scanf(“%d”,&a[i]); }

for(j=0;j<9;j++)

{ for(i=0;i<9-j;i++)

{ if(a[i]<a[i+1])

{ p=a[i]; a[i]=a[i+1]; a[i+1]=p; } } } for(i=0;i<10;i++)

printf(“%d””,a[i]); }99依樣畫葫蘆for(j=0;j<9;j++){

for(i=0;i<9-j;i++)

{

if(a[i]<a[i+1])

{

p=a[i];

a[i]=a[i+1];

a[i+1]=p;

}

}}for(j=0;j<9;j++){

for(i=0;i<9-j;i++)

{

if(namelist[i]<namelist[i+1])

{

p=namelist[i]; namelist[i]=namelist[i+1]; namelist[i+1]=p;

}

}}1010 for(inti=0;i<9;i++)

//輪(遍,趟)數(shù)=元素?cái)?shù)目-1 { for(intj=0;j<9-i;j++)

//比較數(shù)=總輪數(shù)–當(dāng)前輪次 { if(strcmp(namelist[j],namelist[j+1])>0) { chartmp[20];

strcpy(tmp,namelist[j]); strcpy(namelist[j],namelist[j+1]); strcpy(namelist[j+1],tmp); } } }1111 for(inti=0;i<9;i++)

{ for(intj=0;j<9-i;j++)

{//page328,“strcmp()” if(strcmp(namelist[j],namelist[j+1])>0) { chartmp[20];

strcpy(tmp,namelist[j]); strcpy(namelist[j],namelist[j+1]); strcpy(namelist[j+1],tmp); } } }1212 for(inti=0;i<9;i++)

{ for(intj=0;j<9-i;j++)

{ if(strcmp(namelist[j],namelist[j+1])>0) { chartmp[20];

strcpy(tmp,namelist[j]); strcpy(namelist[j],namelist[j+1]); strcpy(namelist[j+1],tmp); } } }字符串元素的特殊交換算法1313 for(inti=0;i<9;i++)

{ for(intj=0;j<9-i;j++)

{ if(strcmp(namelist[j],namelist[j+1])>0) {

//page327,“strcpy()” chartmp[20];

strcpy(tmp,namelist[j]); strcpy(namelist[j],namelist[j+1]); strcpy(namelist[j+1],tmp); } } }字符串元素的特殊交換算法如何按字典逆序來排序姓名呢?1414如何按字典逆序來排序姓名 for(inti=0;i<9;i++)

{ for(intj=0;j<9-i;j++)

{ if(strcmp(namelist[j],namelist[j+1])<

0) {

//同前省略 } } }比較關(guān)系符改為小于號(hào),即按字典逆序排序姓名。1515如何按字典逆序來排序姓名 for(inti=0;i<9;i++)

{ for(intj=0;j<9-i;j++)

{ if(strcmp(namelist[j],namelist[j+1])<

0) {

//同前省略 } } }比較關(guān)系符改為小于號(hào),即按字典逆序排序姓名。如何根據(jù)用戶輸入來決定按何種次序排序姓名呢?1616可以用一個(gè)變量來記錄用戶的輸入,根據(jù)輸入選擇來判定用戶是想正逆排序姓名還是想逆序排序姓名。該變量的類型可以是?排序準(zhǔn)則的動(dòng)態(tài)變化1717可以用一個(gè)變量來記錄用戶的輸入,根據(jù)輸入選擇來判定用戶是想正逆排序姓名還是想逆序排序姓名。該變量的類型可以是:整數(shù)類型int字符類型char。。。排序準(zhǔn)則的動(dòng)態(tài)變化為什么這些類型都可以?假設(shè)使用charUserInput;來記錄用戶選擇:'U'表示升序,'D'表示降序1818排序準(zhǔn)則的動(dòng)態(tài)變化if(UserInput==‘D’){//Down,降序排列

if(strcmp(namelist[j],namelist[j+1])<

0)

{

//交換相鄰元素,同前省略

}

}

if(UserInput==‘U’){//Up,升序排序

if(strcmp(namelist[j],namelist[j+1])>

0){

//交換相鄰元素,同前省略}

}1919

charUserInput; cout<<"Pleaseinputorder(U=Up,D=Down):"; cin>>UserInput;

//確保輸入合法

assert(UserInput=='D'||

UserInput=='U');

如果輸入不合法,則程序會(huì)以崩潰的方式退出。2020for(inti=0;i<9;i++)

{

for(intj=0;j<9-i;j++)

{

if(UserInput=='D')

{

if(strcmp(namelist[j],namelist[j+1])<0)

{

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

}

}

if(UserInput=='U')

{

if(strcmp(namelist[j],namelist[j+1])>0)

{

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

}

} }}程序代碼還能簡(jiǎn)化使之更清晰嗎?2121程序代碼的簡(jiǎn)化

if(UserInput=='D')

{

if(strcmp(namelist[j],namelist[j+1])<0)

{

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

}

}2222程序代碼的簡(jiǎn)化

if(UserInput=='D')

{

if(strcmp(namelist[j],namelist[j+1])<0)

{

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

}

}接連兩個(gè)if判斷,可合成一個(gè)!if(cond_1){if(cond_2){//...}}if(cond_1&&cond_2){//...}}2323for(inti=0;i<9;i++)

{

for(intj=0;j<9-i;j++)

{

if((UserInput=='D')&&

(strcmp(namelist[j],namelist[j+1])<0))

{

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

}

if((UserInput=='U')&&

(strcmp(namelist[j],namelist[j+1])>0))

{

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

} }}程序代碼還能做進(jìn)一步的簡(jiǎn)化嗎?2424for(inti=0;i<9;i++)

{

for(intj=0;j<9-i;j++)

{

if((UserInput=='D')&&

(strcmp(namelist[j],namelist[j+1])<0)){

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

}

if((UserInput=='U')&&

(strcmp(namelist[j],namelist[j+1])>0)){

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

} }}怎么簡(jiǎn)化?2525for(inti=0;i<9;i++)

{

for(intj=0;j<9-i;j++)

{

if((UserInput=='D')&&

(strcmp(namelist[j],namelist[j+1])<0)){

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

}

if((UserInput=='U')&&

(strcmp(namelist[j],namelist[j+1])>0)){

chartmp[20];

strcpy(tmp,namelist[j]);

strcpy(namelist[j],namelist[j+1]);

strcpy(namelist[j+1],tmp);

} }}怎么定義這個(gè)函數(shù)呢?Swap(namelist[j],namelist[j+1]);Swap(namelist[j],namelist[j+1]);2626Swap(…)函數(shù)的定義注意到:調(diào)用該函數(shù)時(shí),實(shí)參是namelist[j]和namelist[j+1],它們分別對(duì)應(yīng)二維數(shù)組變量namelist的第j“行”和第j+1“行”二維數(shù)組的“行變量”是一個(gè)數(shù)組,所以有://voidSwap(char[]first,char[]second);//ERRORvoidSwap(charfirst[],charsecond[]);//OK2727voidSwap(charfirst[],charsecond[]){ chartmp[20]; strcpy(tmp,first); strcpy(first,second); strcpy(second,tmp);}if((UserInput=='D')&&

(strcmp(namelist[j],namelist[j+1])<0)){ chartmp[20]; strcpy(tmp,namelist[j]); strcpy(namelist[j],namelist[j+1]); strcpy(namelist[j+1],tmp);}2828for(inti=0;i<9;i++){ for(intj=0;j<9-i;j++){ if((UserInput=='D')&& (strcmp(namelist[j],namelist[j+1])<0))

Swap(namelist[j],namelist[j+1]); if((UserInput=='U')&& (strcmp(namelist[j],namelist[j+1])>0))

Swap(namelist[j],namelist[j+1]); }}2929依樣畫葫蘆for(j=0;j<5;j++){ for(i=0;i<5-j;i++) { if(a[i]<a[i+1]) { p=a[i];

a[i]=a[i+1]; a[i+1]=p; } }}for(j=0;j<5;j++){ for(i=0;i<5-j;i++) { if(a[i]<a[i+1]) {

Swap(a[i],a[i+1]); } }}Page3030Swap(…)函數(shù)的定義注意到:調(diào)用該函數(shù)時(shí),程序中的實(shí)參是a[i]和a[i+1],它們分別對(duì)應(yīng)一維數(shù)組變量a的第i和第i+1個(gè)元素一維整數(shù)數(shù)組的元素,是一個(gè)整數(shù),其類型是整數(shù)類型故有voidSwap(intfirst,intsecond);依樣畫葫蘆3131#include<stdio.h>#include<meomry.h>voidSwap(intfirst,intsecond)

{ intp; p=first; first=second; second=p;}Voidmain()

{ inti,j,p,a[6]; memset(a,0,sizeof(a)); for(i=0;i<6;i++)

{ printf("請(qǐng)輸入待排序的數(shù)a[%d]=“,i); scanf(“%d”,&a[i]); }依樣畫葫蘆3232

for(j=0;j<9;j++) {

for(i=0;i<9-j;i++)

{

if(a[i]<a[i+1]) Swap(a[i],a[i+1]); }} for(i=0;i<10;i++) printf(“%d\n”,a[i]); return0;}依樣畫葫蘆可惜??!程序結(jié)果并不正確!3333BUG(問題)在哪里?voidSwap(intfirst,intsecond)

{

intp;

p=first;

first=second;

second=p;}變量first和second是函數(shù)Swap的形式參數(shù),該函數(shù)被調(diào)用時(shí),實(shí)參的值是被賦值給形參的,即相當(dāng)于是復(fù)制了一份。所以,在函數(shù)Swap中交換的是“復(fù)制品”之間內(nèi)容的交換,并不影響實(shí)參的內(nèi)容(值)!3434驗(yàn)證一下#include<iostream>usingnamespacestd;voidSwap(intfirst,intsecond){ intp; p=first; first=second; second=p;}Voidmain(){

inta=3,b=4; printf("BeforecallingSwap(),a=%d,b=%d“,a,b); Swap(a,b); printf("AftercallingSwap(),a=%d,b=%d“,a,b);}3535voidSwap(intfirst,intsecond)

{ printf("&first=%p,&second=%p“,&first,&second);

//同前省略}Voidmain()

{ inta=3,b=4; printf("&a=%p,&b=%p“,&a,&b);

//同前省略}進(jìn)一步驗(yàn)證3636比較實(shí)參與形參的內(nèi)存單元3737如何改正這個(gè)BUG(問題)?voidSwap(int*first,int*second){ intp; p=*first; *first=*second; *second=p;}//inmain()for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(a[i]<a[i+1])

Swap(&(a[i]),&(a[i+1]));3838為什么這樣BUG就被去掉了?firstsecond3849a[i]a[i+1]0X22FF400X22FF440X22FF400X22FF443849a[i]a[i+1]0X22FF400X22FF44intp=*first;

*first=*second;

*second=p;0X22FF400X22FF444938a[i]a[i+1]0X22FF400X22FF44??????0X22FF400X22FF440X22FF400X22FF400X22FF440X22FF440X22FF400X22FF400X22FF440X22FF400X22FF44firstsecondfirstsecondfirstsecond函數(shù)調(diào)用前函數(shù)調(diào)用時(shí)函數(shù)調(diào)用后3939for(inti=0;i<9;i++){ for(intj=0;j<9-i;j++){ if((UserInput=='D')&& (strcmp(namelist[j],namelist[j+1])<0))

Swap(namelist[j],namelist[j+1]); if((UserInput=='U')&& (strcmp(namelist[j],namelist[j+1])>0))

Swap(namelist[j],namelist[j+1]); }}程序代碼還能做進(jìn)一步的簡(jiǎn)化嗎?還是回到姓名排序(二維數(shù)組)的問題上來4040strcmp(…)的返回值是什么?#include<stdio.h>#include<string.h>intmain(){ cout<<strcmp("AAA","BBB")<<endl; cout<<strcmp("DDD","BBB")<<endl; return0;}程序輸出為:-114141for(inti=0;i<9;i++){ for(intj=0;j<9-i;j++){ if((UserInput=='D')&& (strcmp(namelist[j],namelist[j+1])==-1))

Swap(namelist[j],namelist[j+1]); if((UserInput=='U')&& (strcmp(namelist[j],namelist[j+1])==1))

Swap(namelist[j],namelist[j+1]); }}charUserInput?4242//...intUserInput;//用整數(shù)-1和1來表示排序準(zhǔn)則Scanf(“%d”,&UserInput);assert(UserInput==-1||UserInput==1);for(inti=0;i<9;i++){ for(intj=0;j<9-i;j++){ if(strcmp(namelist[j],namelist[j+1])

==UserInput)

Swap(namelist[j],namelist[j+1]); }}//...4343下面,任務(wù)又改變啦!領(lǐng)導(dǎo)和觀眾都強(qiáng)烈要求按歌手類型分開比賽,以保證公平競(jìng)爭(zhēng)。即,會(huì)有多個(gè)不同人數(shù)的姓名數(shù)組需要排序處理。程序該如何修改呢?如通俗歌手有20人,美聲歌手有15人。4444難道是這樣么?不過…有點(diǎn)…for(inti=0;i<19;i++)//通俗歌手排序 for(intj=0;j<19-i;j++) if(strcmp(NL_1[j],NL_1[j+1])

==UserInput)

Swap(NL_1[j],NL_1[j+1]);for(inti=0;i<14;i++)//美聲歌手排序 for(intj=0;j<14-i;j++) if(strcmp(NL_2[j],NL_2[j+1])

==UserInput)

Swap(NL_2[j],NL_2[j+1]);4545冒泡泡的函數(shù)上場(chǎng)啦Voidbubble(charNL[][20],intnum,intUserInput){

for(inti=0;i<num-1;i++)

for(intj=0;j<num-1-i;j++)

if(strcmp(NL[j],NL[j+1])

==UserInput)

Swap(NL[j],NL[j+1]);}//...

bubble(NL_1,20,UserInput); bubble(NL_2,15,UserINput);4646voidbubble(inta[],intnum){

for(j=0;j<num-1;j++) {

for(i=0;i<num-1-j;i++)

{

if(a[i]<a[

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論