目录

  • 1 第一章  C语言概述
    • 1.1 第一节  C语言的产生和发展
    • 1.2 第二节  C语言的特点
    • 1.3 第三节  两个简单的C程序
    • 1.4 第四节  C程序的上机步骤
    • 1.5 第五节  Dev-C++介绍
    • 1.6 第六节  VC2010学习版介绍
    • 1.7 第七节  宏定义和文件包含
    • 1.8 本章小结
    • 1.9 本章单元测试
  • 2 第二章  基本数据类型与简单程序设计
    • 2.1 第一节  C语言的基本数据类型
    • 2.2 第二节  常量
    • 2.3 第三节  变量
    • 2.4 第四节  赋值语句
    • 2.5 第五节  数据输出
    • 2.6 第六节 数据输入
    • 2.7 第七节  运算符
    • 2.8 第八节  常用的数学函数
    • 2.9 第九节  顺序结构程序设计
    • 2.10 本章小结
    • 2.11 本章单元测试
  • 3 第三章  分支结构程序设计
    • 3.1 第一节  关系表达式和逻辑表达式
    • 3.2 第二节  if单分支语句
    • 3.3 第四节  if双分支语句
    • 3.4 第五节  if多分支语句
    • 3.5 第六节  case多分支语句
    • 3.6 第七节  分支结构程序设计实例
    • 3.7 本章小结
    • 3.8 本章单元测试
    • 3.9 书中本章习题答案
  • 4 第四章  循环结构程序设计
    • 4.1 第一节  为什么需要循环控制
    • 4.2 第一节  while循环
    • 4.3 第二节  do ... while循环
    • 4.4 第三节  for循环
    • 4.5 第四节  多重循环
    • 4.6 第五节  break语句和continue语句
    • 4.7 第六节  循环结构程序设计实例
    • 4.8 本章小结
    • 4.9 书中本章习题答案
  • 5 第五章 数组
    • 5.1 第一节  一维数组的定义和使用
    • 5.2 第二节  二维数组的定义和使用
    • 5.3 第三节  字符数组的定义和使用
    • 5.4 第四节  数组的应用举例
  • 6 第六章  函数
    • 6.1 第一节  函数的定义
    • 6.2 第二节  函数的调用
    • 6.3 第三节 数组作为函数参数
    • 6.4 第四节  变量的作用域
    • 6.5 第五节 变量的存储类别
    • 6.6 第六节 函数应用实例
  • 7 第七章 结构体和共用体
    • 7.1 第一节  概述
    • 7.2 第二节  定义结构体变量的方法
    • 7.3 第三节 结构体变量的引用
    • 7.4 第四节 结构体数组
    • 7.5 第五节 共用体
    • 7.6 第六节  结构体和共用体应用实例
  • 8 第八章 指针
    • 8.1 第一节  指针的概念
    • 8.2 第二节  指向简单变量的指针
    • 8.3 第三节 指向数组的指针变量
    • 8.4 第四节  指向字符串的指针变量
    • 8.5 第五节 指针作为函数参数
    • 8.6 第六节  指向结构体的指针变量
    • 8.7 第七节 指针应用实例
  • 9 第九章  文件
    • 9.1 第一节  文件概述
    • 9.2 第二节  文件的打开和关闭
    • 9.3 第三节 文件的读/写函数
    • 9.4 第四节  文件定位函数
    • 9.5 第五节  文件应用实例
  • 10 附录
    • 10.1 附录A  基本字符ASCII码表(0~127)
    • 10.2 附录B  运算符优先级表
    • 10.3 附录C 常用C库函数表
    • 10.4 附录D  编译常见错误提示
    • 10.5 附录E  常见C语言英语单词
    • 10.6 附录F  如何从十进制转换为二进制
    • 10.7 附录G  如何把二进制数转化为十进制数
    • 10.8 附录H  什么是编译器
    • 10.9 附录I  与编译器相关的几个知识点
第六节  循环结构程序设计实例

例4-9  判断一个数是否为素数。

分析:素数又称为质数,就是除了能被1和它本身整除之外,不能被其他自然数整除的自然数。例如,自然数“num=36”,如果要测试这个数是否为素数,从定义出发,就应对2∽35之间的数进行测试。但是,可以发现“36%2==0”时,也就意味着“36%18==0”,因此得到两个约数。对于36,这样的约数很多,如(2,18),(3,12),(4,9),(6,6),(9,4),(12,3),(18,2)。当找到(6,6)后,以后的约数就都重复了。从这个例子可以看出,循环大可不必运行到“num-1”,而是将循环的次数控制到 就行。

  1. #include  <stdio.h>

  2. #include  <math.h>

  3. main(  )

  4. {     int num, j, tag=1, m;

  5.       printf( "请输入一个自然数:" );

  6.       scanf( "%d", &num );

  7.       m=sqrt( num );

  8.       for( j = 2; j <= m; j++ )

  9.       if( num % j == 0)    // num 被 j 整除

  10.      {    tag=0;

  11.            break;

  12.       }

  13.       if( tag == 1)

  14.            printf("%d 是素数\n",num);

  15.       else

  16.             printf("%d 不是素数\n",num);

  17. }

运行结果如图4-13所示。




例4-10  找出100∽200之间的所有素数

分析:

  1. #include  <stdio.h>

  2. #include  <math.h>

  3. main( )

  4. {    int  num, j, tag, m, cnt=0;

  5.      for( num = 101; num < 200; num += 2)

  6.       {

  7.             tag = 1;

  8.             m = sqrt( num );

  9.             for( j = 2; j <= m; j++ )

  10.                   if( num % j == 0)

  11.                        {  tag = 0; break;  }

  12.              if( tag == 1 )

  13.              {

  14.                      printf(" %5d", num);

  15.                      cnt ++;

  16.                      if( cnt % 5 == 0)

  17.                             printf("\n");

  18.              }

  19.       }

  20. }




例4-11  输入两个整数,求它们的最大公约数。方法是采用”辗转相除法“,即反复模除取余,直到余数为 0。

  1. #include  <stdio.h>

  2. #include  <conio.h>

  3. main(  )

  4. {   int  a, b, r, tmp;

  5.     printf(" 输入两个整数:");

  6.     scanf("%d %d", &a, &b);

  7.     if( a<b)

  8.     {  tmp = a; a = b; b = tmp;   }

  9.     do

  10.     {

  11.           r = a % b;

  12.           a = b;

  13.           b = r;

  14.     } while( r );

  15.     printf("最大公约数为:%d\n", a);

  16.     getch( );

  17. }



表4-4  例4-11的执行过程
变量名rab变量名rab
初始状态
12575第 2 轮循环255025
第 1 轮循环507550第 3 轮循环0250


例4-12  “百鸡问题”是我国古代数学家张丘建在他编写的《算经》里提出的一个不定方程问题,即“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡。问鸡翁、母、雏各几何?”

分析:设公鸡(鸡翁)、母鸡(鸡母)和小鸡(鸡雏)各为x、y和z只。因为总共100钱,若全部买公鸡,最多买20只,显然x的变化范围在0~20之间。同理,y的变化范围在0~33间。所得到的不定方程应为:

(1)  x+y+z=100           方程1

(2)  5x+3y+z/3=100      方程2

计算程序为:

  1. #include  <stdio.h>

  2. main( )

  3. {   int x, y, z;

  4.     for( x = 0; x <= 20 ; ++x)

  5.         for( y = 0; y <= 33; ++y)

  6.         {

  7.                z=100-x-y;   // 由方程1得知

  8.                if(( z % 3 == 0) && ( 5*x+3*y+z/3 ==100 ))   // 由方程2得知

  9.                      printf("公鸡:%-2d  母鸡:%-2d  小鸡:%-2d\n", x, y, z);

  10.          }

  11. }

因为这是一个不定方程组,所以可能有多组解。程序运行的输出结果如图4-16所示。      

       图4-16 例4-12运行结果