8、字符输入/输出和输入验证(练习8)编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才选择的操作。该程序只能接受菜单提供的选项。

/*
    编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序提示
    用户输入两个数字,然后执行用户刚才选择的操作。该程序只能接受菜单提供的选项。程序使用
    float类型的变量存储用户输入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,
    如果用户输入0作为第2个数(除数),程序应提示用户重新输入一个新值。
*/

#include <stdio.h>
#include <ctype.h>
char get_choice(void);  //  (返回标签选项a\s\m\d\q)并且打印图形交互界面
char get_first(void);   //  (返回第一个非空白字符)读取字符,并丢弃剩余的字符
float get_float(void);  //  (返回读入一个float类型)读入一个float类型并判断排除非数字类型
void add(void);         //  加法
void subtract(void);    //  减法
void multiply(void);    //  乘法
void divide(void);      //  除法

int main(int argc, char const *argv[])
{
    char ch;


    while ( (ch = get_choice()) != 'q' )
    {
        switch ( ch )
        {
            case 'a':   add();
                        break;
            case 's':   subtract();
                        break;
            case 'm':   multiply();
                        break;
            case 'd':   divide();
                        break;
            default:    printf("对不起,程序出现故障!");
                        break;
        }
    }
    printf("Bye.\n");
    
    return 0;
}

char get_choice(void)
{
    char ch;
    
    printf("Enter the operation of your choice:\n");
    printf("a. add          s. subtract\n");
    printf("m. multiply     d. divide\n");
    printf("q. quit\n");

    ch = get_first();
    while ( (ch != 'a' && ch != 's' && ch != 'm' && ch != 'd') && ch != 'q' ) 
    {
        printf("Please respond with a, s, m, d, or q.\n");
        ch = get_first();
    }
    
    return ch;
}

char get_first(void)
{
    int ch;

    while ( (ch = getchar()) != EOF )   //不断循环直到判断出非空白字符
    {
        if ( !isspace(ch) )             //  判断非空白字符
        {
            while ( getchar() != '\n' ) //将非空白字符后的所有字符跳过
            {
                continue;
            }
            break;
        }
    }

    return ch;
}

void add(void)
{
    float n1, n2;
    printf("Enter first number:");
    n1 = get_float();
    printf("Enter second number:");
    n2 = get_float();
    printf("%.1f + %.1f = %.1f\n", n1, n2, n1 + n2);
 
}

void subtract(void)
{
    float n1, n2;
    printf("Enter first number:");
    n1 = get_float();
    printf("Enter second number:");
    n2 = get_float();
    printf("%.1f - %.1f = %.1f\n", n1, n2, n1 - n2);
}

void divide(void)
{
    float n1, n2;
    printf("Enter first number:");
    n1 = get_float();
    printf("Enter second number:");
    n2 = get_float();
    while ( n2 == 0 )
    {
        printf("Enter a number otuer than 0: ");
        n2 = get_float();
    } 
    printf("%.1f / %.1f = %.1f\n", n1, n2, n1 / n2);
}

void multiply(void)
{
    float n1, n2;
    printf("Enter first number:");
    n1 = get_float();
    printf("Enter second number:");
    n2 = get_float();
    printf("%.1f * %.1f = %.1f\n", n1, n2, n1 * n2);
}


float get_float(void)
{
    float f;
    char ch;

    while ( scanf("%f", &f) != 1 )  //这里还剩下一个换行符;【如果读取的是一个非数字,则进入循环】
    {
        while ( (ch = getchar()) != '\n')   //  打印读入错误的字符,并跳过
        {
            putchar(ch);
        }
        printf(" is not an number.\n");
        printf("Please enter a number , such as 2.5, -1.78E8, or 3:" );
    }

    while ( getchar() != '\n')  //  跳过第一个外层while的一个换行符。
    {
        continue;
    }

    return f;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个包含加法减法乘法除法的16进制计算器的C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_LEN 100 int hex_to_dec(char c) { if (isdigit(c)) { return c - '0'; } else if (c >= 'a' && c <= 'f') { return c - 'a' + 10; } else if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } else { return -1; // error } } char dec_to_hex(int n) { if (n >= 0 && n <= 9) { return n + '0'; } else if (n >= 10 && n <= 15) { return n - 10 + 'a'; } else { return '?'; // error } } void reverse_str(char* s) { int len = strlen(s); for (int i = 0, j = len - 1; i < j; i++, j--) { char temp = s[i]; s[i] = s[j]; s[j] = temp; } } char* add_hex(char* a, char* b) { int len_a = strlen(a), len_b = strlen(b), len_c = 0; char* c = (char*) malloc(sizeof(char) * (MAX_LEN + 1)); int carry = 0; while (len_a > 0 || len_b > 0 || carry > 0) { int x = (len_a > 0) ? hex_to_dec(a[--len_a]) : 0; int y = (len_b > 0) ? hex_to_dec(b[--len_b]) : 0; int z = x + y + carry; carry = z / 16; c[len_c++] = dec_to_hex(z % 16); } c[len_c] = '\0'; reverse_str(c); return c; } char* subtract_hex(char* a, char* b) { int len_a = strlen(a), len_b = strlen(b), len_c = 0; char* c = (char*) malloc(sizeof(char) * (MAX_LEN + 1)); int borrow = 0; while (len_a > 0 || len_b > 0) { int x = (len_a > 0) ? hex_to_dec(a[--len_a]) : 0; int y = (len_b > 0) ? hex_to_dec(b[--len_b]) : 0; int z = x - y - borrow; if (z < 0) { z += 16; borrow = 1; } else { borrow = 0; } c[len_c++] = dec_to_hex(z); } c[len_c] = '\0'; reverse_str(c); return c; } char* multiply_hex(char* a, char* b) { int len_a = strlen(a), len_b = strlen(b); char* c = (char*) calloc(MAX_LEN + 1, sizeof(char)); for (int i = len_a - 1; i >= 0; i--) { int carry = 0; for (int j = len_b - 1; j >= 0; j--) { int x = hex_to_dec(a[i]); int y = hex_to_dec(b[j]); int z = x * y + carry + hex_to_dec(c[i + j + 1]); carry = z / 16; c[i + j + 1] = dec_to_hex(z % 16); } c[i] = dec_to_hex(carry); } reverse_str(c); return c; } char* divide_hex(char* a, char* b) { int len_a = strlen(a), len_b = strlen(b); char* c = (char*) calloc(MAX_LEN + 1, sizeof(char)); if (strcmp(b, "0") == 0) { // handle division by zero strcpy(c, "error"); return c; } char* remainder = (char*) calloc(len_b + 1, sizeof(char)); strcpy(remainder, a); for (int i = 0; i <= len_a - len_b; i++) { int q = 0; while (strcmp(remainder, b) >= 0) { char* temp = subtract_hex(remainder, b); strcpy(remainder, temp); free(temp); q++; } c[i] = dec_to_hex(q); if (i < len_a - len_b) { char temp[MAX_LEN + 1] = ""; strcat(temp, remainder); strcat(temp, &a[i + len_b]); strcpy(remainder, temp); } } reverse_str(c); return c; } int main() { char a[MAX_LEN + 1], b[MAX_LEN + 1]; printf("Enter two hexadecimal numbers:\n"); scanf("%s %s", a, b); char* c = add_hex(a, b); printf("The sum is: %s\n", c); free(c); c = subtract_hex(a, b); printf("The difference is: %s\n", c); free(c); c = multiply_hex(a, b); printf("The product is: %s\n", c); free(c); c = divide_hex(a, b); printf("The quotient is: %s\n", c); free(c); return 0; } ``` 这个程序实现了四种16进制计算:加法减法乘法除法。在 `subtract_hex` 函数中,我们采用了借位法实现16进制数的减法。在 `multiply_hex` 函数中,我们采用了竖式乘法的方法实现16进制数的乘法。在 `divide_hex` 函数中,我们采用了长除法的方法实现16进制数的除法。如果除数为0,我们将返回 "error"。 需要注意的是,输入的两个16进制数必须以字符串形式输入,并且长度不能超过 `MAX_LEN`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值