当前位置:松语文学 > 其他类型 >C语言设计最新章节 > C语言设计TXT下载
错误举报

第 11 章

  m+i;

  i++;

  }

  对于 for 循环中语句的一般形式,就是如下的 while 循环形式:

  表达式 1;

  while(表达式 2)

  {语句

  表达式 3;

  }

  注意:

  1) for 循环中的“表达式 1(循环变量赋初值)”、“表达式 2(循环条件)”和“表达式 3(循

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。

  2) 省略了“表达式 1(循环变量赋初值)”, 表示不对循环控制变量赋初值。

  3) 省略了“表达式 2(循环条件)”, 则不做其它处理时便成为死循环。

  例如:

  for(i=1;;i++)sum=sum+i;

  相当于:

  i=1;

  while(1)

  {sum=sum+i;

  i++;}

  4) 省略了“表达式 3(循环变量增量)”, 则不对循环控制变量进行cāo作,这时可在语句体中

  加入修改循环控制变量的语句。

  例如:

  for(i=1;i<=100;)

  {sum=sum+i;

  i++;}

  5) 省略了“表达式 1(循环变量赋初值)”和“表达式 3(循环变量增量)”。

  例如:

  for(;i<=100;)

  {sum=sum+i;

  i++;}

  相当于:

  while(i<=100)

  {sum=sum+i;

  i++;}

  6) 3 个表达式都可以省略。

  例如:

  for(;;)语句

  相当于:

  while(1)语句

  7) 表达式 1 可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。

  例如:

  for(sum=0;i<=100;i++)sum=sum+i;

  8) 表达式 1 和表达式 3 可以是一个简单表达式也可以是逗号表达式。

  for(sum=0,i=1;i<=100;i++)sum=sum+i;

  或:

  for(i=0,j=100;i<=100;i++,j--)k=i+j;

  9) 表达式 2 一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其

  值非零,就执行循环体。

  例如:

  for(i=0;(c=getchar())!=’\n’;i+=c);

  又如:

  for(;(c=getchar())!=’\n’;)

  printf(“%c”,c);

  6.6 循环的嵌套

  【例 6.7】

  main()

  {

  int i, j, k;

  printf("i j k\n");

  for (i=0; i<2; i++)

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

  for(k=0; k<2; k++)

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  printf(“%d %d %d\n", i, j, k);

  }

  6.7 几种循环的比较

  1) 四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用 goto 型循

  环。

  2) while 和 do-while 循环,循环体中应包括使循环趋于结束的语句。for 语句功能最强。

  3) 用 while 和 do-while 循环时,循环变量初始化的cāo作应在 while 和 do-while 语句之前完

  成,而 for 语句可以在表达式 1 中实现循环变量的初始化。

  6.8 break 和 continue 语句

  6.8.1 break 语句

  break 语句通常用在循环语句和开关语句中。当 break 用于开关语句 switch 中时,可使

  程序跳出 switch 而执行 switch 以后的语句;如果没有 break 语句,则将成为一个死循环而

  无法退出。break 在 switch 中的用法已在前面介绍开关语句时的例子中碰到,这里不再举

  例。

  当 break 语句用于 do-while、for、while 循环语句中时,可使程序终止循环而执行循环

  后面的语句, 通常 break 语句总是与 if 语句联在一起。即满足条件时便跳出循环。

  【例 6.8】

  main()

  {

  int i=0;

  char c;

  while(1)         /*设置循环*/

  {

  c='\0';       /*变量赋初值*/

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  while(c!=13&&c!=27) /*键盘接收字符直到按回车或 Esc 键*/

  {

  c=getch();

  printf("%c\n", c);

  }

  if(c==27)

  break;     /*判断若按 Esc 键则退出循环*/

  i++;

  printf("The No. is %d\n", i);

  }

  printf("The end");

  }

  注意:

  1) break 语句对 if-else 的条件语句不起作用。

  2) 在多层循环中, 一个 break 语句只向外跳一层。

  6.8.2 continue 语句

  continue 语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue 语

  句只用在 for、while、do-while 等循环体中,常与 if 条件语句一起使用,用来加速循环。其

  执行过程可用下图表示。

  1) while(表达式 1)

  { ……

  if(表达式 2)break;

  ……

  }

  2) while(表达式 1)

  { ……

  if(表达式 2)continue;

  ……

  }

  【例 6.9】

  main()

  {

  char c;

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  while(c!=13)   /*不是回车符则循环*/

  {

  c=getch();

  if(c==0X1B)

  continue; /*若按 Esc 键不输出便进行下次循环*/

  printf("%c\n", c);

  }

  }

  6.9 程序举例

  π

  1

  1

  1

  【例 6.10】用 4

  = 1 ? + ? +

  3 5 7

  ...

  公式求π。

  N-S 流程图:

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  #include<math.h>

  main()

  {

  int s;

  float n,t,pi;

  t=1,pi=0;n=1.0;s=1;

  while(fabs(t)>1e-6)

  {pi=pi+t;

  n=n+2;

  s=-s;

  t=s/n;

  }

  pi=pi*4;

  printf("pi=%10.6f\n",pi);

  }

  【例 6.11】判断 m 是否素数。

  N-S 流程图:

  #include<math.h>

  main()

  {

  int m,i,k;

  scanf(“%d”,&m);

  k=sqrt(m);

  for(i=2;i<=k;i++)

  if(m%i==0)break;

  if(i>=k+1)

  printf(“%d is a prcom number\n”,m);

  else

  printf(“%d is not a prcom number\n”,m);

  }

  【例 6.12】求 100 至 200 间的全部素数。

  #include<math.h>

  main()

  {

  int m,i,k,n=0;

  for(m=101;m<=200;m=m+2)

  {

  k=sqrt(m);

  for(i=2;i<=k;i++)

  if(m%i==0)break;

  if(i>=k+1)

  {printf(“%d”,m);

  n=n+1;}

  if(n%n==0)printf(“\n”);

  }

  printf(“\n”);

  }

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  7 数组

  在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这

  些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数

  组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组

  元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。本

  章介绍数值数组和字符数组,其余的在以后各章陆续介绍。

  7.1 一维数组的定义和引用

  7.1.1 一维数组的定义方式

  在C语言中使用数组必须先进行定义。

  一维数组的定义方式为:

  类型说明符 数组名 [常量表达式];

  其中:

  类型说明符是任一种基本数据类型或构造数据类型。

  数组名是用户定义的数组标识符。

  方括号中的常量表达式表示数据元素的个数,也称为数组的长度。

  例如:

  int a[10];      说明整型数组 a,有 10 个元素。

  float b[10],c[20];  说明实型数组 b,有 10 个元素,实型数组 c,有 20 个元素。

  char ch[20];     说明字符数组 ch,有 20 个元素。

  对于数组类型说明应注意以下几点:

  1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型

  都是相同的。

  2) 数组名的书写规则应符合标识符的书写规定。

  3) 数组名不能与其它变量名相同。

  例如:

  main()

  {

  int a;

  float a[10];

  ……

  }

  是错误的。

  4) 方括号中常量表达式表示数组元素的个数,如 a[5]表示数组 a 有 5 个元素。但是其下

  标从 0 开始计算。因此 5 个元素分别为 a[0],a[1],a[2],a[3],a[4]。

  5) 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。

  例如:

  #define FD 5

  main()

  {

  int a[3+2],b[7+FD];

  ……

  }

  是合法的。

  但是下述说明方式是错误的。

  main()

  {

  int n=5;

  int a[n];

  ……

  }

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  6) 允许在同一个类型说明中,说明多个数组和多个变量。

  例如:

  int a,b,c,d,k1[10],k2[20];

  7.1.2 一维数组元素的引用

  数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟

  一个下标。下标表示了元素在数组中的顺序号。

  数组元素的一般形式为:

  数组名[下标]

  其中下标只能为整型常量或整型表达式。如为小数时,C 编译将自动取整。

  例如:

  a[5]

  a[i+j]

  a[i++]

  都是合法的数组元素。

  数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只

  能逐个地使用下标变量,而不能一次引用整个数组。

  例如,输出有 10 个元素的数组必须使用循环语句逐个输出各下标变量:

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

  printf("%d",a[i]);

  而不能用一个语句输出整个数组。

  下面的写法是错误的:

  printf("%d",a);

  【例 7.1】

  main()

  {

  int i,a[10];

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

  a[i]=i;

  for(i=9;i>=0;i--)

  printf("%d ",a[i]);

  }

  【例 7.2】

  main()

  {

  int i,a[10];

  for(i=0;i<10;)

  a[i++]=i;

  for(i=9;i>=0;i--)

  printf("%d",a[i]);

  }

  【例 7.3】

  main()

  {

  int i,a[10];

  for(i=0;i<10;)

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

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

  printf("%d ",a[i]);

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  printf("\n%d %d\n",a[5.2],a[5.8]);

  }

  本例中用一个循环语句给 a 数组各元素送入奇数值,然后用第二个循环语句输出各个奇

  数。在第一个 for 语句中,表达式 3 省略了。在下标变量中使用了表达式 i++,用以修改循

  环变量。当然第二个 for 语句也可以这样作,C语言允许用表达式表示下标。 程序中最后

  一个 printf 语句输出了两次 a[5]的值,可以看出当下标不为整数时将自动取整。

  7.1.3 一维数组的初始化

  给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动

  态赋值的方法。

  数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行

  的。这样将减少运行时间,提高效率。

  初始化赋值的一般形式为:

  类型说明符 数组名[常量表达式]={值,值……值};

  其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。

  例如:

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  int a[10]={ 0,1,2,3,4,5,6,7,8,9 };

  相当于 a[0]=0;a[1]=1...a[9]=9;

  C语言对数组的初始化赋值还有以下几点规定:

  1) 可以只给部分元素赋初值。

  当{ }中值的个数少于元素个数时,只 给前面部分元素赋值。

  例如:

  int a[10]={0,1,2,3,4};

  表示只给 a[0]~a[4]5 个元素赋值,而后 5 个元素自动赋 0 值。

  2) 只能给元素逐个赋值,不能给数组整体赋值。

  例如给十个元素全部赋 1 值,只能写为:

  int a[10]={1,1,1,1,1,1,1,1,1,1};

  而不能写为:

  int a[10]=1;

  3) 如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。

  例如:

  int a[5]={1,2,3,4,5};

  可写为:

  int a[]={1,2,3,4,5};

  7.1.4 一维数组程序举例

  可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合 scanf 函数逐个对

  数组元素赋值。

  【例 7.4】

  main()

  {

  int i,max,a[10];

  printf("input 10 numbers:\n");

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

  scanf("%d",&a[i]);

  max=a[0];

  for(i=1;i<10;i++)

  if(a[i]>max) max=a[i];

  printf("maxmum=%d\n",max);

  }

  本例程序中第一个 for 语句逐个输入 10 个数到数组 a 中。 然后把 a[0]送入 max 中。

  在第二个 for 语句中,从 a[1]到 a[9]逐个与 max 中的内容比较,若比 max 的值大,则把该

  下标变量送入 max 中,因此 max 总是在已比较过的下标变量中为最大者。比较结束,输出

  max 的值。

  【例 7.5】

  main()

  {

  int i,j,p,q,s,a[10];

  谭浩强   C 语言程序设计        2001 年 5 月 1 日

  printf("\n input 10 numbers:\n");

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

  scanf("%d",&a[i]);

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

  p=i;q=a[i];

  for(j=i+1;j<10;j++)

  if(q<a[j]) { p=j;q=a[j]; }

  if(i!=p)

  {s=a[i];

  a[i]=a[p];

  a[

  松语文学免费小说阅读_www.16sy.com