1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
#include <stdio.h>
int gongyue(int a, int b) {
int t;
if(a < b) {
t = a;
a = b;
b = t;
}
while(b) {
t = a % b;
a = b;
b = t;
}
return a;
}
int gongbei(int a, int b) {
int t = gongyue(a, b);
return (a * b) / t;
}
int main() {
int a, b;
printf("请输入a和b的值(a,b):");
scanf("%d,%d", &a, &b);
printf("\n最大公约数:%d\n", gongyue(a, b));
printf("\n最小公倍数:%d\n", gongbei(a, b));
}
2.求方程的根,用3个函数分别求当:大于0、等于0和小于0时的根并输出结果。从主函数输人a, b, c的值。
#include <stdio.h>
#include <math.h>
void f1(int a, int b, int c) {
double res1, res2;
res1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
res2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
printf("\nres1 = %lf, res2 = %lf\n", res1, res2);
}
int f2(int a, int b, int c) {
double res;
res = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
printf("\nres = %lf\n", res);
return 0; // 添加返回值
}
int main() {
int a, b, c, t;
printf("请输入a, b, c的值(a,b,c):");
scanf("%d,%d,%d", &a, &b, &c); // 修改输入格式
if (a == 0) {
printf("a不能为0\n");
return 1; // 退出程序
}
t = b * b - 4 * a * c;
if (t > 0) {
printf("\n△ = %d > 0\n", t);
f1(a, b, c);
}
else if (t == 0) {
printf("\n△ = %d = 0\n", t);
f2(a, b, c);
}
else {
printf("\n△ = %d < 0\n", t);
printf("无实数根\n");
}
return 0;
}
3.写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息。
#include <stdio.h>
int isprime(int a) {
int i;
for(i = 2; i <= a / 2; i++) {
if(a % i == 0) return 0;
}
if(i > a / 2) return 1;
return 0;
}
int main() {
int x, flag;
printf("请输入一个整数:");
scanf("%d", &x);
flag = isprime(x);
if(flag == 1) printf("%d是素数\n", x);
else printf("%d不是素数\n", x);
return 0;
}
4.写一个函数,使给定的一个3×3的二维整型数组转置,即行列互换。
#include <stdio.h>
#define M 3
void reverse(int a[][M]) {
int i, j, t;
for(i = 0; i < M; i++) {
for(j = 0; j <= i; j++) {
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
}
int main() {
int a[M][M] = {1, 2, 3, 4, 5, 6, 7 , 8, 9}, i, j;
printf("\nbefore:\n");
for(i = 0; i < M; i++) {
for(j = 0; j < M; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
reverse(a);
printf("\nafter:\n");
for(i = 0; i < M; i++) {
for(j = 0; j < M; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
#include <stdio.h>
#include <string.h>
#define M 80
void reverse(char a[M], int n) {
int i, t;
for(i = 0; i < n / 2; i++) {
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
}
int main() {
char a[M];
int n;
printf("请输入一个字符串:");
scanf("%s", a);
n = strlen(a);
printf("\n反序前:%s\n", a);
reverse(a, n);
printf("\n反序后:%s\n", a);
return 0;
}
6.写一个函数,将两个字符串连接。
#include <stdio.h>
#include <string.h>
#define M 80
void contact(char a[M], char b[M], char res[M * 2]) {
int i, j;
for(i = 0; a[i] != '\0'; i++) {
res[i] = a[i];
}
for(j = 0; b[j] != '\0'; j++) {
res[i++] = b[j];
}
res[i] = '\0';
}
int main() {
char a[M], b[M], res[M * 2];
int n;
printf("请输入第一个字符串:");
scanf("%s", a);
printf("请输入第二个字符串:");
scanf("%s", b);
contact(a, b, res);
printf("\n连接后:%s\n", res);
return 0;
}
7.写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
#include <stdio.h>
#include <string.h>
#define M 80
void fun(char a[M], char res[M]) {
int i, j = 0;
for(i = 0; a[i] != '\0'; i++) {
if(a[i] == 'a' || a[i] == 'A' || a[i] == 'e' || a[i] == 'E' || a[i] == 'i' ||
a[i] == 'I' || a[i] == 'o' || a[i] == 'O' || a[i] == 'u' || a[i] == 'U') {
res[j++] = a[i];
}
}
res[j] = '\0';
}
int main() {
char a[M], res[M];
int n;
printf("请输入一个字符串:");
scanf("%s", a);
fun(a, res);
printf("\n所有元音字母:%s", res);
return 0;
}
8.写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输入1990,应输出“1990”。
#include <stdio.h>
#define M 8
void fun(char a[M], int num) {
int i = 0, n = num, t;
while(n > 0) {
a[i] = n % 10 + '0';
n = n / 10;
a[i + 1] = ' ';
i += 2;
}
a[i - 1] = '\0';
}
int main() {
char a[M];
int num, i;
printf("\n请输入一个4位数字:");
scanf("%d", &num);
while(num < 1000 || num > 9999) {
printf("\n输入有误,请重新输入:");
scanf("%d", &num);
}
fun(a, num);
for(i = M - 1; i >= 0; i--) {
printf("%c", a[i]);
}
return 0;
}
9.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
#include <stdio.h>
#define M 80
int letter = 0, number = 0, space = 0, other = 0;
void fun(char a[M]) {
int i;
for(i = 0; a[i] != '\0'; i++) {
if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) letter++;
else if(a[i] >= '0' && a[i] <= '9') number++;
else if(a[i] == ' ') space++;
else other++;
}
}
int main() {
char a[M];
printf("\n请输入一个字符串:");
gets(a);
fun(a);
printf("\n%s\n字母:%d,数字:%d,空格:%d,其他字符:%d\n", a, letter, number, space, other);
return 0;
}
10.写一个函数,输入一行字符,将此字符串中最长的单词输出。
#include <stdio.h>
#define M 80
void fun(char a[M], char b[M]) {
int i, j, count = 0, max = 0;
for(i = 0; a[i] != '\0'; i++) {
if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')){
count++;
}
if((a[i] == ' ' && a[i + 1] != ' ') || (a[i] != ' ' && a[i + 1] == '\0')) {
if(max < count) {
max = count;
j = i - max;
}
count = 0;
}
}
for(i = 0; i < max; i++) b[i] = a[j++];
b[i]= '\0';
}
int main() {
char a[M], b[M];
printf("\n请输入一个字符串:");
gets(a);
fun(a, b);
printf("\n%s\n", b);
return 0;
}
11.写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排列。
#include <stdio.h>
#include <string.h>
#define M 80
void fun(char a[M]) {
int i, j;
char t;
for(i = 0; a[i] != '\0'; i++) {
for(j = 0; j < strlen(a) - i; j++) {
if(a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
int main() {
char a[M];
printf("\n请输入一个字符串:");
gets(a);
fun(a);
printf("\nafter: %s\n", a);
return 0;
}
12.用牛顿迭代法求根。方程为,系数a, b, c, d的值依次为1, 2, 3, 4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
#include <stdio.h>
#include <math.h>
double fun(int a, int b, int c, int d) {
double x0 = 1.0, x1 = 0.0, f1, f2;
while(fabs(x1 - x0) >= 1e-6) {
x0 = x1;
f1 = a * pow(x0, 3) + b * pow(x0, 2) + c * x0 + d;
f2 = 3 * a * pow(x0, 2) + 2 * b * x0 + c;
x1 = x0 - f1 / f2;
}
return x1;
}
int main() {
int a, b, c, d;
double x;
printf("\n请输入a, b, c, d的值:");
scanf("%d%d%d%d", &a, &b, &c, &d);
x = fun(a, b, c, d);
printf("%.7lf", x);
return 0;
}
13.用递归方法求n阶勒让德多项式的值,递归公式为
#include <stdio.h>
#include <math.h>
float p(int n, float x) {
float res;
if(n == 0) return 1;
if(n == 1) return x;
if(n > 1) {
res = ((2 * n - 1) * x * p(n - 1, x) - (n - 1) * p(n - 2, x)) / n;
}
return res;
}
int main() {
int n;
float x;
printf("input x,n: ");
scanf("%f%d", &x, &n);
printf("%f\n", p(n, x));
return 0;
}
14.输入10个学生5门课的成绩,分别用函数实现下列功能:
①计算每个学生的平均分;
②计算每门课的平均分;
③找出所有50个分数中最高的分数所对应的学生和课程;
④计算平均分方差:
其中,为某一学生的平均分。
#include <stdio.h>
#include <math.h>
#define M 10
#define N 5
void f1(int a[M][N]) {
int i, j;
float average[M], sum;
for(i = 0; i < M; i++) {
sum = 0.0;
for(j = 0; j < N; j++) {
sum += a[i][j];
}
average[i] = sum / N;
}
printf("\n\n每个学生的平均分\n");
for(i = 0; i < M; i++) {
printf("--学生%d:%.2f\n", i + 1, average[i]);
}
}
void f2(int a[M][N]) {
int i, j;
float average[M], sum;
for(j = 0; j < N; j++) {
sum = 0.0;
for(i = 0; i < M; i++) {
sum += a[i][j];
}
average[j] = sum / M;
}
printf("\n\n每门课程的平均分\n");
for(i = 0; i < N; i++) {
printf("--课程%d:%.2f\n", i + 1, average[i]);
}
}
void f3(int a[M][N]) {
int i, j, max = a[0][0], m, n;
for(i = 0; i < M; i++) {
for(j = 0; j < N; j++) {
if(max < a[i][j]) {
max = a[i][j];
m = i + 1;
n = j + 1;
}
}
}
printf("\n\n--最高分:%d\t学生%d\t课程%d\n", max, m, n);
}
void f4(int a[M][N]) {
int i, j, average[M];
float s, sum = 0.0, sumx = 0.0, res;
for(i = 0; i < M; i++) {
s = 0.0;
for(j = 0; j < N; j++) {
s += a[i][j];
}
average[i] = s / N;
sum += average[i];
sumx += average[i] * average[i];
}
res = sumx / M - pow(sum / M, 2);
printf("\n\n--平均分方差:%.2f\n", res);
}
int main() {
// int a[M][N] = {87,88,92,67,78,88,86,87,98,90,76,75,65,65,78,67,87,60,90,67,77,78,85,64,56,76,89,94,65,76,78,75,64,67,77,77,76,56,87,85,84,67,78,76,89,86,75,64,69,90}, i, j;
int a[M][N], i, j;
printf("请分别输入10名学生的5门课成绩\n\n");
for(i = 0; i < M; i++) {
printf("--学生%d\n", i + 1);
for(j = 0; j < N; j++) {
printf("课程%d:", j + 1);
scanf("%d", &a[i][j]);
}
printf("\n");
}
f1(a);
f2(a);
f3(a);
f4(a);
return 0;
}
15.写几个函数:
①输入10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
16.写一个函数,输入一个十六进制数,输出相应的十进制数。
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#define M 80
int fun(char a[M]) {
int i = 0, res = 0;
while (a[i] != '\0') {
if (a[i] >= '0' && a[i] <= '9') {
res = res * 16 + a[i] - '0';
}
else if (a[i] >= 'a' && a[i] <= 'f') {
res = res * 16 + a[i] - 'a' + 10;
}
else if (a[i] >= 'A' && a[i] <= 'F') {
res = res * 16 + a[i] - 'A' + 10;
}
i++;
}
return res;
}
int main() {
char a[M];
int res;
printf("\n请输入一个十六进制数:");
gets_s(a);
while (1) {
int valid = 1;
for (int i = 0; i < strlen(a); i++) {
if (!((a[i] >= '0' && a[i] <= '9') || (a[i] >= 'a' && a[i] <= 'f') || (a[i] >= 'A' && a[i] <= 'F'))) {
valid = 0;
break;
}
}
if (valid) {
break;
}
else {
printf("\n输入有误,请重新输入:");
gets_s(a);
}
}
res = fun(a);
printf("\n( %s )16 ----→ ( %d )10\n", a, res);
return 0;
}
17.用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串"483"。n的位数不确定,可以是任意位数的整数。
18.给出年、月、日,计算该日是该年的第几天。
#include <stdio.h>
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int fun(int y, int m, int d) {
int i, flag = 0, res = 0;
if((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) flag = 1;
for(i = 1; i < m; i++) {
res += month[i];
}
res += d;
if(flag == 1 && m > 2) res++;
return res;
}
int main() {
int y, m, d, flag = 0, res;
printf("\n请输入年月日:");
scanf("%d%d%d", &y, &m, &d);
while(1) {
if(m < 1 || m > 12 || d < 1) flag = 1;
if(m == 2 && d > 29) flag = 1;
if((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) flag = 1;
else if(d > 31) flag = 1;
if(flag == 1) {
printf("\n输入有误,请重新输入年月日:");
scanf("%d%d%d", &y, &m, &d);
flag = 0;
continue;
}
break;
}
res = fun(y, m, d);
printf("\n%d/%d/%d ----→ 第%d天\n", y, m, d, res);
return 0;
}
标签:return,int,res,++,谭浩强,课后,printf,习题,include
From: https://blog.csdn.net/qq_75021272/article/details/145279782