题目:       
输入两个整数mn,及另一正整数k,计算m/n,结果精确到小数点后k
1、问题分析与方案设计。
1.首先解决输入问题。题目要求输入三个整数mnk。所以定义input()函数,使输入的为正整数,如果是字母或者其他字符则会报错提示重新输入。具体方法:先采用字符串输入,限定每一个输入的字符都在0~9之间,保证输入的是数字,避免输入的是字母或者其他字符,然后再对字符串使用atoi函数,该函数为c语言自带的函数,其功能为:把字符串转换成整型数。
2.关于m/n的计算问题。计算结果要求精确到k位,由于mn是整形,所以m/n结果也是整形,而无法得到小数点后面的位数。所以这里有两种解决方案①:讲mn定义为double ②:将结果的整数部分与小数部分分别显示。由于第一种方案的局限性(无法精确到用户指定的k位),所以本程序采用第二种方案,
3.输出问题。首先在界面上把所输入的m n k全部显示出来以便用户查看,再输出运算结果。结果的输出考虑最后一位四舍五入的情况。
4.菜单与人性化设计。首先显示菜单,包括欢迎语,本程序的功能介绍以及用户的输入要求,让人一目了然。当处理完一个操作之后,提示用户是否继续,输入y继续,则再次输入m n k;若输入n则退出程序。
5.另外考虑到除数不能为0,所以限定输入的n不能为0,若为0则报错重输。
流程图:
   
2、编程实现。
1、输入函数input()。
int input1()
{
    int m;
    int flag,i;//设定标识符flag,如果输入的不是0~9的数字则flag=1,进入报错重输循环
    char t[100];  //先采用字符串输入 限定输入的每一位都在0~9之间,保证输入的是数字、避免输入的是字母或者其他字符
    do{
        flag=0; 
        fflush(stdin);
re:        gets(t);
        for(i=0;(size_t)i<strlen(t);i++)
        {
            if(t[i]<'0' ||t[i]>'9')
                flag=1;
        }
        if(flag)
        {
            printf("输入有误,请重新输入m\n>>");
            flag=0;  //(这一步要重置flag0,当做无误的再作判断)
            goto re;
        }
    }while(flag);
    m=atoi(t);// atoi功能:把字符串转换成整型数
    return m;
}
并且在input2中用以下语句限定n不能输入为0.
if(m==0) {printf("n不能为0,请重新输入n\n>>"); goto re; } //考虑到除数不能为0
2、功能实现
  1)、输出整数部分和小数点。关键程序:printf("运算结果为%d.",m/n); //%d.将整数部分与小数部分分开处理
  2)、输出小数部分。主要通过i<k的循环不断输出小数点后的每一位。关键代码:for(i=1;i<k;i++)
    {
            m=m%n;   
            m*=10;       
            printf("%d",m/n);//k-1
}
3)、四舍五入。若要第k位四舍五入,则需要定义fk下一位的数值)。通过f5的比较,用if语句控制进位与否。关键代码:
m=m%n;m*=10;//最后一位(k)四舍五入字符串截取后3位
    x=m/n;      //k位的值
    m=m%n;m*=10;
    f=m/n;      //k下一位的值,用于判断是否大于5
    if(f<5)printf("%d\n",x);
    else printf("%d\n",x+1);
3、询问是否继续。实现多次执行程序。关键代码:
printf("是否继续?y/n\n>>");
    fflush(stdin);
    scanf("%c",&c);
    while(c!='y'&&c!='n')
    {
        printf("输入有误请选择y或者n\n>>");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。