1. 习题10.1

c
#include<stdio.h>
void main() {
int a, b, c;
int t;
int *x, *y, *z;
x = &a;
y = &b;
z = &c;
scanf("%d%d%d", x, y, z);
if (*x > *y) {
t = *x;
*x = *y;
*y = t;
}
if (*x > *z) {
t = *x;
*x = *z;
*z = t;
}
if (*y > *z) {
t = *y;
*y = *z;
*z = t;
}
printf("a=%d b=%d c=%d\n", a, b, c);
printf("*x=%d *y=%d *z=%d\n", *x, *y, *z);
}
2. 习题10.2

c
#include<stdio.h>
#include<string.h>
int main() {
char s1[50], s2[50], s3[50];
char *s1_, *s2_, *s3_;
int i;
char c;
s1_ = s1;
s2_ = s2;
s3_ = s3;
gets(s1);
gets(s2);
gets(s3);
if (strcmp(s1_, s2_) > 0)
for (i = 0; i < 50; i++) {
c = *(s1_ + i);
*(s1_ + i) = *(s2_ + i);
*(s2_ + i) = c;
}
if (strcmp(s1_, s3_) > 0)
for (i = 0; i < 50; i++) {
c = *(s1_ + i);
*(s1_ + i) = *(s3_ + i);
*(s3_ + i) = c;
}
if (strcmp(s2_, s3_) > 0)
for (i = 0; i < 50; i++) {
c = *(s2_ + i);
*(s2_ + i) = *(s3_ + i);
*(s3_ + i) = c;
}
putchar('\n');
puts(s1_);
putchar('\n');
puts(s2_);
putchar('\n');
puts(s3_);
putchar('\n');
return 0;
}
3.习题10.3

c
#include<stdio.h>
int main() {
int a[10];
int n = 10;
void scanf_(int *, int);
scanf_(a, n);
return 0;
}
void scanf_(int *a, int n) {
int i;
void deal(int *, int);
for (i = 0; i < n; i++)
scanf("%d", a + i);
deal(a, n);
}
void deal(int *x, int n) {
int max, min;
int i;
int t;
void printf_(int *, int);
max = min = *x;
for (i = 0; i < n; i++) {
if (max < *(x + i)) {
max = *(x + i);
}
if (min > *(x + i)) {
min = *(x + i);
}
}
t = min;
min = *x;
*x = t;
t = *(x + n - 1);
*(x + n - 1) = max;
max = t;
printf_(x, n);
}
void printf_(int *y, int n) {
int i;
for (i = 0; i < n; i++)
printf("%d ", *(y + i));
printf("\nover!!!\n");
}
4.习题10.4


c
#include<stdio.h>
#define N 10
void main() {
int a[N];
int i;
int m;
void change(int *, int, int);
printf("Please input number:\n");
for (i = 0; i < N; i++)
scanf("%d", a + i);
printf("Please input m:\n");
scanf("%d", &m);
change(a,N, m);
for (i = 0; i < N; i++)
printf("a[%d]=%d\n", i, *(a + i));
}
void change(int *a, int n, int m) {
int i, j;
int t;
for (i = 0; i < m; i++) {
t = *(a + n - 1);
for (j = n - 1; j >= 0; j--) {
*(a + j) = *(a + j - 1);
}
*a = t;
}
}
5.习题10.5
有 n 个人围成一圈,顺序排号。从第 1 个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位。
c
#include<stdio.h>
#define N 10
void main() {
int i;
// 1~10 表示10个人
int aa[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
void f(int *, int);
f(aa, N);
}
// 约瑟夫环:n个人,报1~3,报到3退出
void f(int *p, int n) {
int count = n; // 剩下的人数
int num = 0; // 报数 1,2,3,1,2,3...
int i = 0; // 当前走到谁
while (count > 1) {
// 直到只剩1人
if (p[i] != 0) {
// 这个人还在,才报数
num++;
if (num == 3) {
// 报到3退出
p[i] = 0; // 标记退出
num = 0; // 报数重置
count--; // 人数-1
}
}
i++; // 下一个人
if (i >= n) {
// 围成一圈!回到开头
i = 0;
}
}
// 输出最后剩下的人
for (int k = 0; k < n; k++) {
if (p[k] != 0) {
printf("最后留下的是原来第 %d 号\n", p[k]);
}
}
}
6.习题10.6

c
#include<stdio.h>
int main() {
char s[50];
int len;
int cd(char *);
gets(s);
len = cd(s);
printf("len=%d\n", len);
return 0;
}
int cd(char *a) {
int i = 0;
while (a[i++]);
return i - 1;
}
7.习题10.7

c
#include<stdio.h>
void main() {
char s1[50] = "I love you";
char s2[] = "me too";
int m;
void copy_m(char *, char *, int);
scanf("%d", &m);
copy_m(s1, s2, m);
}
void copy_m(char *s1, char *s2, int m) {
int i, j = 0;
i = m - 1;
while (s2[j]) {
s1[i++] = s2[j++];
}
puts(s1);
putchar('\n');
}
8.习题10.9

c
#include<stdio.h>
#define M 3
#define N 3
void main() {
int a[M][N] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
void zz(int (*p)[N], int, int);
zz(a,M,N);
}
void zz(int (*p)[N], int m, int n) {
int i, j, t;
int (*q)[N];
q = p;
for (i = 0; i < m; i++)
for (j = i; j < n; j++) {
t = *(*(p + i) + j);
*(*(p + i) + j) = *(*(q + j) + i);
*(*(q + j) + i) = t;
}
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++)
printf("%d\t", p[i][j]);
putchar('\n');
}
}
9.习题10.10

c
#include<stdio.h>
void main() {
int a[5][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};
void f(int (*p)[5]);
f(a);
}
void f(int (*p)[5]) {
int max = p[0][0];
int s[4], sum = 0;
int i, j, k = 0;
s[0] = p[0][0];
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++) {
sum += p[i][j];
if (max < p[i][j])
max = p[i][j];
}
#if(1)
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++)
if (s[k] > p[i][j])
s[k] = p[i][j];
}
k++;
s[k] = sum;
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++) {
if (s[k - 1] == p[i][j])
continue;
if (s[k] > p[i][j])
s[k] = p[i][j];
}
k++;
s[k] = sum;
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++) {
if (s[k - 1] == p[i][j] || s[k - 2] == p[i][j])
continue;
if (s[k] > p[i][j])
s[k] = p[i][j];
}
k++;
s[k] = sum;
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++) {
if (s[k - 1] == p[i][j] || s[k - 2] == p[i][j] || s[k - 3] == p[i][j])
continue;
if (s[k] > p[i][j])
s[k] = p[i][j];
}
#else
while (k < 4) {
s[k] = max;
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++) {
if (k == 0) {
if (s[k] > p[i][j])
s[k] = p[i][j];
} else if (s[k] > p[i][j] && p[i][j] > s[k - 1]) {
s[k] = p[i][j];
}
}
k++;
}
#endif
k = 0;
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++) {
if (i == 2 && j == 2)
p[i][j] = max;
if ((i % 4 == 0 && j % 4 == 0))
p[i][j] = s[k++];
}
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++)
printf("%d\t", p[i][j]);
putchar('\n');
}
}
10.习题10.11

c
#include<stdio.h>
#define M 10
#define N 50
void main() {
char s[M][N];
int i;
void paixu(char (*p)[N]);
i = 0;
while (i < M) {
gets(s[i]);
i++;
}
printf("\n\n");
paixu(s);
while (i > 0) {
puts(s[M - i]);
i--;
}
}
void paixu(char (*p)[N]) {
int i, j, k, m;
char t;
for (i = 0; i < M - 1; i++)
for (j = 0; j < M - 1 - i; j++) {
for (k = 0; k < N; k++) {
if (p[j][k] == p[j + 1][k])
continue;
else if (p[j][k] < p[j + 1][k])
break;
else if (p[j][k] > p[j + 1][k]) {
for (m = 0; m < N; m++) {
t = p[j][m];
p[j][m] = p[j + 1][m];
p[j + 1][m] = t;
}
break;
}
}
}
}
11.习题10.12
用指针数组处理上一题目,字符串不等长。
c
#include<stdio.h>
#define N 50
#define M 10
void main()
{
char s0[N],s1[N],s2[N],s3[N],s4[N],s5[N],s6[N],s7[N],s8[N],s9[N];
char *p[M];
int i,j,k,m;
char c;
p[0]=s0;
p[1]=s1;
p[2]=s2;
p[3]=s3;
p[4]=s4;
p[5]=s5;
p[6]=s6;
p[7]=s7;
p[8]=s8;
p[9]=s9;
i=0;
while(i<M)
{
gets(p[i]);
i++;
}
printf("\n\n");
for(i=0;i<M-1;i++)
{
for(j=0;j<M-1-i;j++)
{
for(k=0;k<N;k++)
{
if(p[j][k]==p[j+1][k])
{
continue;
}
else if(p[j][k]<p[j+1][k])
{
break;
}
else if(p[j][k]>p[j+1][k])
{
for(m=0;m<N;m++)
{
c=p[j][m];
p[j][m]=p[j+1][m];
p[j+1][m]=c;
}
break;
}
}
}
}
for(i=0;i<M;i++)
{
puts(p[i]);
}
printf("\nok!!!\n");
}
12.习题10.14

c
#include<stdio.h>
#define N 10
int main() {
int a[N] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int i;
void nixu(int *, int);
nixu(a,N);
for (i = 0; i < N; i++)
printf("a[%d]=%d\n", i, a[i]);
return 0;
}
void nixu(int *p, int n) {
int i;
int t;
for (i = 0; i < n / 2; i++) {
t = *(p + i);
*(p + i) = *(p + n - 1 - i);
*(p + n - 1 - i) = t;
}
}
13.习题10.15

c
#include<stdio.h>
#define M 4
#define N 5
#define JG 60
#define TWO 2
int main() {
double a[M][N];
double dym;
int i, j;
double dymk(double (*p)[N], int, int);
void found1(double (*q)[N], int, int);
void found2(double (*r)[N], int, int);
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
scanf("%lf", &a[i][j]);
}
}
dym = dymk(a,M, 0);
printf("di yi men ke ave:%.3f\n\n", dym);
found1(a,M,N);
found2(a,M,N);
return 0;
}
double dymk(double (*p)[N], int m, int t) {
int i;
double ave = 0;
for (i = 0; i < M; i++) {
ave = ave + *(*(p + i) + t) / m;
}
return ave;
}
void found1(double (*q)[N], int m, int n) {
int i, j, k;
int js = 0;
double eveave = 0;
double dymk(double (*p)[N], int, int);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (*(*(q + i) + j) < JG) {
js++;
}
}
if (js >= TWO) {
printf("xue hao: %d\n", i);
printf("All ke cheng: \n");
printf("0\t1\t2\t3\t4\t\n");
for (k = 0; k < n; k++) {
printf("%.3f\t", *(*(q + i) + k));
eveave += *(*(q + i) + k) / n;
}
printf("\n");
printf("ave=%.3f\n\n", eveave);
}
js = 0;
eveave = 0;
}
}
void found2(double (*r)[N], int x, int y) {
int i, j;
double ave = 0;
int temp;
printf("average > 90 : \n");
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++) {
ave += *(*(r + i) + j) / y;
}
if (ave > 90) {
printf("%d\t", i);
}
ave = 0;
}
printf("\n\n");
printf("all > 85:\n");
for (i = 0; i < x; i++) {
temp = 0;
for (j = 0; j < y; j++) {
if (r[i][j] > 85) {
temp++;
}
}
if (temp == N)
printf("%d\t", i);
}
putchar('\n');
}
14.习题10.17

c
#include<stdio.h>
int main() {
char s1[50];
char s2[50];
int result;
int strcmp_(char *, char *);
gets(s1);
gets(s2);
result = strcmp_(s1, s2);
printf("%d\n", result);
return 0;
}
int strcmp_(char *p, char *q) {
int i;
for (i = 0; !(p[i] == '\0' || q[i] == '\0'); i++) {
if (p[i] != q[i])
return p[i] - q[i];
}
return 0;
}
15.习题10.18

c
#include<stdio.h>
int main() {
int i, num;
char s1[] = "January";
char s2[] = "February";
char s3[] = "March";
char s4[] = "April";
char s5[] = "May";
char s6[] = "June";
char s7[] = "July";
char s8[] = "August";
char s9[] = "Sepmber";
char s10[] = "October";
char s11[] = "November";
char s12[] = "December";
char *p[12];
p[0] = s1;
p[1] = s2;
p[2] = s3;
p[3] = s4;
p[4] = s5;
p[5] = s6;
p[6] = s7;
p[7] = s8;
p[8] = s9;
p[9] = s10;
p[10] = s11;
p[11] = s12;
printf("Please input month:\n");
scanf("%d", &num);
if (num < 1 || num > 12) {
printf("Error\n");
scanf("%d", &num);
}
printf("ok!!!\nPlease wait a moment!!!\n");
for (i = 0; i < 12; i++) {
if (num - 1 == i) {
puts(p[num - 1]);
}
}
printf("\n");
return 0;
}
16.习题10.20

c
#include<stdio.h>
#define N 50
#define M 5
int main() {
char s0[N], s1[50], s2[50], s3[50], s4[50];
char *p[M];
char **q;
char **r;
int i, j, k, m;
char c;
p[0] = s0;
p[1] = s1;
p[2] = s2;
p[3] = s3;
p[4] = s4;
for (i = 0; i < M; i++) {
gets(p[i]);
}
for (i = 0; i < M - 1; i++) {
for (j = 0; j < M - 1 - i; j++) {
q = &p[j];
r = &p[j + 1];
for (k = 0; k < N; k++) {
if ((*q)[k] == (*r)[k]) {
continue;
} else if ((*q)[k] < (*r)[k]) {
break;
} else if ((*q)[k] > (*r)[k]) {
for (m = 0; m < N; m++) {
c = (*q)[m];
(*q)[m] = (*r)[m];
(*r)[m] = c;
}
break;
}
}
}
}
printf("\n\n");
for (i = 0; i < M; i++) {
puts(p[i]);
}
return 0;
}
17.习题10.21

c
#include<stdio.h>
#define N 10
int main() {
int a[N] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int i;
void paixu(int *, int);
paixu(a,N);
for (i = 0; i < N; i++) {
printf("a[%d]=%d\n", i, a[i]);
}
return 0;
}
void paixu(int *p, int n) {
int i, j;
int t;
int **q;
q = &p;
for (i = 0; i < N - 1; i++) {
for (j = 0; j < N - 1 - i; j++) {
if (*((*q) + j) > *((*q) + j + 1)) {
t = (*q)[j];
(*q)[j] = (*q)[j + 1];
(*q)[j + 1] = t;
}
}
}
}
18.字符串比较
c
#include<stdio.h>
// 主函数
void main()
{
// 定义两个字符数组,用来存放两个字符串
char s1[10];
char s2[10];
// 声明字符串比较交换函数
void cmp(char *,char *,int);
// 输入两个字符串
gets(s1);
gets(s2);
// 调用cmp函数,比较并按字典序调整两个字符串
cmp(s1,s2,10);
// 输出换行,分隔输入和输出
printf("\n\n");
// 输出处理后的两个字符串
printf("%s\n%s\n",s1,s2);
}
// 函数功能:按字典序比较两个字符串
// 如果str1 > str2,就交换两个字符串的全部内容
// str1:第一个字符串首地址
// str2:第二个字符串首地址
// n:字符串最大长度
void cmp(char *str1,char *str2,int n)
{
int i; // 用于字符比较的循环变量
int j; // 用于字符交换的循环变量
char c; // 临时变量,用于交换字符
// 逐个字符比较两个字符串
for(i=0;i<n;i++)
{
// 如果字符相等,继续比较下一个
if(str1[i]==str2[i])
continue;
// 如果str1[i] < str2[i],说明顺序正确,直接退出
else if(str1[i]<str2[i])
break;
// 如果str1[i] > str2[i],说明需要交换两个字符串
else if(str1[i]>str2[i])
{
// 循环交换每个字符,把两个字符串整体互换
for(j=0;j<n;j++)
{
c=str1[j];
str1[j]=str2[j];
str2[j]=c;
}
break; // 交换完成,退出比较
}
}
}