




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
11關(guān)于數(shù)組、指針、函數(shù)
的綜合討論(1)2011.05.2022任務(wù)3:姓名排序電視歌手大獎賽開賽報名時,由于人數(shù)較多,一些參賽信息需要及時錄入計算機并用計算機進行管理。其中一個很重要的工作就是:要按選手姓名(漢語拼音)排序后編號,以決定選手比賽的順序。請你編程實現(xiàn)對姓名拼音串按英文字典順序排序的程序。為測試程序,假定共有10名選手,選手姓名拼音最長不超過20個英文字符,且中間無空格。引子33#include<stdio.h>voidmain()
{ charnamelist[10][20]; for(inti=0;i<10;i++)
{ printf("inputthe%dsingername:“,i); scanf(“%s”,&namelist[i]); }
//此處代碼省略(見后)-用冒泡排序法對姓名進行排序 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]); }
//此處代碼省略(見后)-用冒泡排序法對姓名進行排序 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]); }
//此處代碼省略(見后)-用冒泡排序法對姓名進行排序 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]); }
//此處代碼省略(見后)-用冒泡排序法對姓名進行排序
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趟{
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("請輸入待排序的數(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ù)=元素數(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)系符改為小于號,即按字典逆序排序姓名。1515如何按字典逆序來排序姓名 for(inti=0;i<9;i++)
{ for(intj=0;j<9-i;j++)
{ if(strcmp(namelist[j],namelist[j+1])<
0) {
//同前省略 } } }比較關(guān)系符改為小于號,即按字典逆序排序姓名。如何根據(jù)用戶輸入來決定按何種次序排序姓名呢?1616可以用一個變量來記錄用戶的輸入,根據(jù)輸入選擇來判定用戶是想正逆排序姓名還是想逆序排序姓名。該變量的類型可以是?排序準(zhǔn)則的動態(tài)變化1717可以用一個變量來記錄用戶的輸入,根據(jù)輸入選擇來判定用戶是想正逆排序姓名還是想逆序排序姓名。該變量的類型可以是:整數(shù)類型int字符類型char。。。排序準(zhǔn)則的動態(tài)變化為什么這些類型都可以?假設(shè)使用charUserInput;來記錄用戶選擇:'U'表示升序,'D'表示降序1818排序準(zhǔn)則的動態(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');
如果輸入不合法,則程序會以崩潰的方式退出。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);
}
} }}程序代碼還能簡化使之更清晰嗎?2121程序代碼的簡化
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程序代碼的簡化
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判斷,可合成一個!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);
} }}程序代碼還能做進一步的簡化嗎?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);
} }}怎么簡化?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);
} }}怎么定義這個函數(shù)呢?Swap(namelist[j],namelist[j+1]);Swap(namelist[j],namelist[j+1]);2626Swap(…)函數(shù)的定義注意到:調(diào)用該函數(shù)時,實參是namelist[j]和namelist[j+1],它們分別對應(yīng)二維數(shù)組變量namelist的第j“行”和第j+1“行”二維數(shù)組的“行變量”是一個數(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ù)時,程序中的實參是a[i]和a[i+1],它們分別對應(yīng)一維數(shù)組變量a的第i和第i+1個元素一維整數(shù)數(shù)組的元素,是一個整數(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("請輸入待排序的數(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)用時,實參的值是被賦值給形參的,即相當(dāng)于是復(fù)制了一份。所以,在函數(shù)Swap中交換的是“復(fù)制品”之間內(nèi)容的交換,并不影響實參的內(nèi)容(值)!3434驗證一下#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);
//同前省略}進一步驗證3636比較實參與形參的內(nèi)存單元3737如何改正這個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ù)調(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]); }}程序代碼還能做進一步的簡化嗎?還是回到姓名排序(二維數(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)和觀眾都強烈要求按歌手類型分開比賽,以保證公平競爭。即,會有多個不同人數(shù)的姓名數(shù)組需要排序處理。程序該如何修改呢?如通俗歌手有20人,美聲歌手有15人。4444難道是這樣么?不過…有點…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ù)上場啦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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育大數(shù)據(jù)提升教學(xué)質(zhì)量的創(chuàng)新路徑
- 如何運用教育技術(shù)提升企業(yè)內(nèi)訓(xùn)中的混合式學(xué)習(xí)效果研究報告
- 2025年房屋整體質(zhì)量無損檢測分析系統(tǒng)合作協(xié)議書
- 學(xué)生心理健康與學(xué)校教育的融合發(fā)展
- 商業(yè)視角下的數(shù)字化教學(xué)設(shè)計與實施策略
- 醫(yī)療心理輔導(dǎo)在疾病康復(fù)中的作用
- 提升教學(xué)質(zhì)量5G網(wǎng)絡(luò)在教育技術(shù)中的應(yīng)用策略
- 合同與信息管理類
- 教育園區(qū)的辦公空間與智慧圖書館建設(shè)
- 基于AI的教學(xué)管理系統(tǒng)開發(fā)與實踐研究報告
- 監(jiān)獄反恐防暴培訓(xùn)
- GA/T 2150-2024出入境證件智能簽注設(shè)備
- 初中數(shù)學(xué)課后作業(yè)設(shè)計問題及優(yōu)化探討
- 檔案庫房安全
- 醫(yī)療機構(gòu)感染預(yù)防與控制基本制度解讀
- 星級綠色建筑評價評分表
- DB14-T 3164-2024 公路超高性能混凝土(UHPC)護欄應(yīng)用技術(shù)規(guī)程
- 9.2 中心對稱與中心對稱圖形 同步課件
- 2024年110KV變電站施工及設(shè)備安裝合同
- 全國道德與法治教學(xué)研究活動一等獎?wù)n例:《從“中國制造”到“中國創(chuàng)造”》教學(xué)詳案(四下)
- 慢性化膿性中耳炎護理查房
評論
0/150
提交評論