初学C语言,有许多搞不明白的地方。编程,最重要的就是实践。今天,我偶然间看到书上的练习,做了一个能整齐地输出n,n的平方,n的立方的小程序。首先,我先用伪代码设计程序:
提示用户输入表格上限,下限或退出
循环:检测输入是否正确{
测试字宽 //为了输出更好看
按照字宽打印表头
循环:按照字宽输出数据
提示用户输入表格上限,下限或退出
}
然后,我设计了一个函数来测试数字的字宽(这里指数字所占的显示宽度,如123占3个单位,123456占6个单位)。通过笔算得出如下结论:数字[abcd](a,b,c,d均为大于0小于10的整数)可以表示为1000a+100b+10c+d,它占了四个单位;数字[abc]可以表示为100a+10b+c,它占了3个单位。观察得出,所占字宽就是以10为底最高位数字系数的对数+1。由此我们可以设立一个循环,来求出字宽,代码如下:
int i,i_wide;
for(i = 10,i_wide = 1;;i *= 10,i_wide++)
if((i_num / i) == 0)
break;
这样就巧妙地计算出了字宽。
解决了字宽的问题,似乎其他问题就好办多了。但是要注意,如果用户输入的上限是1,下限是10,那么输出字宽就是下限的字宽;但是,如果输入的上限是10,下限是1,这时输出字宽就是上限的字宽,如果这时还用下限的字宽,就会把数字输出得乱七八糟,这里就要用if语句。按照字宽来输出,我们需要用printf() 加 *修饰符(自定义输出的字宽,如printf("%*d",wide,num);)。
下面就是完整的程序代码了,如果有缺陷,请批评指出。
#include <stdio.h>
#include <stdlib.h>
int numlen(int i_num) //测试数字所占字宽
{
int i,i_wide;
for(i = 10,i_wide = 1;;i *= 10,i_wide++)
if((i_num / i) == 0) break;
return i_wide;
}
int main(int argc,char *argv[])
{
int i_wide[3]; //分别存储n,n^2,n^3三个数据的宽度
int i_top,i_bottom,i_flag; //表格的上下限和增长标记
printf("Please input top and bottom(\'q\' to quit):");
while(scanf("%d%d",&i_top,&i_bottom) == 2){
if(i_top == i_bottom)
continue;
else if(i_top > i_bottom){ //测试上限字宽
i_flag = -1;
i_wide[0] = numlen(i_top);
i_wide[1] = numlen(i_top * i_top);
i_wide[2] = numlen(i_top * i_top * i_top);
}
else{ //测试下限字宽
i_flag = 1;
i_wide[0] = numlen(i_bottom);
i_wide[1] = numlen(i_bottom * i_bottom);
i_wide[2] = numlen(i_bottom * i_bottom * i_bottom);
}
printf("%*s %*s %*s\n",i_wide[0],"n",i_wide[1],"n^2",i_wide[2],"n^3"); //整齐地输出表头
for(;;i_top += i_flag){
printf("%*d %*d %*d\n",
i_wide[0],i_top,i_wide[1],i_top * i_top,i_wide[2],i_top * i_top * i_top);
//整齐地输出表格
if(i_top == i_bottom)
break;
}
printf("Please input top and bottom(\'q\' to quit):");
}
getch();
return 0;
}