需要用C语言编写一个逻辑语句计算器,它接受两个输入(数字或字母)和一个(〈,>,=)运算符,并检查是否为真

6mw9ycah  于 2022-12-11  发布在  其他
关注(0)|答案(2)|浏览(195)

计算器应接受如下输入(23〉3)或(a〉9),并打印出它的真假。我的主要困难是对字母做这个。我只对数字做了这个。我不知道如何定义scanf来接受字母。当一个字母与一个数字比较时,我需要比较字母的ASCII值。所以,如果我执行a>9,它实际上会检查97>9(97是'a'的ASCII值)。

#include <stdio.h>

int main() {
    int num1, num2;
    char operator;
    printf("Please write your logical statement:");
    scanf("%d %c %d", &num1, &operator, &num2);
    if (operator=='>')
    {
        if (num1>num2)
        {
            printf("True");
        }
        else
        {
            printf("false");
        }
    }
    else if (operator =='<')
    {
        if (num1<num2)
        {
            printf("True");
        }
        else
        {
            printf("false");
        }
    }
    else if (operator == '=')
    {
        if (num1==num2)
        {
            printf("True");
        }
        else
        {
            printf("False");
        }
    }
}

如何修改它以同时接受字符?

x4shl7ld

x4shl7ld1#

有很多方法可以做到这一点。一个相当直接的方法是将两个操作数读为 strings,然后使用一个函数将这些字符串转换为它们的组成部分编号,或者返回(单个)字符的(ASCII)值。
下面是这样一个函数,以及使用它的main的修改版本:

#include <stdio.h>
#include <string.h> // For strlen
#include <ctype.h>  // For isalpha

int GetValue(char* input, int* value)
{
    if (sscanf(input, "%d", value) == 1) { // Successfully read a number
        return 1;
    }
    else if (strlen(input) == 1 && isalpha(input[0])) { // For single letters ...
        *value = input[0];
        return 1;
    }
    return 0; // Return zero to indicate failure
}

int main(void)
{
    char in1[10], in2[10]; // Buffers for input operands (may like to make bigger)
    char op;
    int num1, num2;

    printf("Please write your logical statement:");
    // See notes below for an explanation of the format specifiers...
    if (scanf("%9[a-zA-Z0-9] %c %9[a-zA-Z0-9]", in1, &op, in2) != 3) {
        printf("Invalid input!\n");
        return 1;
    }
    if (!GetValue(in1, &num1)) {
        printf("Invalid operand 1\n");
        return 1;
    }
    if (!GetValue(in2, &num2)) {
        printf("Invalid operand 2\n");
        return 1;
    }

    if (op == '>') {
        printf((num1 > num2) ? "True" : "False");
    }
    else if (op =='<') {
        printf((num1 < num2) ? "True" : "False");
    }
    else if (op == '=') {
        printf((num1 == num2) ? "True" : "False");
    }
    else {
        printf("unrecognized operator");
    }
    return 0;
}

%9s[a-zA-Z0-9]说明符(this cppreference page中描述的“set”格式)的简短说明:这允许从三个范围('a'到'z','A'到'Z'和'0'到'9')中的任何字符作为输入到相应的char[]参数。因此,当看到您的一个运算符时,输入(到第一个字段)将停止。紧跟在'%'后面的'9'将两个字段的输入限制为9个字符,从而防止缓冲区溢出;如果您更改了in1in2数组的大小,则相应地更改该值(它不应大于数组大小的 * 减一 *,以允许使用nul-终止符)。
请注意,我还添加了一些(可能的)改进:
1.始终检查scanf返回的值,以确保它成功
1.您可以使用“条件(三元)运算符”使输出代码(printf块)更加简洁。

ruoxqz4g

ruoxqz4g2#

你可以做的一件事就是

scanf( "%c %c %c", &digit1, &operator, &digit2 );

但是这仅在用户输入单个数字而不是诸如23的多位数字时才起作用。
通常建议不要使用函数scanf,而是一次读取一整行输入,包括换行符。函数scanf可能会做一些不好的事情,比如在输入流中留下换行符which can cause trouble
为了一次读取整行输入,我建议使用函数fgets
我建议你把所有字符当作一个单独的字符串,但不包括操作符字符。然后你可以通过函数strtol来判断这个字符串是否是一个有效的整数。如果不是,你可以检查字符串的长度,以验证它是否只是一个字符。如果两者都不是,那么你的程序应该打印一个错误消息并退出。
以下是一个示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>

//This function will convert a string to a number. If the
//string represents an actual number, it will return this
//number. If the string contains a single letter, it will
//return the ASCII code of this letter. Otherwise, the
//function will exit the program with an error message.
long convert_string_to_number( const char *str )
{
    long num;
    char *p;

    //attempt to convert the string into a number
    num = strtol( str, &p, 10 );

    if ( p == str )
    {
        //failed to convert string to number, so we must
        //now determine whether it is a single letter
        if ( strlen(str) == 1 && isalpha( (unsigned char)str[0] ) )
        {
            //return the ASCII code of the character
            return str[0];
        }
        else
        {
            printf( "Error: Operand must be either a number or a single letter!\n" );
            exit( EXIT_FAILURE );
        }
    }

    //verify that all remaining characters are whitespace
    //characters, so that input such as "6abc<23" gets
    //rejected
    for ( ; *p != '\0'; p++ )
    {
        if ( !isspace( (unsigned char)*p ) )
        {
            printf( "Error: Unexpected character found!\n" );
            exit( EXIT_FAILURE );
        }
    }

    return num;
}

bool perform_operation( long num1, char operator, long num2 )
{
    switch ( operator )
    {
        case '<':
            return num1 < num2;
        case '>':
            return num1 > num2;
        case '=':
            return num1 == num2;
        default:
            printf( "Error: Invalid operator!\n" );
            exit( EXIT_FAILURE );
    }
}

int main( void )
{
    char line[200];
    char *p;
    char operator;
    long num1, num2;

    //attempt to read one line of input
    if ( fgets( line, sizeof line, stdin ) == NULL )
    {
        printf( "Input error!\n" );
        exit( EXIT_FAILURE );
    }

    //attempt to find operator
    p = strpbrk( line, "<>=" );

    //print error message and abort if no operator found
    if ( p == NULL )
    {
        printf( "Error: No valid operator found!\n" );
        exit( EXIT_FAILURE );
    }

    //remember the operator
    operator = *p;

    //overwrite the operator with a null character, to
    //separate the input string into two strings
    *p = '\0';

    //make the pointer p point to the start of the second
    //string
    p++;

    //attempt to convert both strings to a number
    num1 = convert_string_to_number( line );
    num2 = convert_string_to_number( p );

    //perform the actual operation and print the result
    if ( perform_operation( num1, operator, num2 ) )
    {
        printf( "True" );
    }
    else
    {
        printf( "False" );
    }
}

此程序具有以下行为:
第一个

相关问题