C语言作为一种常见的编程语言,被广泛应用在软件开发、游戏开发、嵌入式系统等领域。作为一名C语言初学者,攻克一些练习题是非常必要的。本文将为大家介绍一份精选的C语言习题集及详细解答,帮助大家轻松掌握编程技能。
一、习题集
1. 输入一个100以内的正整数n,输出1到n之间所有能被3整除但不能被5整除的数。
2. 输入n个数,求其中最大的数和第二大的数的和。
3. 输入一个整数n,然后输入n个整数,统计其中正整数的个数和负整数的个数,输出正负整数的个数和所有整数的平均值。
4. 输入三个字符串,按照字典序从小到大输出。
5. 输入一个字符串,将其中的所有大写字母转换成小写字母。
6. 输入一个字符串,判断其中是否有重复的字符。
7. 输入两个整数a、b,输出它们的最小公倍数。
8. 输入一个字符串,将其中所有的数字字符删除。
9. 输入一个字符串,将其中的所有单词按照长度从小到大排序。
10. 设计一个计算器程序,可以进行加减乘除四则运算,支持多个连续运算符。
二、解答
1. 首先输入一个100以内的正整数n:
```
int n;
do {
printf("请输入一个100以内的正整数:");
scanf("%d", &n);
} while (n < 1 || n > 100);
```
然后使用循环语句逐个判断:
```
for (int i = 1; i <= n; i++) {
if (i % 3 == 0 && i % 5 != 0) {
printf("%d ", i);
}
}
```
2. 先输入n个数:
```
int n;
printf("请输入数字个数:");
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++) {
printf("请输入第%d个数字:", i+1);
scanf("%d", &a[i]);
}
```
然后找出最大的数和第二大的数:
```
int max1 = a[0], max2 = a[0];
for (int i = 1; i < n; i++) {
if (a[i] > max1) {
max2 = max1;
max1 = a[i];
} else if (a[i] < max1 && a[i] > max2) {
max2 = a[i];
}
}
printf("最大的数是%d,第二大的数是%d,它们的和是%d\n", max1, max2, max1+max2);
```
3. 先输入n个数:
```
int n, x;
printf("请输入数字个数:");
scanf("%d", &n);
int positive_count = 0, negative_count = 0;
double sum = 0;
for (int i = 0; i < n; i++) {
printf("请输入第%d个数字:", i+1);
scanf("%d", &x);
if (x > 0) {
positive_count++;
} else if (x < 0) {
negative_count++;
}
sum += x;
}
printf("正整数的个数是%d,负整数的个数是%d,所有整数的平均值是%f\n", positive_count, negative_count, sum/n);
```
4. 直接使用strcmp函数:
```
char s[3][100];
for (int i = 0; i < 3; i++) {
printf("请输入第%d个字符串:", i+1);
scanf("%s", s[i]);
}
for (int i = 0; i < 2; i++) {
for (int j = i+1; j < 3; j++) {
if (strcmp(s[i], s[j]) > 0) {
char tmp[100];
strcpy(tmp, s[i]);
strcpy(s[i], s[j]);
strcpy(s[j], tmp);
}
}
}
for (int i = 0; i < 3; i++) {
printf("%s ", s[i]);
}
```
5. 直接遍历字符串并转换:
```
char s[100];
printf("请输入一个字符串:");
scanf("%s", s);
int len = strlen(s);
for (int i = 0; i < len; i++) {
if (s[i] >= 'A' && s[i] <= 'Z') {
s[i] += 'a' - 'A';
}
}
printf("%s\n", s);
```
6. 双重循环:
```
char s[100];
printf("请输入一个字符串:");
scanf("%s", s);
int len = strlen(s);
for (int i = 0; i < len; i++) {
for (int j = i+1; j < len; j++) {
if (s[i] == s[j]) {
printf("字符串中有重复的字符\n");
return 0;
}
}
}
printf("字符串中没有重复的字符\n");
```
7. 先输入a、b两个数,然后使用辗转相除法求最大公约数,再用a、b的积除以最大公约数即为最小公倍数:
```
int a, b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
int x = a, y = b, r;
while (y > 0) {
r = x % y;
x = y;
y = r;
}
int lcm = a * b / x;
printf("两数的最小公倍数为%d\n", lcm);
```
8. 首先输入一个字符串,然后使用isdigit函数判断每个字符是否是数字,如果是就删除:
```
char s[100];
printf("请输入一个字符串:");
scanf("%s", s);
int len = strlen(s);
for (int i = 0; i < len; i++) {
if (isdigit(s[i])) {
for (int j = i; j < len-1; j++) {
s[j] = s[j+1];
}
len--;
i--;
}
}
printf("%s\n", s);
```
9. 先将字符串中所有单词提取出来,并存储它们的长度及在字符串中的起始位置,然后按照单词长度从小到大排序:
```
char s[100];
printf("请输入一个字符串:");
scanf("%[^\n]", s);
// 提取单词
int word_count = 0, word_start[100], word_length[100];
int len = strlen(s);
for (int i = 0; i < len; i++) {
if (isalpha(s[i])) {
word_start[word_count] = i;
int j = i;
while (j < len && isalpha(s[j])) {
j++;
}
word_length[word_count] = j - i;
word_count++;
i = j-1;
}
}
// 按照单词长度从小到大排序
for (int i = 0; i < word_count-1; i++) {
for (int j = i+1; j < word_count; j++) {
if (word_length[i] > word_length[j]) {
int tmp = word_length[i];
word_length[i] = word_length[j];
word_length[j] = tmp;
tmp = word_start[i];
word_start[i] = word_start[j];
word_start[j] = tmp;
}
}
}
// 输出结果
for (int i = 0; i < word_count; i++) {
for (int j = word_start[i]; j < word_start[i]+word_length[i]; j++) {
printf("%c", s[j]);
}
printf(" ");
}
printf("\n");
```
10. 设计一个简单的计算器程序,使用一个循环不断接收用户输入,每次输入两个数和一个运算符,进行运算并输出结果,直到用户输入q退出程序:
```
while (1) {
double a, b;
char op;
printf("请输入一个表达式,支持加减乘除四则运算,q表示退出:");
scanf("%lf %c %lf", &a, &op, &b);
if (op == 'q') {
break;
}
switch (op) {
case '+': printf("%f\n", a+b); break;
case '-': printf("%f\n", a-b); break;
case '*': printf("%f\n", a*b); break;
case '/': printf("%f\n", a/b); break;
default: printf("不支持的操作符\n"); break;
}
}
```
以上就是一些常见的C语言习题及其详细解答,希望能够对大家学习C语言有所帮助。实际上,完成练习题仅仅是学习C语言的一小步,还需要多写代码、多思考、多实践才能真正掌握C语言的编程技能。