教学相关函数-循环数组指针_第1页
教学相关函数-循环数组指针_第2页
教学相关函数-循环数组指针_第3页
教学相关函数-循环数组指针_第4页
教学相关函数-循环数组指针_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

11关于数组、指针、函数

的综合讨论(1)2011.05.2022任务3:姓名排序电视歌手大奖赛开赛报名时,由于人数较多,一些参赛信息需要及时录入计算机并用计算机进行管理。其中一个很重要的工作就是:要按选手姓名(汉语拼音)排序后编号,以决定选手比赛的顺序。请你编程实现对姓名拼音串按英文字典顺序排序的程序。为测试程序,假定共有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];//数组下标从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];//数组下标从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];//数组下标从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先看看整数数组的冒泡算法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])//若小数在前交换

{

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("请输入待排序的数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++)

//轮(遍,趟)数=元素数目-1 { 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); } } }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) {

//同前省略 } } }比较关系符改为小于号,即按字典逆序排序姓名。1515如何按字典逆序来排序姓名 for(inti=0;i<9;i++)

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

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

0) {

//同前省略 } } }比较关系符改为小于号,即按字典逆序排序姓名。如何根据用户输入来决定按何种次序排序姓名呢?1616可以用一个变量来记录用户的输入,根据输入选择来判定用户是想正逆排序姓名还是想逆序排序姓名。该变量的类型可以是?排序准则的动态变化1717可以用一个变量来记录用户的输入,根据输入选择来判定用户是想正逆排序姓名还是想逆序排序姓名。该变量的类型可以是:整数类型int字符类型char。。。排序准则的动态变化为什么这些类型都可以?假设使用charUserInput;来记录用户选择:'U'表示升序,'D'表示降序1818排序准则的动态变化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);

} }}怎么定义这个函数呢?Swap(namelist[j],namelist[j+1]);Swap(namelist[j],namelist[j+1]);2626Swap(…)函数的定义注意到:调用该函数时,实参是namelist[j]和namelist[j+1],它们分别对应二维数组变量namelist的第j“行”和第j+1“行”二维数组的“行变量”是一个数组,所以有://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(…)函数的定义注意到:调用该函数时,程序中的实参是a[i]和a[i+1],它们分别对应一维数组变量a的第i和第i+1个元素一维整数数组的元素,是一个整数,其类型是整数类型故有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("请输入待排序的数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;}依样画葫芦可惜啊!程序结果并不正确!3333BUG(问题)在哪里?voidSwap(intfirst,intsecond)

{

intp;

p=first;

first=second;

second=p;}变量first和second是函数Swap的形式参数,该函数被调用时,实参的值是被赋值给形参的,即相当于是复制了一份。所以,在函数Swap中交换的是“复制品”之间内容的交换,并不影响实参的内容(值)!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比较实参与形参的内存单元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函数调用前函数调用时函数调用后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]); }}程序代码还能做进一步的简化吗?还是回到姓名排序(二维数组)的问题上来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;//用整数-1和1来表示排序准则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下面,任务又改变啦!领导和观众都强烈要求按歌手类型分开比赛,以保证公平竞争。即,会有多个不同人数的姓名数组需要排序处理。程序该如何修改呢?如通俗歌手有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冒泡泡的函数上场啦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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论