本篇介绍编写简单程序的基础内容,包括基本的输入输出操作(掌握scanf和printf等函数)、简单的数学计算程序(实现加减乘除等基本运算)以及字符串处理程序(进行字符串拼接、查找、替换等操作)。适合初学者入门学习。
一、基本的输入输出操作:掌握 scanf 和 printf
在编写程序时,与用户进行交互是必不可少的。掌握scanf和printf等标准输入输出函数的使用,是实现这一交互的关键。
1.1. 需求描述
在C语言中,printf 和 scanf 是最常用的标准输入输出函数。printf 用于向标准输出(通常是屏幕)打印格式化的字符串,而 scanf 用于从标准输入(通常是键盘)读取格式化的输入。
printf的基本用法是printf(format, ...);,其中format是一个包含文本和格式说明符的字符串,...是要打印的变量。
scanf的基本用法是scanf(format, ...);,其中format是一个包含格式说明符的字符串,...是用于存储输入值的变量地址(通过&运算符获取)。
1.2. 代码示例
以下是一个简单的C程序,使用 printf 打印提示信息,然后使用 scanf 读取用户输入的两个整数,并打印它们的和。
#include <stdio.h>
int main() {
int num1, num2, sum;
// 打印提示信息
printf("请输入第一个整数: ");
// 读取第一个整数
scanf("%d", &num1);
// 打印提示信息
printf("请输入第二个整数: ");
// 读取第二个整数
scanf("%d", &num2);
// 计算和
sum = num1 + num2;
// 打印结果
printf("两个整数的和是: %d\n", sum);
return 0;
}
1.3. 测试用例和结果
①测试用例1
-
输入:
5和10 -
预期输出:
两个整数的和是: 15 -
实际运行结果:
②测试用例2
-
输入:
-3和7 -
预期输出:
两个整数的和是: 4 -
实际运行结果:
③测试用例3(包含空格的输入)
-
输入:
8和9(注意输入前的空格) -
预期输出:
两个整数的和是: 17(空格被忽略,因为%d忽略前导空格) -
实际运行结果:
二、简单的数学计算程序
编写能够执行基本数学运算(如加减乘除)的程序,是编程入门的重要一步。通过接收用户输入的两个数字和一个运算符,程序可以计算出结果并输出。
2.1. 需求描述
需求:实现基本的数学运算,包括加法、减法、乘法和除法。程序将提示用户输入两个数字和一个运算符,然后根据输入的运算符执行相应的计算,并输出结果。
2.2. 代码示例
##include <stdio.h>
int main() {
double num1, num2, result;
char operator;
// 提示用户输入第一个数字
printf("请输入第一个数字: ");
scanf("%lf", &num1);
// 提示用户输入运算符
printf("请输入运算符 (+, -, *, /): ");
scanf(" %c", &operator); // 注意前面的空格,用于忽略前一个输入后的换行符
// 提示用户输入第二个数字
printf("请输入第二个数字: ");
scanf("%lf", &num2);
// 根据运算符执行计算
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
// 检查除数是否为零
if (num2 != 0) {
result = num1 / num2;
} else {
printf("错误: 除数不能为零。\n");
return 1; // 返回非零值表示错误
}
break;
default:
printf("错误: 无效的运算符。\n");
return 1; // 返回非零值表示错误
}
// 输出结果
printf("结果: %.2lf %c %.2lf = %.2lf\n", num1, operator, num2, result);
return 0; // 返回零表示成功
}
2.3. 测试用例和结果
①测试用例1
-
输入:
5,+,3 -
输出:
结果: 5.00 + 3.00 = 8.00 -
运行结果:
②测试用例2
-
输入:
10,-,4 -
输出:
结果: 10.00 - 4.00 = 6.00 -
运行结果:
③ 测试用例****3
-
输入:
6,*,7 -
输出:
结果: 6.00 * 7.00 = 42.00 -
运行结果:
④测试用例4
-
输入:
8,/,2 -
输出:
结果: 8.00 / 2.00 = 4.00 -
运行结果:
⑤测试用例5(无效运算符)
-
输入:
5,%,3 -
输出:
错误: 无效的运算符。 -
运行结果:
⑥测试用例6(除数为零)
-
输入:
10,/,0 -
输出:
错误: 除数不能为零。 -
运行结果:
三、字符串处理程序
字符串是编程中常用的数据类型之一。编写能够处理字符串的程序,如拼接、查找和替换等操作,对于提高编程能力具有重要意义。在实现这些功能时,要特别注意字符串的边界条件和内存管理,以避免出现错误。
3.1. 需求描述
- 实现基本的字符串操作,包括字符串拼接、查找子字符串和替换子字符串。为了简化,我们将使用标准C库中的字符串函数,如
strcat,strchr, 和自定义的替换函数(因为C标准库没有直接的字符串替换函数)。
3.2. 代码示例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 自定义字符串替换函数
char* str_replace(const char* str, const char* old_substr, const char* new_substr) {
char* result;
int i, count = 0;
int old_substr_len = strlen(old_substr);
int new_substr_len = strlen(new_substr);
// 计算新字符串的长度
for (i = 0; str[i] != '\0'; i++) {
if (strstr(&str[i], old_substr) == &str[i]) {
count++;
i += old_substr_len - 1;
}
}
// 分配内存给新字符串
result = (char*)malloc(i - count * old_substr_len + count * new_substr_len + 1);
if (!result) {
perror("内存分配失败");
exit(EXIT_FAILURE);
}
i = 0;
while (*str) {
// 如果找到子字符串,则替换它
if (strstr(str, old_substr) == str) {
strcpy(&result[i], new_substr);
i += new_substr_len;
str += old_substr_len;
} else {
result[i++] = *str++;
}
}
result[i] = '\0';
return result;
}
int main() {
char str1[100], str2[100], result[200];
char old_substr[50], new_substr[50];
// 字符串拼接示例
printf("请输入第一个字符串: ");
scanf("%s", str1);
printf("请输入第二个字符串: ");
scanf("%s", str2);
strcat(str1, str2);
printf("拼接后的字符串: %s\n", str1);
// 查找子字符串示例
printf("请输入要查找的子字符串: ");
scanf("%s", old_substr);
char* pos = strchr(str1, old_substr[0]); // 注意:这里只查找子字符串的第一个字符的位置,然后需要手动验证整个子字符串
if (pos && strncmp(pos, old_substr, strlen(old_substr)) == 0) {
printf("子字符串 '%s' 在位置 %ld 找到。\n", old_substr, pos - str1);
} else {
printf("子字符串 '%s' 未找到。\n", old_substr);
}
// 字符串替换示例
printf("请输入要替换成的子字符串: ");
scanf("%s", new_substr);
strcpy(result, str1); // 复制原始字符串到结果字符串,因为str_replace会分配新内存
char* replaced_str = str_replace(result, old_substr, new_substr);
printf("替换后的字符串: %s\n", replaced_str);
// 释放分配的内存(如果使用了动态内存分配)
free(replaced_str); // 注意:如果result和replaced_str指向同一块内存,则不需要再次释放result
return 0;
}
注意:上面的 str_replace 函数实现有一个限制,它只处理不重叠的子字符串替换,并且假设输入的字符串和子字符串不包含空字符(\0)。此外,由于 strchr 只能找到子字符串的第一个字符的位置,因此上面的查找子字符串的示例并不完整;它应该使用 strstr 来找到整个子字符串的位置。但是,为了简化示例,这里只展示了基本的思路。
3.3. 测试用例
①测试用例1(字符串拼接)
-
输入:
Hello,World -
输出:
拼接后的字符串: HelloWorld
②测试用例2(查找子字符串)
-
输入:
HelloWorld,World -
输出:
子字符串 'World' 在位置 5 找到。
③测试用例****3(字符串替换)
-
输入:
HelloWorld,World,C -
输出:
替换后的字符串: HelloC
3.4. 运行结果
根据测试用例输入相应的值,程序将输出相应的结果。
(注意:对于字符串替换的测试,需要根据实际的 str_replace 函数实现和输入来调整期望的输出,因为上面的实现有一些限制和简化。)
重要提示:在实际应用中,请务必对输入进行验证,以避免缓冲区溢出、内存泄漏等安全问题。上面的示例代码为了简化而省略了一些错误处理和安全检查。
四、注意事项
在编写简单程序时,除了掌握基本的输入输出操作、数学计算和字符串处理技巧外,还需要注意以下几个关键点:
4.1. 输入验证
-
在接收用户输入时,务必进行必要的验证。包括检查输入的数据类型是否正确(如数字、字符串等),以及输入的值是否在预期的范围内。
-
通过输入验证,可以确保程序不会因为无效输入而崩溃或产生错误结果。
4.2. 错误处理
-
程序在运行过程中可能会遇到各种错误情况,如除数为零、文件无法打开等。
-
为了提高程序的健壮性,需要编写相应的错误处理代码来应对这些异常情况。可以包括显示错误消息、退出程序或采取其他适当的恢复措施。
4.3.代码可读性
-
编写清晰、易读的代码对于程序的维护和扩展至关重要。
-
要注意代码的格式,如缩进、空格和换行等,以使其结构清晰、易于理解。
-
同时,应遵循命名规范,为变量、函数和类等选择合适的名称,以便他人能够轻松理解代码的含义。
-
此外,添加适当的注释可以帮助解释代码的功能和目的,进一步提高代码的可读性。