c语言绿皮书第三版第十章习题

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; // 交换完成,退出比较
		}
	}
}
相关推荐
颜安青1 小时前
【python】运算符号(后续不断补充)
开发语言·python
一只大袋鼠1 小时前
JavaWeb四种文件上传方式(上篇)
java·开发语言·servlet·javaweb
j_xxx404_1 小时前
【Linux进程间通信】硬核剖析:消息队列、信号量、内核IPC资源统一管理与mmap加餐
linux·运维·开发语言·c++·人工智能·ai
Lazionr1 小时前
数据结构堆详解:原理、实现与应用
数据结构·算法
geovindu1 小时前
Python: Condition Variable Pattern
开发语言·python·设计模式·条件变量模式
故事和你911 小时前
蓝桥杯-2026年C++B组省赛
开发语言·数据结构·c++·算法·蓝桥杯·动态规划·图论
星恒随风1 小时前
C语言算法复杂度详解:时间复杂度与空间复杂度一篇讲透
c语言·算法
wjs20241 小时前
HTML DOM 属性
开发语言
段ヤシ.1 小时前
回顾Java知识点,面试题汇总Day3(持续更新)
java·开发语言·windows