【文档说明】C语言程序设计教程第5章循环程序设计课件.ppt,共(100)页,3.014 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44520.html
以下为本文档部分文字说明:
5.1循环结构循环结构的特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。注意两个概念:1、循环条件给定的条件称为循环条件2、循环体反复执行的程序段称为循环体在C语言中,实现循环结构的语句主要有3种:5.1循环结构•for语句•
while语句•do…While语句5.1.2for循环语句for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。5.1循环结构表达式2表达式1语句表达式3零非零for(表达式1;表达式2;表达3)语句;
(1)当循环体语句组仅由一条语句构成时,可以不使用复合语句形式,如:for(i=1;i<=100;i++)*psum+=i;(2)对于表达式1,既可以是给循环变量赋初值的简单表达式,也可以是其它表达式(如逗号表达式),如:for(*psum=0,i=1;i<=100;i++)*
psum+=i;(3)表达式2的值是一个逻辑量,除一般的关系(或逻辑)表达式外,也允许是数值(或字符)表达式。如下面的程序段就是输出1—100所有的自然数:for语句的使用说明5.1循环结构intx=100;for(;x;x--)prin
tf(“%d,”,x);(4)三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略,但是表达式间的分号不能省。如在下面的例子中,已定义整型变量:inta=0,n=50;int*pn=&n;a.在循环变量
已赋初值时,可省去表达式1,则:for(;*pn>0;(*pn)--,a++)printf("%d",a*2);5.1循环结构5.1循环结构b.如果省略表达式2,相当于第二个表达式的值是1,即循环继续的条件一直成立,这时可能造成无
限循环(俗称死循环),那么应在其它位置设法结束循环(5.2节将介绍),下面就是一个死循环的例子:for(;;(*pn)--,a++)printf("%d",a*2);c.可以省略表达式3,这时可由循环体内的语句进行对循环变
量的调整,以控制循环次数。如:for(;*pn>0;){a++;5.1循环结构(*pn)--;printf("%d",a*2);}d.循环体也可以是空语句,称为空循环。如下面的程序段能实现计算从键盘输入的字符
数:intn=0;for(;getchar()!='\n';n++);/*循环体为空*/空循环有时可被用来产生延时,如:intt,time=10000;for(t=0;t<time;t++);表达式1
(控制变量的初始化):给循环变量赋初值,也允许在for语句外给循环变量赋初值,此时可以省略该表达式。表达式2(循环条件):一般为关系或逻辑表达式。表达式3通常可用来修改循环变量的值,一般是赋值语句。5.
1循环结构1.计算表达式1的值。2.计算表达式2的值,若值为真(非0)则执行循环体一次,否则跳出循环。3.然后再计算表达式3的值,转回第2步重复执行。表达式2语句非00语句求解表达式1求解表达式3for语句的执行过程for语句的执行过程:5.1循环结构在整个for循环过程中,表达式1
只计算一次。表达式2和表达式3则可能计算多次。循环体可能多次执行,也可能一次都不执行。5.1循环结构表达式2语句非00语句求解表达式1求解表达式3for语句的执行过程#include“stdio.h“main(){inti,sum=0;int*psum=∑for
(i=1;i<=100;i++){*psum+=I;}printf(“1+2+……+100=%d\n“,*psum);}例:求1~100的累加和.(用指针完成).5.1循环结构/*将累加器sum初始化为0*//*指针变量psum来指向sum,并将其初始化*//*实现累加*/5.1循环结构
例:一个球从100米高度自由落下,每次落地后反跳回原高度的一半再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?开始定义:反弹次数i,经过的距离length=100,每次反弹高度nheight=length/2i=2i<=10i++length+=nh
eight*2,nheight=nheight/2输出length、nheight结束5.1循环结构#include“stdio.h“main(){floatlength=100,nheight;inti;nheight=length/2;for(i=2;i<
=10;i++){length=length+2*nheight;nheight/=2;}printf("Thetotalis%g\n",length);printf("Theheightofthetenthis%gmeter.\n",nheight);}/*
第i次落地时共经过的米数*//*第i次反跳高度*/voidmain(){inti,n;floatt;printf("pleaseinputn(n>=0):");scanf("%d",&n);t=1.0
;/*给变量t赋初值*/for(i=1;i<=n;i++)t=t*i;printf("%d!=%f\n",n,t);}例.使用for循环语句求n!5.1循环结构3.4.1while语句执行过程是:计算表达式的值,当值为真(非0)时,执行循环体语
句。while语句的一般形式为:while(表达式)语句;其中表达式是循环条件,语句为循环体,若是多个语句则必须用{}组成复合语句。表达式语句非005.1循环结构计算<表达式>的值,若表达式的值为真(非0)时,则执行循环体语句;不断反复,直到表达式的值为假(0),则不执行循环体语句,而直接转向循
环体外的第一条语句。<语句>是循环反复执行的程序,称为“循环体”,当需要执行多条语句时,应使用“{}”括起来组成一个复合语句。while语句是先判断条件,后执行循环体,为“当型”循环,因此若条件不成立,有可能一次也不执行循环体。一般情况下,while型循环最适合于这种情况:知道控制
循环的条件为某个逻辑表达式的值,而且该表达式的值会在循环中被改变。说明:3.4循环结构例:求1~100的累计和。main(){intsum=0,i=1;while(n<=100){sum=sum+i;n++;}printf("S=%d",sum);}这
句不能缺少数据初始化:求和变量和计数变量一般赋0,求积变量一般赋13.4循环结构main(){intn=0;printf("Inputastring:\n");while(getchar()!='\n')n++;printf("Thenumberofinputcharactersis%d.\n",
n);}例:统计从键盘输入的一行字符的个数。3.4循环结构/*输入字符的同时判断其是否为换行符*/3.4.2do...while语句do-while语句的一般形式为:do语句;while(表达式);其中:语句是循环体,表达式是循环条件。表
达式语句非00执行过程是:先执行循环体语句一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环。3.4循环结构例:求解10!main(){inti=1;longfact=1;do{fact*=i;i
++;}while(i<=10);printf(“10!=%ld\n“,fact);}3.4循环结构/*将累乘器fact初始化为1*//*实现累乘*/例:用牛顿迭代法求方程2x3-4x2+3x-6=0,要求绝对误差小于10-5。
main(){floatx=1.5,x1;floatfx,fx1,diff;float*pdiff=&diff;do{fx=2*pow(x,3)-4*pow(x,2)+3*x-6;fx1=6*x*x-8*x+3;x1=x-fx/fx1;*p
diff=fabs(x1-x);x=x1;}while(*pdiff>1e-5);printf("方程2x^3-4x^2+3x-6=0的根为:x=%f\n",x1);}3.4循环结构/*练习指针的使用:指针pdiff指向变量diff*//*设解的
初值为x=1.5*/5.1三种循环语句比较for()while(){…}do{...}while();循环类型当型循环当型循环直到循环循环控制条件表达式2值非0表达式值非0表达式值非0循环变量初值在for语句行中在w
hile之前在do之前使循环结束表达式3循环体中使用专门语句循环体中使用专门语句5.1循环结构5.2break语句与continue语句5.2.1break语句形式break;说明跳出switch语句跳出本层循环语句如果有多层循环存在,break只跳出它所在的那一层循环语句,不影响
外层循环的执行不能用于循环语句和switch语句之外的任何其他场合5.2break语句与continue语句5.2.1continue语句形式continue;说明结束本次循环跳过循环体中余下的其他语句,接着进行下一次循环的判定只能用于循环语句中
5.2break语句与continue语句•break语句–跳出本层循环while(i<j){...if(i>100)break;...}•continue语句–结束本次循环while(i<j){...if(i>100)conti
nue;...}5.2break语句与continue语句例:对于表达式s=1+2+3+……+n,求满足s>100的n最小值。main(){ints=0,i=1;do{s+=i;if(s>100)break;i++;}while(1)
;printf(“满足s=1+2+3+……+n>100的最小的n是%d\n",i);}开始定义:自然数i=1和s=0s<=100i++YN输出i结束s+=i5.2break语句与continue语句main(){intn;printf(“100以内能被7整除的自然数有:\n")
;for(n=7;n<=100;n++){if(n%7!=0)continue;printf("%d",n);}printf(“\n“);}例:输出100以内能被7整除的自然数。开始定义:自然数n=7n<=100n++YN输出n结束n%7==0YN5.2break语句与continue语句
main(){intn;printf("100以内能被7整除的自然数有:\n");for(n=7;n<=100;n+=7)printf("%d",n);printf(“\n“);}练习for语句实现开始定义:自然数n=7n<=100n=n+7
N输出n结束Y3.3.5循环的嵌套•一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,称为多层循环。•三种循环(while循环、do-while循环和for循环)可以互相嵌套。•以下是合法的嵌套形式:while
(){┋while(){┋}}do{┋do{…}while();}while();for(;;){┋for(;;){…}}while(){┋do{…}while();┋}for(;;){┋while(){}┋}do{┋for
(;;){}}while();合法的嵌套形式:5.3循环的嵌套若要输出如下共3行、每行有5个‘*’的图案:********************inti,j;for(i=0;i<=3;i++){for(j=0;j<=4;j++)printf(“*“);printf(“\n“);
}inti,j;for(i=0;i<=3;i++){for(j=0;j<2*i+1;j++)printf(“*“);printf(“\n“);}****************如改成这样的话5.3循环的嵌套求1!+2!+3!+…+20!开始定义:int:I,j.
double:t,sumj=1,sum=0j<=20i=1,t=1i<=jt=t*ii=i+1sum=sum+t输出sum结束j=j+1AYNYNA5.3循环的嵌套main(){inti,j;doublet,sum=0;for(j=1;j<=20;j++){for(i=1,t
=1;i<=j;i++)t*=i;sum+=t;}printf("\n1!+2!+3!+…+20!=%g\n",sum);}/*计算每一项的值:求i的阶乘*//*循环:累加20项*//*变量t保存j!*/5.3循环的嵌套开始定义:int:I,nn=2n<=1
00i=2i<n输出n结束n=n+1AYAn%i==0t=t*iNYi>=nNNNYY例5-11输出2-100以内所有的素数。5.3循环的嵌套#include"stdio.h"main(){intn,i;printf(“100以内所有的素数为:\n“);for(n=2;n<=
100;n++){i=2;while(i<n){if(n%i==0)break;i++;}if(i>=n)printf("%4d",n);}printf(“\n“);}/*输出素数*//*能整除:n不是素数,跳出while语句,此时i<n*
/用for与while语句的循环嵌套来输出100以内的素数。5.3循环的嵌套#include"math.h"#include"stdio.h"main(){intn,i,k;printf(“100以内所有的素数为:\n%4d“,2);for(n=3;n<=100;n+=2){k=sqrt(n);
for(i=2;i<=k;i++)if(n%i==0)break;if(i>k)printf("%4d",n);}printf("\n");}用for语句的循环嵌套来输出100以内的素数。5.4数组与字符串的使
用inti,data[100];for(i=0;i<100;i++)data[i]=i;或for(i=0;i<50;i++)data[i]=i+1;for(i=50;i<100;i++)data[i]=2*i;比如:5.
4数组与字符串的使用一维数组的输入与输出。i=i+1开始定义:intN,a[N],ii=0i<Ni=0i<Ni=i+1输入a[i]结束YNYN确定N整型数组a[N]控制变量i输出a[i]5.4数组与字符串的使用#defineN5#include<stdio.h>main()
{inti;inta[N];printf(“输入数组a(共%d个整数):“,N);for(i=0;i<N;i++)scanf(“%d“,&a[i]);printf(“数组a各元素为:\n“);for(i=0;i<N;i++)printf(“a[%d]=%d\n“,
i,a[i]);}/*说明了一个元素个数为5的整型数组*/5.4数组与字符串的使用求数组元素中的最大、最小值。确定N整型数组term[N]最大值max最小值min变量i开始定义:int:Nint:term[N]int:max,minmax=t
erm[N]min=term[N]i=1i<Nmax<term[i]结束Yi=i+1NY输入term的值max=term[i]min<term[i]max=term[i]NYN输出max输出minaa5.
4数组与字符串的使用#defineN10main(){intterm[N];/*说明一个元素个数为10的整型数组*/inti,max,min;/*max存放最大数,min存放最小数*/printf(“\n输入%d个整数:“,N);for(i=0;i<N;i
++)scanf(“%d“,&term[i]);max=term[0];/*将数组的第一个元素赋值给max*/min=term[0];/*将数组的第一个元素赋值给min*/for(i=1;i<N;i++){if(term[
i]>max)max=term[i];/*找最大值*/if(term[i]<min)min=term[i];/*找最小值*/}printf(“最大数为%d,最小数为%d\n“,max,min);}5.4数组与字符串的使用输出
Fibonacci数列的前40个数,并将其存入到一个数组Fib中。该数列的生成方法为:Fib[0]=1,Fib[1]=1,Fib[n]=Fib[n-1]+Fib[n-2](n>=2),即从第3个数开始,每个数均等于前2个数之和。开始定义:int:I;int:Fib
[N];int:f1,f2;i=2输出Fib[0];输出Fib[1];af1=Fib[0]=1;f1=Fib[0]=1;5.4数组与字符串的使用i<40结束i=i+1Yi%5==0NYNaFib[i]=f1+f2
换行输出Fib[i]f1=f2;f2=Fib[i];5.4数组与字符串的使用#include"stdio.h"main(){intf1,f2,Fib[40];inti;f1=Fib[0]=1;/*定义并初始化数列的头2个数*/f2=Fib[1]=1;print
f("Fibonacci数列的前40个数为:\n");printf("%d,%d,",Fib[0],Fib[1]);/*输出头2个数*/for(i=2;i<40;i++){/*共40个数*/Fib[i]=f1+f2;if(i%5==0)printf("\n");/*每行
输出5个数,换行*/printf("%d,",Fib[i]);/*输出当前的那个数*/f1=f2;f2=Fib[i];}printf("\n");}5.4数组与字符串的使用•一个学习小组有5个人,每个人有英语、数学、C语言程
序设计三门课的考试成绩。求每个人的平均成绩、各门课的平均成绩i<5结束Yj<3NYNaj=0输入score[i][j]f1=f2;f2=Fib[i];开始定义:intscore[5][3];intvp[5],vc[3],i,j;ai=0vc[j]=vc[j]+score
[i][j]vp[i]=vp[i]+score[i][j]i=i+1输出vp[],vc[]每个学生的平均成绩vp[],每门课的平均成绩vc[]5.4数组与字符串的使用#include"stdio.h"main(){inti,j;intvc[3]={0},vp[5]={0},s
core[5][3];printf("请输入5个学生英语数学C语言的成绩:\n");for(i=0;i<5;i++){printf("第%d个学生成绩:",i+1);for(j=0;j<3;j++){scanf("%d",&score[i][j]);vc[j]=vc[j]+score[i][j];
vp[i]=vp[i]+score[i][j];}}printf("课程平均成绩是:");for(j=0;j<3;j++)printf("%d",vc[j]/5);for(i=0;i<5;i++)printf("\n第%d个学生的平均成绩是%d",
i+1,vp[i]/3);}5.4数组与字符串的使用将字符串a中第1、3、5…个字符赋给另一个字符串b,然后输出a和b的内容。m<length结束m=m+2YNab[n++]=a[m]输出:字符串a,b开始定义:in
t:N;char:a,b;int:m,n,length;m=n=0;输入字符串aa5.4数组与字符串的使用#defineN100main(){chara[N]={’\0’},b[N]={0};/*初始化第一个元素,值为0,即字符‘\0’*/intm,n,length;printf("请输入字符
串a(长度<100):\n");gets(a);length=strlen(a);for(m=0,n=0;m<length;m+=2)b[n++]=a[m];printf("由a中第1、3、5......位置上字符构成的字符串b为:");puts(b);}5.5.1指针与数组datadat
a+1„„data+i数组元素data[0]data[1]„„data[i]地址存储空间data+i==&data[i]两边同时作取内容运算得:*(data+i)==*(&data[i])即*(data+i)==data[i]或data[i]==*(data+i)5.5.1指针与数组输出数组的全部
元素。main(){inta[6]={0,3,6,9,12,15};inti,*p;printf("用三种方法输出数组的元素:\n");printf("用下标标记元素:");for(i=0;i<6;i++)/
*下标法*/printf("%d",a[i]);printf("\n用数组名+元素位置表示元素:");for(i=0;i<6;i++)/*通过数组名计算数组元素地址*/printf("%d",*(a+i));printf("\n用指针表示元素:");for(p=a;p<a+6
;p++)/*用指针变量指向数组元素*/printf("%d",*p);putchar(’\n’);}5.5.1指针与数组利用指针求数组元素中的最大值和最小值#defineN10main(){intterm[10],*p=term;/*定义一个元素个数为10的整型数组*//*p指向此数组
*/inti,max,min;/*max存放最大数,min存放最小数*/printf(”\n输入%d个整数:”,N);for(i=0;i<N;i++)scanf(“%d“,(p+i));max=*p;/*将数组的第一个元素赋值给max*
/min=*p;/*将数组的第一个元素赋值给min*/for(i=1;i<N;i++){if(*(p+i)>max)max=*(p+i);if(*(p+i)<min)min=*(p+i);}printf(”最大数为%d,最小数为%d\n”,
max,min);}5.5.2指针与字符串1.字符指针与字符串2.字符指针的初始化•字符指针可以初始化,如•char*ptr="Thisisastring";•等价于:•char*ptr;•ptr="Thisisastring";•char*p1,*
p2;•chars[]="Astring";•再执行语句:•p1="Anotherstring";•p2=s;5.5.2指针与字符串用字符指针来处理字符串的例子。开始定义:字符数组str1,str2,str3;字符指针pstr1,pstr2用gets()函数输入str2用sca
nf()函数输入str3a将“Thisisastring.”赋给str1;使pstr1指向“Thisisanotherstring.”用printf()函数输出str2用puts()函数输出str3用printf()函数输出str15.5.2指针与字符串*pstr1!=0结
束YNYNapstr1++使pstr1指向“Thisisthethirdstring.”用printf()函数输出字符*pstr1用printf()函数输出字符*pstr2,同时:pstr2++*pstr2!=05.5.2指针与字符串#include<stdio.h>main(
){charstr1[]="Thisisastring.";charstr2[100],str3[100];char*pstr1="Thisisanotherstring.";char*pstr2;pri
ntf("请输入一个字符串:\n");gets(str2);/*输入方式1*/printf("请再输入一个字符串:\n");scanf("%s",str3);/*输入方式2*/printf("输入的两个字符串是:\n
%s\n和:",str2);puts(str3);/*输出方式1*/printf("另有其它字符串:\n");printf("%s\n",str1);/*输出方式2*/while(*pstr1){/*
输出方式3*/printf("%c",*pstr1);pstr1++;}printf("\n");pstr2="Thisisthethirdstring.";do{/*输出方式4*/printf("%c",*(pstr2++)
);}while(*pstr2);printf("\n");}5.5.2指针与字符串例5-19用字符指针来处理字符串的例子。5.5.2指针与字符串例5-20将字符串str1的内容复制到str2中,不得调用库函数strcpy()。开始定义:字符串str1、st
r2,控制变量ii=0输入str1的值a*(str1+i)!=0结束YNa*(str2+i)=*(str1+i)添加str2的结束符输出:str1,str2i=i+15.5.2指针与字符串main(){charstr1[100],str2[100];inti=0;printf("请输入一个字
符串:\n");gets(str1);while(*(str1+i)!='\0'){/*判断是否为结束标志*/*(str2+i)=*(str1+i);/*复制每个字符*/i++;}*(str2+i)=0;/*添加字符串结束
符*/printf("复制的字符串为:%s\n",str2);}5.5.2指针与字符串其中实现字符串复制功能的程序段为while(*(str1+i)!='\0'){*(str2+i)=*(str1+i);i++;}*(str2+i)=0;/*添加结束符*/此程序段也可改为fo
r(;*(str2+i)=*(str1+i);i++);/*循环体为空语句*/或for(;(*(str2+i)=*(str1+i))!=0;i++);或while(*(str2+i)=*(str1+i))i++;5.5.2指针与字符串例
5-21编一程序,将两个字符串连接起来,不使用strcat()函数。开始定义:字符串str1、str2,str1字符数i,str2字符数j计算str1的长度i输入str1、str2a*(str2+j)==0结束YNa*(str1+i)=*(s
tr2+j)添加连接后字符串的结束符:*(str1+i)=‘\0’输出:str1i=i+1j=j+1j=05.5.2指针与字符串#include<stdio.h>main(){charstr1[80],str2[80];inti=0,j;printf("请输入两个字符
串:\n");gets(str1);gets(str2);while(str1[i]!='\0')i++;/*求str1的长度*/j=0;while(str2[j]!='\0'){str1[i]=str2[j];i++;j++;}str1[i]='\0';printf("两字符串连接后的新字
符串为:\n%s\n",str1);}5.5.2指针与字符串在程序中,求字符串str1的长度也可通过调用函数strlen()来实现:i=strlen(str1);当然,在程序的头部应增加:#include<string.h>一
个字符串既可使用字符串指针变量来表示,也可以使用字符数组来表示,而且这两种方式都可实现字符串的存储和运算,但两者是有区别的。例如,对字符串用指针方式可进行如下定义和初始化:5.5.2指针与字符串char*ps="CLanguage";可以改写为:char*ps;ps="CLanguage"
;而对用数组方式定义的字符串:charst[]={"CLanguage"};则不能写为:charst[20];st={"CLanguage"};而只能对字符数组的各元素逐个赋值,或用strcpy()进行
字符串的复制。5.5.3指针数组、数组指针、二级指针与二维数组*指针数组说明的一般形式为:类型说明符*数组名[数组长度]例如:int*pa[3];•1.指针数组pa[0]pa[1]pa[2]pa[0][0]pa[0][1]…pa[1][0]pa[1][1]pa[1][2]…...pa[2]
[0]5.5.3指针数组、数组指针、二级指针与二维数组*指针数组常用来表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址。指向字符串的指针数组的初始化很简单,例如:char*name[]={"Illegalday","Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday","Sunday"};完成这个初始化赋值之后,name[0]即指向字符串“Illegalday”,name[1]指向了“Monday”,......。5.5.3指针数组、数组指针、二级指针与二维数组*•2.数组
指针表示一个指向二维数组的指针变量,可理解为指向一个行数未定而每行有3列的二维数组。图5-20表示了这种关系:*p*(p+1)*(p+2)pa[0][0]pa[0][1]pa[0][2]pa[1][0]pa[
1][1]pa[1][2]pa[2][2]pa[2][1]pa[2][0]*(p+3)...………...…在C语言中,还有一种变量,即数组指针变量。例如:int(*p)[3];5.5.3指针数组、数组指针、二级指针与二维数组*•3.二级指针(a)取钥匙开柜子取物:仓库钥匙柜子钥匙物资存取物资1
00053689344求值:*ptr(b)二级指针的求值:保管员打开仓库仓库中的抽屉打开柜子储物柜pp:求一级指针*pp(单元1000):求i的地址:ptr=&i**pp(单元5368):0123443612•以5个元素为例说明冒泡排序•位置0~位置4的元素初始排列
如右下方所示5.6.1冒泡排序法元素下标:(01234)初始数据:436125.6排序冒泡排序方法•第一轮:令位置0和位置1的元素比较,若位置0的元素大,则交换交换01234436120123434612冒泡排序方法•第一轮:令位置1和位置2的元素比较,若位置1的元素小,则不交换不交换0123
4346120123434612冒泡排序方法•第一轮:令位置2和位置3的元素比较,若位置2的元素大,则交换交换01234346120123434162冒泡排序方法•第一轮:令位置3和位置4的元素比较,若位置3的元素大,则交换交换0123434162012343
4126冒泡排序方法•第二轮:令位置0和位置1的元素比较,若位置0的元素小,则不交换不交换01234341260123434126冒泡排序方法•第二轮:令位置1和位置2的元素比较,若位置1的元素大,则交换交换01234341260123431426冒泡排序方法•第二轮:令位置2和位置3的元素
比较,若位置2的元素大,则交换交换01234314260123431246冒泡排序方法•以5个元素为例说明冒泡排序,存放每个元素的位置以序号进行标记•经过4趟冒泡排序后,位置0~位置4中的元素排列如下所示01234123465.6排序从键盘输入任意的10个整数,并用冒泡法将其按升序排
列后输出。开始定义:常量N=10,数组a[N],临时变量t,控制变量i,ji=0ai<N-1j<N-i-1结束Yi=i+1NYa[j]>a[j+1]交换a[j]与a[j+1]NYN输出升序排列的数列a[N]aj=0i=i+1输入所有的整5.6排序#include"s
tdio.h"#defineN10main(){inta[N],i,j,t;printf("请输入%d个任意的整数:\n",N);for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<N-1;i+
+)for(j=0;j<N-i-1;j++)if(a[j+1]<a[j]){t=a[j];a[j]=a[j+1];a[j+1]=t;}printf("这些数按升序排列后,为:\n");for(i=0;i<N;i++)printf("%6d",a[i]);printf("\n")
;}5.6排序如果要进行降序排列,则将程序中数组元素交换前的判断表达式a[j+1]<a[j]改为a[j+1]>a[j]即可。如果在程序中要用指针来表示数组元素,则程序源代码可改为:5.6排序#incl
ude"stdio.h"#defineN10main(){inta[N],i,j,t,*pa;printf("请输入%d个任意的整数:\n",N);pa=a;for(i=0;i<N;i++)scanf("%d",(pa+i));f
or(i=0;i<N-1;i++)for(j=0;j<N-i-1;j++)if(*(pa+j+1)<*(pa+j)){t=*(pa+j);*(pa+j)=*(pa+j+1);*(pa+j+1)=t;}printf("这些数按升序排列后,为:\n");for(i=0;i<N;
i++)printf("%6d",*(pa+i));printf("\n");}5.6排序•5.6.2选择排序法元素下标:(01234)初始数据:436120123443612•以5个元素为例说明选择排序•位置0~位置4的元素初始排列如右下
方所示选择排序法第一轮:位置0到位置4中位置3是最小的,则位置0与位置3交换交换01234436120123413642选择排序法第二轮:位置1到位置4中位置4是最小的,则位置1与位置4交换交换012341
36420123412643选择排序法第三轮:位置2到位置4中位置4是最小的,则位置2与位置4交换交换01234126430123412346选择排序法第三轮:位置3到位置4中位置3是最小的,则不交换不交换01234123460123412346选择排序法至此,所
有的数据都已按升序排列。01234123465.6排序例5-23用选择法将从键盘输入的10个学生的数学成绩按升序排列。开始定义:常量N=10,成绩数组a[N],指针*pa(指向a),临时变量t,控制变量i,j,ki=0ai<N
-1j<N结束Yj=j+1NY*(pa+j)<*(pa+k)k=jNYN输出升序排列的成绩a[N]ak=i,j=i+1交换:*(pa+k)、*(pa+i)输入全部成绩j<Ni=i+1NY5.6排序#include"stdio.h"#defineN10main(){floata[N],*pa,
t;inti,j,k;pa=a;printf("请输入%d个学生的成绩:\n",N);for(i=0;i<N;i++)scanf("%f",pa+i);for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if(*(pa
+j)<*(pa+k))k=j;if(k!=i){t=*(pa+i);*(pa+i)=*(pa+k);*(pa+k)=t;}}printf("这%d个学生成绩从低到高为:\n",N);for(i=0;i<N;i
++)printf("%g",*(pa+i));printf("\n");}5.6排序如果要进行降序排列,则将程序中的判断表达式*(pa+j)<*(pa+k)作如下修改即可:*(pa+j)>*(pa+k)5.6.3直接插入排序法例如,要把下列数据按升序排列,用直接插入排序过程可表示如下,其中括号
[]中的数表示已排好序:元素下标:(01234)初始数据:[5]3412第1步插入:[35]412第2步插入:[345]12第3步插入:[1345]2第4步插入:[12345]5.6.3直接插入排序法例5-24用插入法将从键盘
输入的10个学生姓名按降序排列。输出排序后的学生姓名name输入所有姓名到namem<STD_NUMNYm=1name[m]àtempn=0insert_pos=nname[n]<name[m]Nn++n<mNYYname[n-1]->name[n]n--NYin
sert_pos!=mn=mn>insert_posYN定义:学生数量STD_NUM=10,姓名(字符串数组)name,临时变量temp,插入点insert_pos,控制变量m,ntemp->name[insert_pos]m=m+1开始结束5.6.3直接插入排序法
#include"stdio.h"#include"string.h"#defineSTD_NUM10#defineNAME_LENGTH30main(){charname[STD_NUM][NAME
_LENGTH];chartemp[NAME_LENGTH];intm,n,insert_pos;printf("Pleaseinput%dstudents'name:\n",STD_NUM);for(m=0;m<STD_NUM;m++)gets(
name[m]);for(m=1;m<STD_NUM;m++){strcpy(temp,name[m]);for(n=0;n<m;n++)if(strcmp(name[n],name[m])<0)break;insert_pos=n;if(insert_pos!=m){for(n=m;n>
insert_pos;n--)strcpy(name[n],name[n-1]);strcpy(name[insert_pos],temp);}}printf("Thesortednameare:\n");for(m=0;m<STD_NUM;m++)puts(name[m])
;printf("\n");}5.6.3直接插入排序法start=0,end=NUM-1,find=0start<=endYNpos=(start+end)/2end=pos-1dd<data[pos]Ndd>data[pos]YNYfind=1start=pos+1find==1YN输
出dd的位置pos输出:未找到输入dd定义:数列长度NUM,数组data,待找数据dd,查找位置pos,查找范围开始点start,结束点end,找到标记flag,控制变量m,n开始结束例5-25查找一个数在降序数列中的位置。5.6.4
二分法查找5.6.4二分法查找#include“stdio.h“#defineNUM10main(){intdd,data[NUM]={726,465,444,321,309,233,165,98,59,42};intm,s
tart,end,pos,find=0;printf(“已有数列为:\n”);for(m=0;m<NUM;m++)printf(”%d”,data[m]);printf(”\n请输入要查找的数:\n”);scanf(”%d”,&dd);start=0
;end=NUM-1;do{pos=(start+end)/2;/*中间点*/if(dd>data[pos])end=pos-1;/*查找范围结束点往前移*/elseif(dd<data[pos])start=pos+1;/*
查找范围起始点往后移*/else{find=1;/*找到*/break;}}while(start<=end);/*start<=end表示可继续查找*/if(find)printf(”%d位于数列的第%d个位置上。\n”,dd,pos+1);elseprintf(”%d不在数列中。\
n”,dd);}5.6.4二分法查找或:如果原数列是升序排列,则将if(dd>data[pos])end=pos-1;elseif(dd<data[pos])start=pos+1;改为if(dd>data[pos])start=pos
+1;elseif(dd<data[pos])end=pos-1;5.6.4二分法查找例5-26用插入排序法对十个国家的名称按升序排列。输出排序后的国家名称countryname输入所有国家名称到countrynamem<NUMNYm=1countryn
ame[m]->tempstart=0,end=m-1,find=0insert_pos=pos+1countryname[n-1]->countryname[n]n--n=mn>insert_posYN定义:NUM,指针数组countryname,临时
变量字符型指针temp,插入点insert_pos,查找位置pos,start,end,找到标记flag,比较结果comp,控制变量m,ntemp->name[insert_pos]m=m+1start<=end
YNpos=(start+end)/2end=pos-1Ntemp>countryname[pos]YNYfind=1start=pos+1find==1insert_pos=end+1temp<countryname[pos]开始结束YN5.6.4二分法查找5.6.4二分法查找#includ
e"stdio.h"#include“string.h“#defineNUM10main(){charname[NUM][20],*countryname[20],*temp,strtemp[20];intm,n,start,end,pos,insert_p
os;intcomp,find;temp=strtemp;/*初始化指针*/for(m=0;m<NUM;m++)countryname[m]=name[m];/*初始化指针*/printf("Pleaseinput%dcoun
tries'name:\n",NUM);for(m=0;m<NUM;m++)gets(countryname[m]);for(m=1;m<NUM;m++){strcpy(temp,countryname[m]);/*将待插入数据保存到temp*/start=
0;end=m-1;find=0;do{/*查找插入点*/pos=(start+end)/2;comp=strcmp(temp,countryname[pos]);/*比较两个字符串大小*/if(comp>0)start=
pos+1;elseif(comp<0)end=pos-1;else{find=1;break;}}while(start<=end);if(find)insert_pos=pos+1;/*找到插入点*/elseinsert_pos=end+1;/*未找到插入点start=e
nd+1*/if(insert_pos<m){for(n=m;n>insert_pos;n--)/*插入前移动插入点后面的数据:*/strcpy(countryname[n],countryname[n-1]);strcpy(countryname[insert_pos],temp);/
*插入原先保存的数据*/}}printf("Thecountriesare:\n");for(m=0;m<NUM;m++)printf("%s",countryname[m]);/*输出排序后的数列*/
printf("\n");}5.6.4二分法查找