版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 洞見趨勢(shì) 解碼未來福利-2023年企業(yè)福利策略和管理趨勢(shì)調(diào)研報(bào)告
- 防震知識(shí)課件教學(xué)課件
- 設(shè)計(jì)營銷課件教學(xué)課件
- 股份置換協(xié)議書(2篇)
- 南京工業(yè)大學(xué)浦江學(xué)院《稅務(wù)稽查》2022-2023學(xué)年第一學(xué)期期末試卷
- 集控化驗(yàn)辦公樓施工組織設(shè)計(jì)
- 防災(zāi)減災(zāi)說課稿
- 宿淮高速收費(fèi)大棚施工組織設(shè)計(jì)
- 《軸對(duì)稱》說課稿
- 【初中化學(xué)】化石能源的合理利用課件-2024-2025學(xué)年九年級(jí)化學(xué)人教版(2024)上冊(cè)
- 廣東電力市場(chǎng)交易基本規(guī)則
- 零售業(yè)財(cái)務(wù)管理制度實(shí)用文檔
- 【本田轎車燈光系統(tǒng)常見故障分析及排除8200字(論文)】
- 甲苯磺酸瑞馬唑侖(瑞倍寧)的臨床應(yīng)用
- 博物館安全管理規(guī)章制度
- 學(xué)習(xí)、弘揚(yáng)焦裕祿精神
- 一年級(jí)上數(shù)學(xué)一課一練-講講算算|滬教版
- 中國智庫名錄類別索引-政府部門智庫
- 包蟲病防控方案
- GB/T 18513-2022中國主要進(jìn)口木材名稱
- 建筑公司組織關(guān)系架構(gòu)圖
評(píng)論
0/150
提交評(píng)論