我对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");
}
}
程序的目的是输入+, - ,*,/然后根据该输入执行输入的情况,这样+会添加一个并且在一起。
答案 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