1.用筛选法求100之内的素数。
#include <stdio.h>
int main() {
int a[100] = {0}, i, j;
for(i = 0; i < 100; i++) a[i] = i + 1;
for(i = 2; i < 100; i++) {
for(j = 2; j < a[i]; j++) {
if(a[i] % j == 0) break;
}
if(j >= a[i]) {
printf("%4d", a[i]);
}
}
return 0;
}
2.用选择法对10个整数排序。
#include <stdio.h>
int main() {
int a[10] = {6, 4, 9, 0, 5, 1, 7, 2, 8, 3}, i, j, min, t;
for(i = 0; i < 10; i++) {
min = i;
for(j = i + 1; j < 10; j++) {
if(a[min] > a[j]) min = j;
}
t = a[i];
a[i] = a[min];
a[min] = t;
}
for(i = 0; i < 10; i++) {
printf("%3d", a[i]);
}
return 0;
}
3.求一个3×3的整型矩阵对角线元素之和。
#include <stdio.h>
int main() {
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9}, i, sum = 0;
for(i = 0; i < 3; i++) {
sum += a[i][i];
}
printf("sum = %d", sum);
return 0;
}
4.有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插人数组中。
#include <stdio.h>
int main() {
int a[11] = {2, 6, 11, 14, 19, 20, 25, 31, 38, 40}, num, i, j;
printf("请输入要插入的数:");
scanf("%d", &num);
for(i = 0; i < 10; i++) {
if(a[i] > num) {
j = i;
break;
}
}
for(i = 10; i > j; i--) {
a[i] = a[i - 1];
}
a[j] = num;
for(i = 0; i < 11; i++) {
printf("%3d", a[i]);
}
return 0;
}
5.将一个数组中的值按逆序重新存放。例如,原来顺序为8, 6, 5, 4, 1。要求改为1, 4, 5, 6, 8。
#include <stdio.h>
#define N 5
int main() {
int a[N] = {8, 6, 5, 4, 1}, i, t;
for(i = 0; i < N / 2; i++) {
t = a[i];
a[i] = a[N - i - 1];
a[N - i - 1] = t;
}
for(i = 0; i < N; i++) {
printf("%3d", a[i]);
}
return 0;
}
6.输出以下的杨辉三角形(要求输出10行)。
#include <stdio.h>
#define N 10
int main() {
int a[N][N] = {0}, i, j;
for(i = 0; i < N; i++) {
a[i][0] = 1;
a[i][i] = 1;
for(j = 1; j < i; j++) {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
for(i = 0; i < N; i++) {
for(j = 0; j <= i; j++) {
printf("%6d", a[i][j]);
}
printf("\n");
}
return 0;
}
7.输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
要求输出1~的自然数构成的魔方阵。
#include <stdio.h>
#define N 10
int main() {
int a[N][N] = {0}, n, i = 0, j, k = 1;
printf("请输入n的值(1~9的奇数):");
scanf("%d", &n);
while(n < 1 || n > 9 || n % 2 == 0) {
printf("\n输入有误,请重新输入(1~9的奇数):");
scanf("%d", &n);
}
j = n / 2;
a[i][j] = k;
while(k <= n * n) {
i--;
j++;
k++;
if(i < 0 && j >= n) {
i += 2;
j--;
} else if(i < 0) {
i = n - 1;
} else if(j >= n) {
j = 0;
}
if(a[i][j] == 0) {
a[i][j] = k;
} else {
i += 2;
j--;
a[i][j] = k;
}
}
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
printf("%3d", a[i][j]);
}
printf("\n");
}
return 0;
}
8.找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
#include <stdio.h>
#define M 4
#define N 5
int main() {
int a[M][N] = {1, 2, 3, 4, 5, 2, 4, 6, 8, 10, 3, 6, 9, 12, 15, 4, 8, 12, 16, 20}, i, j, k, max, min, flag = 0;
for(i = 0; i < M; i++) {
max = a[i][0];
for(j = 0; j < N; j++) {
if(max < a[i][j]){
max = a[i][j];
k = j;
}
}
min = max;
for(j = 0; j < M; j++) {
if(min > a[j][k]) min = a[j][k];
}
if(max == min) {
flag = 1;
break;
}
}
if(flag == 1) {
printf("%3d\n", max);
} else {
printf("无鞍点\n");
}
return 0;
}
9.有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。
#include <stdio.h>
#define N 15
int main() {
int a[N] = {99, 91, 87, 80, 76, 71, 64, 58, 52, 47, 46, 38, 31, 22, 16}, l = 0, r = N - 1, mid, num, flag = 0;
printf("请输入要查找的值:");
scanf("%d", &num);
while(l <= r) {
mid = (l + r) / 2;
if(a[mid] == num) {
flag = 1;
printf("a[%d] = %d\n", mid, num);
break;
} else if(a[mid] > num) {
l = mid + 1;
} else {
r = mid - 1;
}
}
if(flag == 0) {
printf("无此数\n");
}
return 0;
}
10.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
#include <stdio.h>
#include <string.h>
#define M 3
#define N 80
int main() {
char a[M][N] = {"", "", ""};
int i, j, b[15] = {0};
printf("请输入3个字符串:\n");
for(i = 0; i < 3; i++) {
gets(a[i]);
}
for(i = 0; i < M; i++) {
for(j = 0; j < strlen(a[i]); j++) {
if(a[i][j] >= 'A' && a[i][j] <= 'Z') b[i]++;
else if(a[i][j] >= 'a' && a[i][j] <= 'z') b[i + 3]++;
else if(a[i][j] >= '0' && a[i][j] <= '9') b[i + 6]++;
else if(a[i][j] == ' ') b[i + 9]++;
else b[i + 12]++;
}
}
for(i = 0; i < M; i++) {
printf("\n字符串%d:%s\n", i + 1, a[i]);
printf("大写字母\t小写字母\t数字\t\t空格\t\t其他\n", a[i]);
for(j = 0; j < 15; j += 3) {
printf("%4d\t\t", b[j + i]);
}
printf("\n\n");
}
return 0;
}
11.输出以下图案:
#include <stdio.h>
#define N 5
int main() {
char a[N] = {'*', '*', '*', '*', '*'};
int i, j;
for(i = 0; i < N; i++) {
for(j = 0; j < i; j++) {
printf(" ");
}
for(j = 0; j < N; j++) {
printf("%2c", a[i]);
}
printf("\n");
}
return 0;
}
12.有一行电文,已按下面规律译成密码:
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文
#include <stdio.h>
#include <string.h>
#define N 80
int main() {
char a[N];
int i;
printf("请输入要加密的字符串:\n");
gets(a);
for(i = 0; i < strlen(a); i++) {
if(a[i] >= 'a' && a[i] <= 'z') {
a[i] = 'z' - (a[i] - 'a');
}
if(a[i] >= 'A' && a[i] <= 'Z') {
a[i] = 'Z' - (a[i] - 'A');
}
}
printf("加密后:");
puts(a);
return 0;
}
13.编一程序,将两个字符串连接起来,不要用strcat函数。
#include <stdio.h>
#include <string.h>
#define N 80
int main() {
char a[N], b[N];
int i, j = 0;
printf("请输入字符串a:\n");
gets(a);
printf("请输入字符串b:\n");
gets(b);
for(i = strlen(a); b[j] != '\0'; i++) {
a[i] = b[j++];
}
a[i] = '\0';
printf("\n合并后:");
puts(a);
return 0;
}
14.编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值。例如,"A”与"C"相比,由于"A"<"C",应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出“-2”。同理:"And"和"Aid"比较,根据第2个字符比较结果,"n"比"i"大5,因此应输出“5”。
#include <stdio.h>
#include <string.h>
#define N 80
int main() {
char s1[N], s2[N];
int i, res = 0;
printf("请输入字符串s1:\n");
gets(s1);
printf("请输入字符串s2:\n");
gets(s2);
for(i = 0; s1[i] != '\0' && s2[i] != '\0'; i++) {
if(s1[i] == s2[i]) continue;
else if(s1[i] > s2[i]) {
res = s1[i] - s2[i];
break;
} else {
res = -(s2[i] - s1[i]);
break;
}
}
if(s1[i] != '\0') res = s1[i] - s2[i];
else if(s2[i] != '\0') res = -(s2[i] - s1[i]);
printf("\nres = %d", res);
return 0;
}
15.编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,'\0'也要复制过去。'\0'后面的字符不复制。
#include <stdio.h>
#include <string.h>
#define N 80
int main() {
char s1[N], s2[N];
int i, j = 1;
printf("请输入字符串s1:\n");
gets(s1);
printf("请输入字符串s2:\n");
gets(s2);
for(i = 0; s2[j - 1] != '\0'; i++) {
s1[i] = s2[j - 1];
j++;
}
printf("\n复制后:");
puts(s1);
return 0;
}
标签:++,s2,s1,int,谭浩强,课后,printf,习题,include
From: https://blog.csdn.net/qq_75021272/article/details/145204194