【趣学C语言和数据结构100例】
问题概览
本文精选了五个基础编程问题,涉及字符串操作、数组处理、递归计算等核心编程概念,旨在通过C语言实现,加深对算法和数据结构的理解,并提升编程技能。
问题列表
- 21. 字符串比较:编写程序比较两个字符串,并根据比较结果输出相应的整数值。
- 22. 字符串复制:编写程序将一个字符数组的内容复制到另一个字符数组中,不使用
strcpy
函数。 - 23. 字符串长度计算:编写程序计算字符串的长度,不使用
strlen
函数。 - 24. 单词统计:编写程序统计一行字符中的单词数量,单词之间用空格分隔。
- 25. 递归计算阶乘:编写程序使用递归方法计算5的阶乘。
问题描述
编写一个程序,将两个字符串 s1 和 s2 比较
编写一个程序,将字符数组 s2 中的全部字符复制到字符数组 s1 中,不用 strcpy 函数。复制时,'0' 也要赋值过去。“0”之后的字符不复制。
编写一个程序,求字符数组 s 的长度,不用 strlen 函数。数组 s 从键盘输入,长度不超过 50。
输入一行字符,统计其中有多少个单词,单词之间用空格分开。
利用递归方法求 5!
代码分析
==21.字符串比较==
分析:gets输入2个字符串s1和s2,如果s1>s2,输出一个整数:若 s1=s2,输出 0:若sl<s2,输出一个负数:输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的 ASCI 码的差值。所以条件为!(ret=s1[index]-s2[index]) && s1[index]!='\0' && s2[index]!='\0'。
==22.字符串赋值,不用 strcpy 函数==
分析:scanf输入2个字符串s1和s2,条件为s2[index] != '\0',==注意'0' 也要赋值过去==。跳出循环后, s1[index] = s2[index];。
==23.字符串长度,不用 strlen 函数==
分析:scanf输入1个字符串s1,条件为s[index++]!='\0',用来计数。
==24. 统计单词个数==
分析:gets输入1个字符串s1,使用for循环,每次遇到' '(空格),则计数。
==25.初识递归==
分析:递归在与定义func,并在func中使用func,和递归的结束条件。本题为递归求 5!,1.定义func(n),2.返回值为:return nfunc(n-1),递归的结束条件if(n==1 || n==0){return 1;} 否则一直return nfunc(n-1)
代码实现
#include <stdio.h>
//25的递归
int fact(int x){
int sum=0;
if(x==1 || x==0){
sum=1;
}
else{
sum=x*fact(x-1);
}
return sum;
}
int main()
{
// 21.编写一个程序,将连个字符串 s1 和 s2 比较,
// 如果s1>s2,输出一个整数:若 s1=s2,输出 0:若sl<s2,输出一个负数:
// 若s1>s2,输出一两个一个正数。不要用 strcmp 函数:字符串用 gets 函数读入。
// 输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的 ASCI 码的差值。
// 例如,“A"和“C”相比,由于"A”<“℃”,应输出负数,同时由于'A'与'C的 ASCI 码差值为 2,
// 因此应输出"-2"。同理:“And”和"Aid"相比较,根据第2个字符比较结果,“n"比"i"大 5,因此应输出"5”
char s1[100] = {
0};
char s2[50] = {
0};
int index = 0,ret=0;
printf("输入字符串 s1: ");
gets(s1);
printf("输入字符串 s2: ");
gets(s2);
while(!(ret=s1[index]-s2[index]) && s1[index]!='\0' && s2[index]!='\0'){
index++;
}
printf("%d\n",ret);
// 22.编写一个程序,将字符数组s2 中的全部字符复制到字符数组 s1 中,不用 strcpy 函数。复制时, '0’也要赋值过去。“0’之后的字符不复制。
char s1[100] = {
0};
char s2[50] = {
0};
int index = 0;
printf("输入字符串 s1: ");
scanf("%s", s1);
printf("输入字符串 s2: ");
scanf("%s", s2);
while (s2[index] != '\0') {
s1[index] = s2[index];
index++;
}
s1[index] = s2[index];
printf("字符数组s2 中的全部字符复制到字符数组 s1的字符串:%s\n", s1);
// 23.编写一个程序,求字符数组s的长度,不用 stlen 函数。数组s山键盘输入,长度不超过 50.
char s[100] = {
0};
int index = 0;
printf("输入字符串 s: ");
scanf("%s", s);
while(s[index++]!='\0'){
}
printf("宁符数组s的长度:%d\n", index-1);
// 24.输入一行字符,统计其中有多少个单词,单词之间用空格分开。
char s[100] = {
0};
int num = 0;
printf("输入字符串 s: ");
gets(s);
for(int i=0;s[i]!='\0';i++){
if(s[i]==' '){
num++;
}
}
printf("宁符数组s的长度:%d\n", num);
// 25.利用递归方法求 5!
int n,num;
printf("输入递归方法的数:");
scanf("%d",&n);
num=fact(n);
printf("递归法求%d!的值为:%d",n,num);
return 0;
}
总结
本文介绍了五个基础编程问题及其C语言实现,这些问题覆盖了字符串操作、数组处理、递归计算等多个编程基础领域。通过这些编程练习,我们不仅能够锻炼编程技巧,还能深入理解算法和数据结构的基本概念。
字符串比较问题要求我们比较两个字符串,并根据比较结果输出相应的整数值。这个问题的解决关键在于逐字符比较两个字符串,并在找到不同的字符或字符串结束时输出结果。
字符串复制问题要求我们将一个字符数组的内容复制到另一个字符数组中,但不能使用strcpy
函数。这个问题的解决需要我们手动遍历源字符串,并将每个字符复制到目标字符串中,直到遇到字符串结束符\0
。
字符串长度计算问题要求我们计算一个字符串的长度,但不能使用strlen
函数。这个问题的解决需要我们手动遍历字符串,计数直到遇到字符串结束符\0
。
单词统计问题要求我们统计一行字符中单词的数量,单词之间用空格分开。这个问题的解决需要我们识别空格字符,每当遇到空格时,增加单词计数。
递归计算阶乘问题要求我们使用递归方法计算5的阶乘。这个问题的解决关键在于理解递归的基本原理,即函数自我调用,直到满足结束条件。
这些算法的实现不仅展示了C语言在处理字符串和数组时的能力,也体现了算法设计的基本思想,如条件判断、循环控制和递归。通过这些算法的学习,我们可以更好地理解数据结构和算法的基本概念,提高解决实际问题的能力。
总的来说,这些算法问题不仅锻炼了编程能力,也加深了对数据结构和算法的理解。通过这些问题的解决,我们可以逐步提高自己的编程技能,为将来的学习和工作做好准备。这些算法的掌握对于计算机专业的学生和软件开发人员来说都是非常重要的。通过这些练习,我们可以逐步提高自己的编程技能,为将来的学习和工作做好准备。同时,这些问题的解决也体现了算法在处理数据时的灵活性和效率,为我们在实际开发中遇到类似问题提供了解决思路。