C程序设计(第五版)-第6章 利用数组处理批量数据课后习题答案

1.用筛选法求100以内的素数

质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)

先解释一下筛选法的步骤:

<1> 先将1挖掉(因为1不是素数)。

<2> 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。

<3> 用3去除它后面的各数,把3的倍数挖掉。

<4> 分别用5…各数作为除数去除这些数以后的各数。

上述操作需要一个很大的容器去装载所有数的集合,只要满足上述条件,即2的倍数大于1的全部置0,3的倍数大于1的全部置0,4的倍数大于1的全部置0……一直到这个数据集合的末尾,这样一来不为0的数就是素数了,然后按下标在里面进行查找就好了

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");
    int i, j, k, a[100];
    // 先给100个数赋值
    for (i = 0; i < 100; i++)
    {
        a[i] = i + 1;
    }

    // 1不是质数也不是合数
    a[0] = 0;

    for (i = 0; i < 100; i++)
    {
        for (j = i + 1; j < 100; j++)
        {
            // 把后面的数能整除前面的数赋值为0
            if (a[i] != 0 && a[j] != 0)
            {
                if (a[j] % a[i] == 0)
                {
                    a[j] = 0; //把不是素数的都赋值为0
                }
            }
        }
    }

    // 打印质数,每10个换行
    for (i = 0; i < 100; i++)
    {
        if (k % 10 == 0)
        {
            printf("\n");
        }
        if (a[i] != 0)
        {
            printf("%d ", a[i]);
            k++;
        }
    }

    return 0;
}

2.用选择法对10个整数排序

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("请输入10个数:\n");
    int minIndex, temp, a[10];

    for (int i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
    }

    for (int i = 0; i < 10; i++)
    {
        minIndex = i;
        for (int j = i + 1; j < 10; j++)
        {
            if (a[j] <= a[minIndex])
            {
                minIndex = j;
            }
        }

        temp = a[i];
        a[i] = a[minIndex];
        a[minIndex] = temp;
    }

    printf("排序后结果:\n");

    for (int i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

3.求一个3*3的整型矩阵对角线元素之和

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("请输入元素:\n");
    int x, y, z, a[3][3];
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    printf("输出刚刚输入的元素:\n");
    for (int i = 0; i <= 2; i++)
    {
        for (int j = 0; j <= 2; j++)
        {
            printf("%d\t", a[i][j]);
        }

        printf("\n");
    }
    printf("\n");
    // 计算对角线的合
    for (int i = 0; i < 3; i++)
    {
        x += a[i][i];
    }

    for (int i = 0, j = 2; i < 3; i++, j--)
    {
        y += a[i][j];
    }
    z = x + y;
    printf("左上到右下对角线的合:%d\n", x);
    printf("右上到左下对角线的合:%d\n", y);
    printf("两条对角线之合:%d\n", z);
    // 结果
    //     请输入元素:
    // 1 2 3 4 5 6 7 8 9
    // 输出刚刚输入的元素:
    // 1       2       3
    // 4       5       6
    // 7       8       9

    // 左上到右下对角线的合:15
    // 右上到左下对角线的合:31
    // 两条对角线之合:46
    return 0;
}

4.有一个已排好序的数组,要求输入一个数后,按原来的规律将它插入数组中

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");
    int t, x, a[5] = {1, 2, 4, 5, 6};

    printf("请输入需要插入的数字:\n");
    scanf("%d", &x);
    for (int i = 0; i < 5; i++)
    {
        if (x < a[i])
        {
            t = a[i];
            a[i] = x;
            x = t;
        }
        printf("%3d", a[i]);
    }
    printf("%3d", x);

    return 0;
}

5.讲一个数组的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8

思路:首位互换

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");
    int t, a[5] = {8, 6, 5, 4, 1};
    for (int i = 0, j = 4; i < (5 / 2); i++, j--)
    {
        t = a[j];
        a[j] = a[i];
        a[i] = t;
    }

    for (int i = 0; i < 5; i++)
    {

        printf("%d\t", a[i]);
    }

    return 0;
}

6.输出以下的杨辉三角形(要求输出10行)

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

#include <stdio.h>
#include <windows.h>
#define COUNT 10
int main()
{
    printf("------------------\n");
    int i,j,a[COUNT][COUNT];
    // 每行第一个都是1,最后一个也是1
    for (int i = 0; i < COUNT; i++)
    {
        a[i][i] = 1;
        a[i][0] = 1;
    }
    // 从第三行开始计算,每行增加一个数,行数-2=要计算的数
    for (i = 2; i < COUNT; i++)
    {
        for (j = 1; j <= i - 1; j++)
        {
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
        }
    }

    // 打印每一行的数
    for (int i = 0; i < COUNT; i++)
    {
        for (int j = 0; j < i + 1; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}

7.要求输出1~n*n的魔方阵,既输出的方阵的每一行,每一列,对角线的和都相等

例如:

8 1 6
3 5 7
4 9 2

思路:

(1)将1放在第1行中间一列
(2)从2开始直到n*n,每个数放在前一个数右上角的位置
(3)如果前一个数的右上角超出了方阵,则:上一个数行数为1,下一个数行数为n,列数+1;上一个数列数为n,下一个数列数为1,行数-1。(在纸上画图就能理解)
(4)如果出现了下一个位置已经有数字的情况,将下一个数放在上一个数的下面,超出的情况同(3),移到最上面的第一行

#include<stdio.h>
int main()
{
	int a[16][16];			//定义数组,让方阵的边长不超过15 
	int n,i,j,k;			
	int p,t;	
	scanf("%d",&n);			//输入方阵边数 
	if(n%2!=0&&n!=0&&n<=15)	//边长不能是偶数,并且不能为0,边长小于等于15 
	{
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)	 
			{
				a[i][j]=0;	//初始化数组 
			}
		}
	}
	i=1;j=n/2+1;			//第一行的中间位置赋值为1 
	a[i][j]=1;
	
	for(k=2;k<=n*n;k++)		//循环开始,k从2到n
	{						//循环内是寻找k位置的过程  
		p=i;t=j;			//用p,t暂存此时的位置 
		
		i=i-1;				//确定下一个位置,存在越过行、列的情况按照思路更改
		j=j+1;
		if(i<1)
		{
			i=n;
		}
		if(j>n)
		{
			j=1;
		}
		
		if(a[i][j]!=0)		//检查下个位置是否有元素 
		{					//若有元素,将下一个位置确定为当前位置下方的位置 
			if(p==n)		 
			{
				i=1;j=t;
				a[i][j]=k;
			}else
			{
				i=p+1;j=t;
				a[i][j]=k;
			}		
		}else				//若无元素,将k放入下个位置 
		{
			a[i][j]=k;
		}	
	}
	
	for(i=1;i<=n;i++)		//输出魔方阵 
	{
		for(j=1;j<=n;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
} 

8.找出一个二维数组中的鞍点,即该位置上的元素在该行最大、该列最小、也可能无鞍点

#include <stdio.h>
#include <windows.h>
#define N 3
#define M 4

int main()
{
    printf("------------------\n");
    int maxIndex, minIndex, a[N][M]; // 定义一个三行四列的数组

    // 输入数组
    printf("输入三行四列的数组数据:\n");
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }

    // 一共循环3次,因为有三行数据
    for (int i = 0; i < N; i++)
    {
        int flag = 1; // 默认为1,假设该数是符合条件的
        // 求出每行最大的数,比列数的次数M次
        for (int j = 0; j < M; j++)
        {
            maxIndex = j;
            if (a[i][j] > a[i][maxIndex])
            {
                maxIndex = j;
            }
        }
        // 判断该数是否是该列最小 ,比行的次数N次
        for (int k = 0; k < N; k++)
        {
            if (a[k][maxIndex] < a[i][maxIndex])
            {
                flag = 0;
            }
        }
        if (1 == flag)
        {
            printf("锚点:%d", a[i][maxIndex]);
        }
    }

    return 0;
}

9.有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");

    int index, left = 0, mid, right = 14, x, a[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
    printf("请输入一个整数:");
    scanf("%d", &x);
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (a[mid] == x)
        {
            printf("索引是%d", mid);
            break;
        }
        else if (a[mid] < x)
        {
            left = mid + 1;
        }
        else if (a[mid] > x)
        {
            right = mid - 1;
        }
    }

    return 0;
}

10.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母,小写字母,数字,空格以及其他字符的个数

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");
    char a[3][80];
    int A = 0, b = 0, digital = 0, blank = 0, other = 0;
    printf("输入三行数据:\n");
    for (int i = 0; i < 3; i++)
    {
        gets(a[i]);
        for (int j = 0; j < 80 && a[i][j] != '\0'; j++)
        {
            if (a[i][j] >= 'A' && a[i][j] <= 'Z')
            {
                A++;
            }
            else if (a[i][j] >= 'a' && a[i][j] <= 'z')
            {
                b++;
            }
            else if (a[i][j] >= '0' && a[i][j] <= '9')
            {
                digital++;
            }
            else if (a[i][j] == ' ')
            {
                blank++;
            }
            else
            {
                other++;
            }
        }
    }

    printf("中英文大写字母%d个,小写字母%d个,数字%d个,空格%d个以及其他字符%d个", A, b, digital, blank, other);

    return 0;
}

11.输出以下图案

* * * * *

​ * * * * *

​ * * * * *

​ * * * * *

​ * * * * *

#include <stdio.h>

int main()
{
    char c[] = {"* * * * *"};
    for (int i = 1; i <= 5; i++)
    {

        puts(c);
        for (int j = 0; j < i*2; j++)
        {
            printf(" ");
        }
    }

    return 0;
}

12.有一行电文,已按下面规律译成密码

A->Z a->z
B->Y b->y
C->X c->x
…… …………
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母不变。要求编程序将密码译回原文,并输出密码和原文

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");
    // A->Z a->z
    // B->Y b->y
    // C->X c->x
    // …… …………
    // 即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母不变。要求编程序将密码译回原文,并输出密码和原文
    // A-Z的ASCII是65-90   A+Z=B+Y=155
    // a-z的ASCII是97-122  a+z=b+y=219
    char a[10], b[10];
    gets(a);

    for (int i = 0; i < 10 && a[i] != '\0'; i++)
    {
        if (a[i] >= 'A' && a[i] <= 'Z')
        {
            b[i] = 155 - a[i];
        }
        else if (a[i] >= 'a' && a[i] <= 'z')
        {
            b[i] = 219 - a[i];
        }
        else
        {
            b[i] = a[i];
        }
    }
    puts(a);
    puts(b);

    return 0;
}

13.编译程序,将两个字符串连接起来,不要用strcat函数

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");
    char a[10], b[10], c[20];
    int i, j;
    printf("输入第一个字符串\n");
    gets(a);
    printf("输入第二个字符串\n");
    gets(b);

    for (i = 0; i < 10 && a[i] != '\0'; i++)
    {
        c[i] = a[i];
    }
    for (j = 0; j < 10 && b[j] != '\0'; j++, i++)
    {
        c[i] = b[j];
    }
    c[i + 1] = '\0'; // 设置截止符号
    printf("%s", c);

    return 0;
}

14.编一个程序,将两个字符串s1 和 s2比较﹐若s1>s2,输出一个正数﹔若s1=s2,输出0;若sl<s2,输出一个负数。不要用strcpy函数。两个字符串用gets 函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值。例如,"A"与"C"相比,由于"A"<"C" ,应输出负数,同时由于'A'与'C'的ASCII码差值为⒉,因此应输出“一2”。同理:"And"和"Aid"比较,根据第⒉个字符比较结果,"n"比"i"大5,因此应输出“5”。

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");
    char a[10], b[10];
    int i, j, aSum = 0, bSum = 0;
    printf("输入第一个字符串\n");
    gets(a);
    printf("输入第二个字符串\n");
    gets(b);

    // 吧a数组的ASCII码值相加,再把b数组的ASCII码值相加,两者的值相减
    for (i = 0; i < 10 && a[i] != '\0'; i++)
    {
        aSum += a[i];
    }
    for (j = 0; j < 10 && a[j] != '\0'; j++)
    {
        bSum += b[j];
    }

    printf("%d", (aSum - bSum));

    return 0;
}

15.编写一个程序﹐将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,'\o'也要复制过去。'\o'后面的字符不复制。

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("------------------\n");
    char a[10], b[10];
    int i;
    gets(a);
    for (i = 0; i < 10 && a[i] != '\0'; i++)
    {
        b[i] = a[i];
    }
    b[i + 1] = '\0';

    printf("复制后:%s", b);

    return 0;
}

C程序设计(第五版)-第1章 程序设计和C语言课后习题答案
C程序设计(第五版)-第2章 算法--程序的灵魂课后习题答案
C程序设计(第五版)-第3章 最简单的C程序设计—顺序程序设计课后习题答案
C程序设计(第五版)-第4章 选择结构程序设计课后习题答案
C程序设计(第五版)-第5章 循环结构程序设计课后习题答案
C程序设计(第五版)-第6章 利用数组处理批量数据课后习题答案
C程序设计(第五版)-第7章 用函数实现模块化程序设计课后习题答案

posted @ 2021-12-28 14:29  luckyangg  阅读(578)  评论(0)    收藏  举报