*文中大部分实例均出自MOOC,少部分改编
引入
问题一:
输入一个非负整数,输出这个数字的位数大小。
思考:如何设计循环,使得输入任意的非负整数(在验证的时候要特别考虑特殊情况,如边界值、有效范围两端的数据)
@while版本#include <stdio.h>int main()
{
int count = 0;int num;scanf ( "%d", &num );count++; //关键部分,不可缺少,不然输入0时答案错误num /= 10;while ( num>0 ){
count++;num /= 10;}printf ( "%d\n", count ); }
@do-while版本
//好处在于利用do-while的结构简化了while版本的重复部分#include <stdio.h>int main()
{
int count = 0;int num;scanf ( "%d", &num );do{
count++;num /= 10;} while ( num>0 );printf ( "%d\n", count ); }
问题二:
输入任意一个数,输出它位数的值。(与上一题对比增加了负数部分)
#include <stdio.h>int main()
{int count = 0;int num;scanf ( "%d", &num );if ( num>=0 ){do{count++;num /= 10;} while ( num>0 );}elsedo {count++;num /= 10;} while ( num<0 );printf ( "%d\n", count ); }
*多种多样的调试方法:
最常用的两种检测方法
1.列表法,根据算法的思路,在草稿纸上列出每一行代码对变量数值的改变。
2.debug调试,利用编译器自带的功能对代码进行调试
还有一种调试方法是在必要且合适的地方适当的加入printf语句,让电脑输出他在执行每一行代码时对变量数值的改变,本质上是第一种方法,即列表。如:
#include <stdio.h>int main()
{int count = 0;int num;scanf ( "%d", &num );do {count++;num /= 10;printf ( "num=%d count=%d\n", num, count );} while ( num>0 );printf ( "%d\n", count ); }
循环
*注意事项
个人在使用while循环时在特定情况下特别容易遗忘在一开始定义一个变量储存被改动的数值,导致循环结束后原本的数值已经被改变,但此时却又用这个值参与其他的计算当中导致最后答案的错误。
例:
@未对变量进行处理 导致后期输出时x已不再少年int x;
int ret = 0;scanf ( "%d", &x );
while ( x > 1 ){x /= 2;ret ++;
}printf ( "log2 of %d is %d.", x, ret );
@修改版int x;
int ret = 0;scanf ( "%d", &x );
int t = x;
while ( x > 1 ){x /= 2;ret ++;
}printf ( "log2 of %d is %d.", x, ret );
*如何确定循环条件
条件的确定没有具体的公式,以小见大是一个我常用的方法。如果我要确定一个循环的while条件时的数据过大,初步估计要循环1000次以上时,循环结束时的结果是否与我想要的结果相同就十分难以判断了。
这时我会缩短循环次数,找出此时结束时到底包不包括边界,我要如何修改才能符合条件,最后扩大类比到原来的代码。
应用
题目三:
输入一个正整数,倒叙隔空输出数字(注意格式)
#include <stdio.h>int main()
{int num;int t1;while ( ~scanf("%d", &num) ){int mark = 0;while ( num>0 ){t1 = num%10;if ( mark == 0 ){printf ( "%d", t1 );mark = 1;}elseprintf ( " %d", t1 );num /= 10;}printf ( "\n" );}return 0;}
题目四:
输出100以内的素数
#include <stdio.h>int main()
{int flag = 0;for ( int i=2; i<=100; i++ ){int isprime = 1;for ( int j=2; j<i; j++ ){if ( i%j == 0 )isprime = 0;}if ( isprime == 1 ){if ( flag == 0 )printf ( "%d", i );elseprintf ( " %d", i );flag = 1;}} return 0;
}
题目五:
输入一个非负整数,正序输出它的每一位数字
@综合上面四道题的题目,用到了倒叙输出,计算位数等设计#include <stdio.h>
#include <math.h>int place( int num )
{int count = 0;do{count++;num /= 10;} while ( num>0 );return count;
}int main()
{int n;scanf ( "%d", &n );int y = place(n)-1;int flag = pow(10,y);int mark = 0;int temp;while ( n>0 ){temp = n/flag;if ( mark == 0 ){mark = 1;printf ( "%d", temp );}elseprintf ( " %d", temp );n %= flag;flag /= 10;}getchar();getchar();return 0;}