第六章函数作业题解
因为本课本在编写时参考了谭浩强的《C程序设计》,所以在代码中出现了大量的单字母变量,这在开发中是应极力避免的。
一、 编写函数判断一个数是否为素数,在主函数中调用该函数输出100以内的全部素数。
让我们来看要求:“编写函数”、“用判断判断一个数是否是素数”、“主函数调用函数”、“输出100以内的全部素数”。
编写函数并让它判断一个数是否是素数,这就表明函数要有数据传入(void和int根据是否需要返回值决定),例如“int a(int b)”或“void a(int b)”【a:函数名;b:变量名】;在主函数调用函数则表明数据由主函数调用“a(b)”。
要求输出100以内全部素数,而函数我们写的是判断一个数,所以说就需要主函数做一个循环,从1到100生成数字并传入函数,最终得到输出的结果。
- Q:怎么判断素数?
A:素数是指除了1和本身之外的任何数都无法整除。所以判断素数的方法有很多,这里用的是整除判断法。循环从2开始到这个数本身,如果可以被整除就break中断循环,然后判断循环数和输入数是否相等从而判断是否是素数。 - Q:如何输出素数?
A:输出素数可以在函数里直接输出,也可以向主函数返回一个值用于判断再由主函数输出。这里用的是后者,但是效率一般没有前者高。
#include <stdio.h>
int home6_1(int num) {
int j;
for (j = 2; j <= num; j++) {
if (num % j == 0)
break;
}
if (j == num) {
return 1;
}
else {
return 0;
}
}
int main() {
int code;
for (int i = 1; i <= 100; i++) {
if (i != 1) {
code = home6_1(i);
if (code == 1) {
printf("%d ", i);
}
}
}
return 0;
}
二、编写自定义函数count,统计一个字符串中字母(不区分大小写)、数字、空格和其他字符的个数。在主函数中从键盘输入一串字符,调用该函数并输出统计结果。
这道题的要求:“编写函数count”、“统计字符串的字符个数”、“在主函数输入,由函数输出”。
这道题规定了函数名为“count”,最终的结果也由函数输出,所以就用不到给主函数再返回数据,可以用void;输入字符,肯定要用char来定义,输入之后有两种处理方法,一种是用gets或scanf循环存入数组之后由函数利用循环判断,另一种则是每读取一个字符就传到函数判断一次,这里用了第一种方法,所以说在函数用的是“void count(char a[],int b)”;判断字符类型可以用if或switch,在此不做过多赘述。
#include <stdio.h>
#include <string.h>
void count(char c[],int n) {
int j = 0, k = 0, l = 0, m = 0;
for (int i = 0; i < n; i++) {
if ((c[i] >= 65 && c[i] <= 90) || (c[i] >= 97 && c[i] <= 122)) {
j++;
}
else if (c[i] >= 48 && c[i] <= 57) {
k++;
}
else if (c[i] == 32) {
l++;
}
else {
m++;
}
}
printf("字母%d个,数字%d个,空格%d个,其他字符%d个。", j, k, l, m);
}
int main() {
char c[10000];
int j = 0, k = 0, l = 0, m = 0, n = 0;
gets(c);
n = strlen(c);
count(c, n);
return 0;
}
三、编写两个函数,分别求两个整数的最大公约数和最小公倍数,在主函数中输入两个整数,调用它们后输出结果。
要求:“两个函数”、“分别计算公约数和公倍数”、“主函数输入”。在此题中需要定义两个函数分别用于计算公约数和公倍数并返回结果
#include <stdio.h>
int home6_3_1(int m, int n) {
int i = 1;
if (m < n) {
i = m;
m = n;
n = i;
}
while (i != 0) {
i = m % n;
m = n;
n = i;
}
return m;
}
int home6_3_2(int k, int maxnum) {
int minnum;
minnum = k / maxnum;
return minnum;
}
int main() {
int m, n, k, maxnum, minnum;
scanf("%d%d", &m, &n);
k = m * n;
maxnum = home6_3_1(m, n);
minnum = home6_3_2(k, maxnum);
printf("最大公约数:%d,最小公倍数:%d\n", maxnum, minnum);
return 0;
}
四、编写一个采用冒泡法对n个数由小到大进行排序的函数。在主函数中输入n的值及n个数,然后调用自定义函数,输出排序结果。
#include <stdio.h>
void home6_4(int a[], int n) {
int temp;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
}
int main() {
int n, a[10000];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
home6_4(a, n);
return 0;
}