带有开关语句的 for 循环
for loop with switch statements
我对 C/C++ 相对较新,我想知道如何使用 for 循环,这样我就不必做一堆开关语句我已经做了开关语句我只需要帮助将 for 循环集成到其中。谢谢。
#include <stdio.h>
#pragma warning(disable : 4996)
int main() {
char ch;
ch = getchar();
int f, a = 10, b = 20;
printf("ch = %cn", ch);
switch (ch) {
case '+': f = a + b; printf("f = %dn", f); break;
case '-': f = a - b; printf("f = %dn", f); break;
case '*': f = a * b; printf("f = %dn", f); break;
case '/': f = a / b; printf("f = %dn", f); break;
default: printf("invalid operatorn");
}
}
该程序的目的是输入 +,-,*,/然后根据该输入,它将执行输入的情况,因此 + 将添加 a 并在一起。
基本上,您需要将运算符字符映射到操作。
当前代码表示通过执行流控制的映射。
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 operatorn";
}
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 operatorn" );
}
else
{
const int a = 10;
const int b = 20;
printf( "f = %dn", op_at( ch )( a, b ) );
}
}
我认为 C11 引入了一些用于有效重载函数的机制,因此它们可以像C++中的重载函数一样使用。我不太记得了,也没有在这里使用它。我建议,如果您需要处理不同的数据类型,只需使用不同的函数名称。
请注意,C 示例也编译为 C++,因此这两个示例在技术上都是C++的。但是,最后一个示例是 C 样式,使用 C 惯用法和 C I/O,并执行C++中不必要的操作。我们通常只是说这样的代码是C,而不是C风格;这样的代码可能并不总是编译为C++,因为虽然 C 在很大程度上是C++的子集,但它们是两种不同的、独立的语言:从技术上讲,没有 C/C++ 这样的东西。
我想知道如何使用 for 循环,这样我就不必做一堆开关语句,我已经做了开关语句,我只需要帮助将 for 循环集成到其中。
for
循环用于重复语句块,直到满足条件。
switch
语句用于根据给定值决定运行哪个语句块,而不是使用一堆 if
语句。
switch
语句替换为 for
循环是没有意义的。有意义的是在循环中使用 switch
语句来操作循环生成的内容,例如请求用户输入。 例如:
#include <stdio.h>
#pragma warning(disable : 4996)
int main() {
int f, a = 10, b = 20;
char ch;
int finished = 0;
do {
ch = getchar();
printf("ch = %cn", ch);
switch (ch) {
case '+': f = a + b; printf("f = %dn", f); break;
case '-': f = a - b; printf("f = %dn", f); break;
case '*': f = a * b; printf("f = %dn", f); break;
case '/': f = a / b; printf("f = %dn", f); break;
case 'q': finished = 1; break;
default: printf("invalid operatorn"); break;
}
}
while (!finished);
return 0;
}
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- 为什么我的程序在for循环中k=0时返回垃圾值
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- C++-For循环未执行
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ 无法在字符数组中使用 for 循环打印字母模式