-
1 文字讲解
-
2 视频讲解
-
3 学习辅导
一、do while循环语句的一般形式
do
{
语句序列 ;
} while ( 表达式 ) ;
说明:① 是一种直到型的循环结构。 ② 最后一个分号必须有。 ③ 花括号{ }必须有。 ④ 循环体是指语句序列,可以是一条语句或多条语句。
二、do while循环语句的执行过程
1、do while循环语句的流程图

2、do while语句的执行过程
① 执行循环体中的语句,开始一个循环的周期。
② 计算表达式的值。如果表达式为非 0,即循环条件为真,则转到第①步,开始下一个循环周期;如果表达式为 0,即循环条件为假,则转到第③步。
③ 结束 do...while循环,转而执行 do...while 循环语句后的第 1 条语句。
do...while 语句执行的特点是:先执行循环体,后判断条件,至少执行一次循环体。
例4-2 输入若干字符,以'*'作为输入结束符,分别用do...while语句和while语句实现,输入相同的字符串,比较它们的运行结果有何不同。
一、分析:
二、源程序如下:
1、do...while方式实现源代码如下:
#include <stdio.h>
#include <conio.h>
main( )
{
char ch;
printf("使用 do...while 语句\n");
printf("输入若干字符('*'结束).\n");
ch = getchar( );
do {
putchar( ch );
ch = getchar( );
} while ( ch != '*' );
getch( );
}
2、while方式实现源代码如下:
#include <stdio.h>
#include <conio.h>
main( )
{
char ch;
printf("使用 while 语句\n");
printf("输入若干字符('*'结束).\n");
ch = getchar( );
while( ch != '*' )
{
putchar( ch );
ch = getchar( );
}
getch( );
}
三、程序测试
1、测试数据1:ABC*
期望结果:ABC

测试结果:程序达到预期结果。
2、测试数据2:*DEFG*
期望结果:ABC

测试结果:程序达到预期结果。
可以看出,如果第1次执行循环体时表达式为真,那么两种循环得到的结果相同;否则,两者的结果就不同( 前提:两者的循环体中的语句相同 )。
三、do...while循环语句的注意事项
1、不管语句是由多行或一行构成,都必须用"{ }"括起来,表示循环体。
2、while( 表达式 )后的";"不能遗漏。
3、do...while语句循环允许多层循环嵌套。
4、为防止造成死循环,需要在while循环的语句中或判断表达式中进行适当的条件修改,使其可以跳出循环。
这个循环与while循环的不同在于: 它先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。
例4-3 输入一个整数,按相反次序输出。例如,输入54321,输出12345.
一、程序分析:
二、源程序参考如下:
#include <stdio.h>
#include <conio.h>
main()
{
long num;
int b;
printf("输入一个整数:" );
scanf("", &num); //输入一个整数,位数可超过5
do
{
b = num % 10; // 取个位数字
printf( "%d", b );
num = num / 10; // 去掉个位数字
} while( num ); // 非 0 继续循环,0 结束
printf("\n");
getch( );
}
三、程序测试
测试数据:54321
期望结果:12345

测试结果:程序达到预期结果。
四、运行过程
| 变量名 | b | num | 变量名 | b | num |
|---|---|---|---|---|---|
| 初始状态 | 54321 | 第3轮循环 | 3 | 54 | |
| 第1轮循环 | 1 | 5432 | 第4轮循环 | 4 | 5 |
| 第2轮循环 | 2 | 543 | 第5轮循环 | 5 | 0 |
先取后去,除q取余,直到商为0为止。
数学: p(被除数)/q(除数)=m(商).........r(余数)
C语言: 先取后去:r=p%q p=p/q
除q取余,直到商为0为止。
do{
r=p%q ;
p=p/q;
} while(p>0);
或
while(p>0)
{
r=p%q ;
p=p/q;
}
十进制转换二进制: 将q改为2或赋值为2
对于整数部分,除2取余,直到商为0为止。
十进制转换八进制: 将q改为8或赋值为8
十进制转换五进制: 将q改为5或赋值为5
十进制转换十进制: 将q改为10或赋值为10
输出:第一种方法:求取一个,输出一个。
第二种方法:增加一个变量s,表示存储相反数。
s=0; s=s*10+r; s=s*q+r;
对于整数部分,将二进制数转换十制数。
s=0; s=s*2+r;
1、书上的例题
2、将15转换为二进制并输出。
#include <stdio.h>
#include <conio.h>
main()
{ int num, b, s=0;
printf(" 输入一个整数:");
scanf("%d", &num ); /* 输入一个整数,位数可超过5位 */
do
{ b= num % 2; /* 取个位数 */
printf("%d", b);
num= num / 2; /* 整除10 */
} while ( num ); /* 非0继续循环,0结束 */
getch( );
}
3、输入:123456,输出:21。
#include <stdio.h>
#include <conio.h>
main()
{ int num, b, s=0;
printf(" 输入一个整数:");
scanf("%d", &num ); /* 输入一个整数,位数可超过5位 */
do
{ b= num % 10; /* 取个位数 */
s=s+b;
num= num / 10; /* 整除10 */
} while ( num ); /* 非0继续循环,0结束 */
printf("%d\n",s); getch( );
}
4、输入:不含0的正整数,如 12345,输出:120
#include <stdio.h>
#include <conio.h>
main()
{ int num, b, s=1;
printf(" 输入一个整数:");
scanf("%d", &num ); /* 输入一个整数,位数可超过5位 */
do
{ b= num % 10; /* 取个位数 */
s=s*b;
num= num / 10; /* 整除10 */
} while ( num ); /* 非0继续循环,0结束 */
printf("%d\n",s); getch( );
}
从键盘上输入一串0与1数字字符,以#字符结束。输出对应十进制数。
示例1 输入: 1011#,输出:11。
示例2 输入: 11011#,输出:27。
#include <stdio.h>
#include <conio.h>
main( )
{ int s=0;
char ch;
while( (ch=getchar())!='#' )
{ s=s*2+ch-'0';
}
printf("十进制数为:%d\n", s);
getch( );
}


