文章目录
第四章
4.4
有3个整数a, b, c,由键盘输入,输出其中最大的数。
#include <stdio.h>
void compare(int a, int b, int c, int* x, int* y);
void swap(int* n, int* m);
int main()
{
int a, b, c;
int x = 0, y = 0;
printf("please input three numbers!\n");
while (scanf("%d %d %d", &a, &b, &c) == 3) {
compare(a, b, c, &x, &y);
printf("the larger is %d, the lesser is %d\n", x, y);
printf("please input three numbers!\n");
}
return 0;
}
void compare(int a, int b, int c, int* x, int* y)
{
if (a < b) swap(&a, &b);
if (a < c) swap(&a, &c);
if (b < c) swap(&b, &c);
*x = a;
*y = c;
}
void swap(int* n, int* m) {
int tmp = *n;
*n = *m;
*m = tmp;
}
4.6
有一个函数,编写程序,输入x的值,输出y相应的值。
#include <stdio.h>
int main()
{
double x, y;
printf("please input a number to analysis.\n");
while (scanf("%lf", &x) == 1) {
if (x < 1) y = x;
else if (x >= 1 && x < 10) y = 2 * x - 1;
else y = 3 * x - 11;
printf("x对应的Y值为%.2lf\n", y);
printf("please input a number to analysis.\n");
}
}
4.8
给出一百分制成绩,要求输出成绩等 级’A’、‘B’、‘C’、‘D’、‘E’。 90分以上为’A’,8089分为’B’,7079分为’C’ ,60~69分为’D’ ,60分以下为’E’。
#include <stdio.h>
int main()
{
int score;
printf("please input your score and enter # to finish!\n");
while (scanf("%d", &score) == 1) {
if (score >= 0 && score <= 100) {
if (score >= 90) printf("A\n");
else if (score >= 80 && score < 90) printf("B\n");
else if (score >= 70 && score < 80) printf("C\n");
else if (score >= 60 && score < 70) printf("D\n");
else printf("E\n");
printf("please input your score and enter # to finish!\n");
}
else {
printf("please try again!\n");
return 0;
}
}
return 0;
}
4.9
给一个不多于5位的正整数,要求:
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为321,应输出123。
#include <stdio.h>
int digits(int a);
void EveryNum(int b, int c);
int main()
{
int n, m;
printf("请输入一个不多于五位数的正数\n");
scanf("%d", &n);
if (n >= 0 && n < 10000) {
printf("这个数字有%d位\n",m = digits(n));
EveryNum(n, m);
}
else printf("请重新输入!\n");
return 0;
}
int digits(int a) {
if (a >= 1 && a < 10) return 1;
else if (a >= 10 && a < 100) return 2;
else if (a >= 100 && a < 1000) return 3;
else return 4;
}
void EveryNum(int b, int c) {
int d, e, f, g;
printf("千位的数字为:%d\n",d = b / 1000);
printf("百位的数字为:%d\n",e = (b / 100) % 10);
printf("十位的数字为:%d\n", f = (b / 10) % 10);
printf("个位的数字为: %d\n",g = b % 10);
if (c == 1) printf("%d", g);
else if (c == 2) printf("%d%d", g, f);
else if (c == 3) printf("%d%d%d", g, f, e);
else printf("%d%d%d%d", g, f, e, d);
}
第五章
5.3
输人两个正整数m和n,求其最大公约数和最小公倍数
#include <stdio.h>
int FindLesser(int x, int y);
int main()
{
int n, m;
printf("请输入两个正整数!\n");
scanf("%d %d", &n, &m);
int a = FindLesser(n, m);
if (n >= 0 && m >= 0) {
for (int i = a; i <= n * m; i++) {
if (i % n == 0 && i % m == 0) {
printf("这两个数的最小公倍数为:%d\n", i);
break;
}
}
for (int i = a; i >= 1; i--) {
if (n % i == 0 && m % i == 0) {
printf("这两个数的最大公约数为:%d\n", i);
break;
}
}
}
return 0;
}
int FindLesser(int x, int y) {
if (x < y) return x;
else return y;
}
5.4
输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
在这里插入代码片#include <stdio.h>
int main()
{
char ch;
int a = 0, b = 0, c = 0, d = 0;
printf("请输入一行字符!\n");
ch = getchar();
while (ch != '\n') {
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') a++;
else if (ch >= '0' && ch <= '9') b++;
else if (ch == ' ') c++;
else d++;
ch = getchar();
}
printf("这串字符中英文字母的个数为:%d, \n", a);
printf("数字的个数为:%d\n", b);
printf("空格的个数为:%d\n", c);
printf("其他字符的个数为:%d\n", d);
return 0;
}
5.6
#include <stdio.h>
int main()
{
double total_sum = 0;
for (int i = 1; i <= 20; i++) {
double sum = 1;
for (int j = i; j > 0; j--) sum *= j;
total_sum += sum;
}
printf("二十的阶乘为:%lf", total_sum);
return 0;
}
5.8(水仙花数)
输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1*+5*+3。
#include <stdio.h>
int main()
{
for (int n = 100; n >= 100 && n < 1000; n++) {
int a = n % 10;
int b = (n / 10) % 10;
int c = n / 100;
if (n == a * a * a + b * b * b + c * c * c) {
printf("%d", n);
putchar(' ');
}
}
return 0;
}
第六章
6.1
用筛选法求100之内的素数
#include <stdio.h>
int main()
{
printf("100以内的素数有:\n");
for (int i = 2; i <= 100; i++) {
for (int j = 2; j <= i; j++) {
if (i == j) printf("%d\n", i);
if (i % j == 0) break;
}
}
return 0;
}
6.3
求一个3 X 3的整形矩阵对角线元素之和
#include <stdio.h>
int LeftDiagonal(int array[][3]);
int RightDiagonal(int array[][3]);
int main()
{
int num[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("矩阵对角线元素之和为: %d", LeftDiagonal(num) + RightDiagonal(num));
return 0;
}
int LeftDiagonal(int array[][3])
{
int sum1 = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j)
sum1 += array[i][j];
}
}
return sum1;
}
int RightDiagonal(int array[][3])
{
int sum2 = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i + j == 2 && i != j)
sum2 += array[i][j];
}
}
return sum2;
}
6.4
有一个已经排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中
#include <stdio.h>
int main()
{
int n, i;
int num[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
printf("请输入你想插入的数据\n");
scanf("%d", &n);
for (i = 9; i >= 0; i--) {
num[i + 1] = num[i];
if (n >= num[i])
break;
}
num[i + 1] = n;
for (int a = 0; a <= 10; a++) printf("%d ", num[a]);
return 0;
}
6.6
输出一下的杨慧三角(要求输出10行)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
……
杨辉三角最本质的特征是:
它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。
#include <stdio.h>
int main()
{
int num[10][10];
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0) num[i][j] = 1;
else if (i == j) num[i][j] = 1;
else num[i][j] = num[i - 1][j - 1] + num[i - 1][j];
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++)
printf("%d ", num[i][j]);
putchar('\n');
}
}
第七章
7.2 (求解一元二次方程)
#include <stdio.h>
#include <math.h> // 提供sqrt()函数的头文件
int main()
{
float a, b, c;
printf("请分别输入一元二次方程的二次项系数,一次项系数和常数项系数。\n");
scanf("%f %f %f", &a, &b, &c);
float m = b * b - 4 * a * c;
if (a == 0) {
printf("please try again!\n");
return 0;
}
else {
if (m < 0) {
printf("此方程无根!\n");
return 0;
}
else if (m == 0) {
float root = (-b + sqrt(m)) / 2 * a;
printf("该方程的一个根为:\n", root);
}
else {
float root1 = (-b + sqrt(m)) / 2 * a;
float root2 = (-b - sqrt(m)) / 2 * a;
printf("该方程的两个根分别为:x1 = %.2f, x2 = %.2f", root1, root2);
}
}
return 0;
}
7.4
写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换。
#include <stdio.h>
void ReverseNum(int array[][3]);
void PrintfNum(int array[][3]);
int main()
{
int num[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("转置前:\n");
PrintfNum(num);
ReverseNum(num);
printf("转置后:\n");
PrintfNum(num);
}
void ReverseNum(int array[][3])
{
for (int i = 0; i < 3; i++) {
for (int j = 0; j <= i; j++) {
int tmp = array[i][j];
array[i][j] = array[j][i];
array[j][i] = tmp;
}
}
}
void PrintfNum(int array[][3])
{
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", array[i][j]);
}
putchar('\n');
}
}
7.6
写一个函数,将两个字符串连接。
#include <stdio.h>
#include <string.h>
void ConnectStr(char string1[],char string2[],char string[]);
int main()
{
char str1[50] = {0}, str2[50] = {0}, str[100] = {0};
printf("please input string1:\n");
scanf("%s", str1);
printf("please input string2:\n");
scanf("%s", str2);
ConnectStr(str1, str2, str);
printf("the string is:\n");
printf("%s\n", str);
return 0;
}
void ConnectStr(char string1[], char string2[], char string[])
{
int i, j;
strcpy(string, string1);
for (i = 0; i < 50; i++) {
if (string[i] == '\0') break;
}
for (j = 0; j < 50; j++)
string[i + j] = string2[j];
string[i + j + 1] = '\0';
}
7.8
写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”。
#include <stdio.h>
void HandleStr(char arr[]);
int main()
{
char str[5];
printf("please input four digits to deal with.\n");
scanf("%s", str);
printf("The processed string is:\n");
HandleStr(str);
return 0;
}
void HandleStr(char arr[])
{
for (int i = 0; arr[i] != '\0'; i++) {
printf("%c", arr[i]);
printf(" ");
}
}
第八章
8.1
输入3个整数,要求按由小到大的顺序输出
#include <stdio.h>
void compare(int a, int b, int c);
void swap(int* m, int* n);
int main()
{
int x, y, z;
printf("please input three numbers to compare!\n");
scanf("%d %d %d", &x, &y, &z);
compare(x, y, z);
return 0;
}
void compare(int a, int b, int c)
{
if (a > b) swap(&a, &b);
if (a > c) swap(&a, &c);
if (b > c) swap(&b, &c);
printf("%d %d %d", a, b, c);
}
void swap(int* m, int* n)
{
int tmp = *m;
*m = *n;
*n = tmp;
}
8.6
写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。
#include <stdio.h>
int LengthStr(char str[]);
int main()
{
char s[20];
printf("please input a string to calculate length!\n");
scanf("%s", s);
printf("length of this string is %d", LengthStr(s));
return 0;
}
int LengthStr(char str[])
{
int i;
for (i = 0; str[i] != '\0'; i++);
return i;
}
8.7
有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
#include <stdio.h>
void mystrcpy(char arr[]);
int main()
{
char str1[30];
printf("please input a string to analysis.\n");
scanf("%s", str1);
mystrcpy(str1);
printf("the processed string is %s", str1);
return 0;
}
void mystrcpy(char arr[])
{
int i;
char str2[30];
printf("please input another string to copy.\n");
scanf("%s", str2);
for (i = 0; str2[i] != '\0'; i++)
arr[i + 3] = str2[i]; //从第四个位置开始复制
arr[i + 3] = '\0';
}
第九章
9.3
编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输人这些记录,用print函数输出这些记录
#include <stdio.h>
struct student {
int num;
char name[10];
int score[3];
}stu[5];
void MyPrintf(struct student stu[]);
int main()
{
for (int i = 0; i < 5; i++) {
printf("请分别输入该学生的学号,姓名,三科成绩!\n");
scanf("%d %s %d %d %d", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1],
&stu[i].score[2]);
}
MyPrintf(stu);
return 0;
}
void MyPrintf(struct student stu[])
{
for (int j = 0; j < 5; j++) {
printf("%d %s %d %d %d", stu[j].num, stu[j].name, stu[j].score[0], stu[j].score[1], stu[j].score[2]);
printf("\n");
}
}
排序
插入排序法
#include <stdio.h>
int main()
{
int num[10] = {1, 4, 7, 2, 5, 3, 8, 6, 9, 0};
for (int i = 1; i < 10; i++) { //每一轮要插入的数是num[i]
int n = num[i];
int j = i;
while (n < num[j - 1] && j >= 1) {
num[j] = num[j - 1];
j--;
}
num[j] = n;
}
for (int i = 0; i < 10; i++)
printf("%d ", num[i]);
return 0;
}
选择排序法
#include <stdio.h>
#define SIZE 10
int main()
{
int num[SIZE] = { 1, 4, 7, 2, 11, 3, 8, 6, 9, 10 };
for (int i = 0; i < SIZE - 1; i++) {
int min = i;
for (int j = i + 1; j < SIZE; j++) {
if (num[min] > num[j])
min = j;
}
int tmp = num[i];
num[i] = num[min];
num[min] = tmp;
}
for (int i = 0; i < 10; i++)
printf("%d ", num[i]);
return 0;
}
冒泡排序
#include <stdio.h>
int main()
{
int num[10] = { 1, -4, 7, 2, 11, 3, 8, -6, 9, 0 };
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (num[i] > num[j]) {
int tmp = num[j];
num[j] = num[i];
num[i] = tmp;
}
}
}
for (int i = 0; i < 10; i++)
printf("%d ", num[i]);
return 0;
}