for switch with switch语句

时间:2016-01-25 01:53:03

标签: c++ c for-loop switch-statement

我对C / C ++比较陌生,我想知道如何使用for循环所以我不必制作一堆switch语句我已经做了switch语句我只需要帮助集成循环进入它。谢谢。

#include <stdio.h>
#pragma warning(disable :   4996)   
int main()  {
    char    ch;
    ch = getchar();
    int f, a = 10, b = 20;
    printf("ch  =   %c\n", ch);


    switch (ch) {
    case '+':   f = a + b;  printf("f   =   %d\n", f); break;
    case '-':   f = a - b;  printf("f   =   %d\n", f); break;
    case '*':   f = a * b;  printf("f   =   %d\n", f); break;
    case '/':   f = a / b;  printf("f   =   %d\n", f); break;
    default:    printf("invalid operator\n");
    }

}

程序的目的是输入+, - ,*,/然后根据该输入执行输入的情况,这样+会添加一个并且在一起。

2 个答案:

答案 0 :(得分:2)

基本上,您需要将操作员字符映射到操作。

您当前的代码通过执行流程控制表示该映射。

在C ++中,标准库的map集合是一个很好的选择,而不是将其表示为数据,因此您甚至不需要使用循环。在C中,每个包含char和函数指针的结构数组都可以完成相同的工作。但是,您必须自己定义函数,因为与C ++标准库不同,C标准库不为算术运算提供方便的命名函数。

以类似的方式,布尔状态,无论是真还是假,都可以表示为执行位置或数据,通常表示为bool类型的变量。选择什么主要是工程直觉。有时通过流量控制进行表示最简单,最清晰,有时表示为数据最简单,最清晰。

C ++示例,主要是复制给定的示例代码的效果,但将映射作为数据:

#include <iostream>
#include <functional>
#include <map>
using namespace std;

auto main() -> int
{
    const map<char, function<int(int,int)>> op =
    {
        { '+', plus<int>() },
        { '-', minus<int>() },
        { '*', multiplies<int>() },
        { '/', divides<int>() }
    };

    char  ch;
    cout << "Operator? ";  cin >> ch;
    cout << "ch = '" << ch << "'\n";

    if( op.count( ch ) == 0 )
    {
        cout << "invalid operator\n";
    }
    else
    {
        const int a = 10;
        const int b = 20;
        cout << "f   =   " << op.at( ch )( a, b ) << "\n";
    }
}

对应的C示例,其中包含问题中提到的for循环:

#include <stdio.h>

int plus( int a, int b )        { return a+b; }
int minus( int a, int b )       { return a-b; }
int multiplies( int a, int b )  { return a*b; }
int divides( int a, int b )     { return a/b; }

typedef int(*Func_ptr)(int, int);

struct Mapping
{
    char        ch;
    Func_ptr    f;
};

const struct Mapping op[] =
{
    { '+', plus },
    { '-', minus },
    { '*', multiplies },
    { '/', divides }
};

const int n_ops = sizeof( op )/sizeof( *op );

Func_ptr op_at( char ch )
{
    for( int i = 0; i < n_ops; ++i )
    {
        if( op[i].ch == ch ) { return op[i].f; }
    }
    return NULL;
}

int main()
{

    int  ch;        // Note: type `int` to accommodate EOF value.
    printf( "Operator? " );  ch = getchar();
    printf( "ch = '%c'\n", ch );

    if( op_at( ch ) == NULL )
    {
        printf( "invalid operator\n" );
    }
    else
    {
        const int a = 10;
        const int b = 20;
        printf( "f   =   %d\n", op_at( ch )( a, b ) );
    }
}

C11,我认为是,它引入了一些有效重载函数的机制,因此它们可以像C ++中的重载函数一样使用。我不记得太多,也没有在这里使用它。我建议如果你需要处理不同的数据类型,只需使用不同的函数名称。

请注意,C示例也编译为C ++,因此这两个示例在技术上都是C ++。但是,最后一个示例采用C风格,使用C语言和C i / o,并执行C ++中不必要的操作。我们通常只说这样的代码是C,而不是它的C风格;这样的代码可能并不总是编译为C ++,因为虽然C主要是C ++的一个子集,但它们是两种不同的,单独的语言:技术上没有C / C ++这样的东西。

答案 1 :(得分:1)

  

我想知道如何使用for循环所以我不必制作一堆switch语句我已经做了switch语句我只需要帮助将for循环集成到它中。

Esc-key循环用于重复语句块,直到满足条件。

for语句用于根据给定值决定运行哪个语句块,而不是使用一堆switch语句。

使用if循环替换 switch语句没有意义。有意义的是在循环中使用for语句来处理循环生成的内容,例如要求用户输入。例如:

switch