C语言的综合案例
C语言综合案例
在本章中,我们将通过几个综合案例,应用前面章节中学习到的C语言知识,深入理解和掌握C语言的实际应用。这些案例涵盖了不同的难点和应用场景,旨在帮助你巩固所学知识,并提升解决实际问题的能力。每个案例都包含详细的代码示例、完整的注释以及详细的解释,确保你能够全面理解每个程序的工作原理。
1 计算器程序
本案例将实现一个功能齐全的命令行计算器,支持基本的算术运算(加、减、乘、除)以及更复杂的运算,如取余和幂运算。计算器将具备用户友好的界面,能够连续进行多次计算,直到用户选择退出。
程序需求
-
基本功能:
- 加法 (
+
) - 减法 (
-
) - 乘法 (
*
) - 除法 (
/
) - 取余 (
%
) - 幂运算 (
^
)
- 加法 (
-
用户界面:
- 显示可用的操作符
- 提示用户输入操作符和操作数
- 显示计算结果
- 提供退出选项
-
错误处理:
- 处理除以零错误
- 处理无效的操作符输入
- 处理输入格式错误
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#ifdef _WIN32#include <io.h> // 包含 _setmode 和 _fileno#include <fcntl.h> // 包含 _O_U8TEXT
#endif// 函数声明
double add(double a, double b);
double subtract(double a, double b);
double multiply(double a, double b);
double divide(double a, double b);
int modulo(int a, int b);
double power_func(double a, double b);
void displayMenu();int main() {// 在Windows上设置控制台为UTF-8编码#ifdef _WIN32// 将标准输出设置为UTF-8模式if (_setmode(_fileno(stdout), _O_U8TEXT) == -1) {perror("设置标准输出为UTF-8失败");return 1;}#endif// 设置区域,支持宽字符setlocale(LC_ALL, "");char operator;double num1, num2, result;int int_num1, int_num2, mod_result;int choice = 1;// 使用宽字符输出中文标题wprintf(L"===== 简易计算器 =====\n");while(choice) {displayMenu();wprintf(L"请输入操作符: ");scanf(" %c", &operator); // 注意在%c前加空格,跳过前面的换行符// 判断操作符并执行相应的操作switch(operator) {case '+':wprintf(L"请输入两个数(空格分隔): ");if(scanf("%lf %lf", &num1, &num2) != 2) {wprintf(L"输入格式错误,请输入两个数。\n");// 清空输入缓冲区while(getchar() != '\n');break;}result = add(num1, num2);wprintf(L"结果: %.2lf + %.2lf = %.2lf\n\n", num1, num2, result);break;case '-':wprintf(L"请输入两个数(空格分隔): ");if(scanf("%lf %lf", &num1, &num2) != 2) {wprintf(L"输入格式错误,请输入两个数。\n");while(getchar() != '\n');break;}result = subtract(num1, num2);wprintf(L"结果: %.2lf - %.2lf = %.2lf\n\n", num1, num2, result);break;case '*':wprintf(L"请输入两个数(空格分隔): ");if(scanf("%lf %lf", &num1, &num2) != 2) {wprintf(L"输入格式错误,请输入两个数。\n");while(getchar() != '\n');break;}result = multiply(num1, num2);wprintf(L"结果: %.2lf * %.2lf = %.2lf\n\n", num1, num2, result);break;case '/':wprintf(L"请输入两个数(空格分隔): ");if(scanf("%lf %lf", &num1, &num2) != 2) {wprintf(L"输入格式错误,请输入两个数。\n");while(getchar() != '\n');break;}if(num2 == 0) {wprintf(L"错误: 除数不能为零。\n\n");break;}result = divide(num1, num2);wprintf(L"结果: %.2lf / %.2lf = %.2lf\n\n", num1, num2, result);break;case '%':wprintf(L"请输入两个整数(空格分隔): ");if(scanf("%d %d", &int_num1, &int_num2) != 2) {wprintf(L"输入格式错误,请输入两个整数。\n");while(getchar() != '\n');break;}if(int_num2 == 0) {wprintf(L"错误: 除数不能为零。\n\n");break;}mod_result = modulo(int_num1, int_num2);wprintf(L"结果: %d %% %d = %d\n\n", int_num1, int_num2, mod_result);break;case '^':wprintf(L"请输入底数和指数(空格分隔): ");if(scanf("%lf %lf", &num1, &num2) != 2) {wprintf(L"输入格式错误,请输入两个数。\n");while(getchar() != '\n');break;}result = power_func(num1, num2);wprintf(L"结果: %.2lf ^ %.2lf = %.2lf\n\n", num1, num2, result);break;case 'q':case 'Q':wprintf(L"退出计算器。\n");choice = 0;break;default:wprintf(L"无效的操作符,请重新输入。\n\n");}}// 使用宽字符输出中文关闭信息wprintf(L"===== 计算器已关闭 =====\n");return 0;
}// 加法函数
double add(double a, double b) {return a + b;
}// 减法函数
double subtract(double a, double b) {return a - b;
}// 乘法函数
double multiply(double a, double b) {return a * b;
}// 除法函数
double divide(double a, double b) {return a / b;
}// 取余函数
int modulo(int a, int b) {return a % b;
}// 幂运算函数
double power_func(double a, double b) {return pow(a, b);
}// 显示操作菜单
void displayMenu() {wprintf(L"请选择操作:\n");wprintf(L" + : 加法\n");wprintf(L" - : 减法\n");wprintf(L" * : 乘法\n");wprintf(L" / : 除法\n");wprintf(L" %% : 取余\n");wprintf(L" ^ : 幂运算\n");wprintf(L" Q : 退出\n");
}
程序说明
- 函数定义:
- 加法、减法、乘法、除法、取余、幂运算:分别定义了对应的函数,简化主程序中的操作。
displayMenu
:用于显示操作菜单,提示用户选择操作。
- 主函数:
- 使用一个
while
循环,持续接受用户输入,直到用户选择退出(输入Q
或q
)。 - 通过
switch
语句,根据用户输入的操作符执行相应的计算。 - 对每种操作,首先提示用户输入操作数,并进行输入格式和合法性检查。
- 特别注意处理除以零和数组越界等错误,确保程序的健壮性。
- 每次操作后,输出计算结果,并提供下一步操作的机会。
- 使用一个
- 错误处理:
- 使用
perror
函数输出文件操作错误(在本例中未涉及文件操作,但保留以备扩展)。 - 检查用户输入是否符合预期格式,避免因输入错误导致程序异常。
- 使用
- 用户体验:
- 提供清晰的操作菜单,帮助用户理解可用的操作符。
- 支持连续计算,用户可以在一次运行中进行多次计算,直到选择退出。
示例运行
===== 简易计算器 =====
请选择操作:+ : 加法- : 减法* : 乘法/ : 除法% : 取余^ : 幂运算Q : 退出
请输入操作符: +请输入两个数(空格分隔): 10 20
结果: 10.00 + 20.00 = 30.00请选择操作:+ : 加法- : 减法* : 乘法/ : 除法% : 取余^ : 幂运算Q : 退出
请输入操作符: /请输入两个数(空格分隔): 15 3
结果: 15.00 / 3.00 = 5.00请选择操作:+ : 加法- : 减法* : 乘法/ : 除法% : 取余^ : 幂运算Q : 退出
请输入操作符: %请输入两个整数(空格分隔): 10 3
结果: 10 % 3 = 1请选择操作:+ : 加法- : 减法* : 乘法/ : 除法% : 取余^ : 幂运算Q : 退出
请输入操作符: Q
退出计算器。
===== 计算器已关闭 =====
2 文件统计工具
本案例将实现一个文件统计工具,能够统计指定文本文件中的行数、单词数和字符数。该工具将模仿Unix/Linux中的wc
命令,提供命令行界面,允许用户输入文件路径,并输出统计结果。
程序需求
-
功能:
- 统计文件中的行数
- 统计文件中的单词数
- 统计文件中的字符数
-
用户界面:
- 提示用户输入文件路径
- 显示统计结果
-
错误处理:
- 文件不存在或无法打开
- 处理大文件时的效率问题
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <locale.h>
#include <string.h> // 添加了字符串处理函数头文件#ifdef _WIN32#include <io.h> // 包含 _setmode 和 _fileno#include <fcntl.h> // 包含 _O_U8TEXT
#endif// 函数声明