《C程序设计》第六章练习答案

【例6.1】对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。

cpp 复制代码
#include <stdio.h>
int main()
{
	int i, a[10];
	for (i = 0; i <= 9; i++)
	{
		a[i] = i;
	}
	for (i = 9; i >= 0; i--)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

【例6.2】用数组来处理求Fibonacci数列问题。

cpp 复制代码
#include <stdio.h>
int main()
{
	int i;
	int f[20] = { 1,1 };
	for (i = 2; i < 20; i++)
	{
		f[i] = f[i - 2] + f[i - 1];
	}
	for (i = 0; i < 20; i++)
	{
		if (i % 5 == 0)
			printf("\n");
		printf("%12d", f[i]);
	}
	printf("\n");
	return 0;
}

【例6.3】有10个地区的面积,要求对它们按由小到大的顺序排序。

cpp 复制代码
#include <stdio.h>
int main()
{
	int a[10];
	int i, j, t;
	printf("input 10 numbers:\n");
	for (i = 0; i < 10; i++)
		scanf_s("%d", &a[i]);
	printf("\n");
	for (j = 0; j < 9; j++)
	{
		for (i = 0; i < 9 - j; i++)
		{
			if (a[i] > a[i + 1])
			{
				t = a[i];
				a[i] = a[i + 1];
				a[i + 1] = t;
			}
		}
	}
	printf("the sorted numbers:\n");
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

【例6.4】将一个二维数组行和列的元素互换,存到另一个二维数组中。例如:

a = [ 1 2 3 b = [ 1 4

4 5 6 ] 2 5

3 6 ]

cpp 复制代码
#include <stdio.h>
int main()
{
	int a[2][3] = { {1,2,3},{4,5,6} };
	int b[3][2], i, j;
	printf("array a:\n");
	for (i = 0; i <= 1; i++)
	{
		for (j = 0; j <= 2; j++)
		{
			printf("%5d", a[i][j]);
			b[j][i] = a[i][j];
		}
		printf("\n");
	}
	printf("array b:\n");
	for (i = 0; i <= 2; i++)
	{
		for (j = 0; j <= 1; j++)
		{
			printf("%5d", b[i][j]);
		}
		printf("\n");
	}
}

【例6.5】 有一个3X4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。

cpp 复制代码
#include <stdio.h>
int main()
{
	int i, j, row = 0, column = 0, max;
	int a[3][4] = { {1,2,3,4},{9,8,7,6},{-10,10,-5,2} };
	max = a[0][0];
	for (i = 0; i <= 2; i++)
	{
		for (j = 0; j <= 3; j++)
		{
			if (a[i][j] > max)
			{
				max = a[i][j];
				row = i;
				column = j;
			}
		}
	}
	printf("max=%d\nrow=%d\ncolumn=%d\n",max,row,column);
	return 0;
}

【例6.6】输出一个已知的字符串。

cpp 复制代码
#include <stdio.h>
int main()
{
	char c[15] = {'I',' ','a','m',' ','s','t','u','d','e','n','t','.'};
	int i;
	for (i = 0; i < 15; i++)
	{
		printf("%c", c[i]);
	}
	printf("\n");
	return 0;
}

【例6.7】输出一个菱形图。

cpp 复制代码
#include <stdio.h>
int main()
{
	char diamond[][5] = { {' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},
		{' ','*',' ','*'},{' ',' ','*'}};
	int i, j;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%c", diamond[i][j]);
		}
		printf("\n");
	}
	return 0;
}

【例6.8】输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

cpp 复制代码
#include <stdio.h>
int main()
{
	char string[81];
	int i, num = 0, word = 0;
	char c;
	gets_s(string);
	for (i = 0; (c = string[i]) != '\0'; i++)
	{
		if (c == ' ')
			word = 0;
		else if (word == 0)
		{
			word = 1;
			num++;
		}
	}
	printf("There are %d words in this line.\n", num);
	return 0;
}

【例6.9】有3个字符串,要求找出其中最大值。

cpp 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char str[3][20];
	char string[20];
	int i;
	for (i = 0; i < 3; i++)
		gets_s(str[i]);
	if (strcmp(str[0], str[1]) > 0)
		strcpy_s(string, str[0]);
	else
		strcpy_s(string, str[1]);
	if (strcmp(str[2], string) > 0)
		strcpy_s(string, str[2]);
	printf("\nthe largest string is:\n%s\n",string);
	return 0;
}

习题

  1. 用筛选法求100之内的素数。
cpp 复制代码
#include <stdio.h>
#include <math.h>
int main()
{
	int i, j, n, a[101];
	for (i = 1; i <= 100; i++)
		a[i] = i;
	a[1] = 0;
	for (i = 2; i < sqrt(100); i++)
	{
		for (j = i + 1; j <= 100; j++)
		{
			if (a[i] != 0 && a[j] != 0)
				if (a[j] % a[i] == 0)
					a[j] = 0;
		}
	}
	printf("\n");
	for(j = 2, n = 0; j <= 100; j++)
	{
		if (a[j] != 0) 
		{
			printf("%5d", a[j]);
			n++;
		}
		if (n == 10)
		{
			printf("\n");
			n = 0;
		}
	}
	printf("\0");
	return 0;
}
  1. 用选择法对10个整数排序。
cpp 复制代码
#include <stdio.h>
void selectionSort(int arr[], int n)
{
	int i, j, min_idx, temp;
	for (i = 0; i < n - 1; i++)
	{
		min_idx = i;
		for (j = i + 1; j < n; j++)
		{
			if (arr[j] < arr[min_idx])
			{
				min_idx = j;
			}
		}
		if (min_idx != i)
		{
			temp = arr[i];
			arr[i] = arr[min_idx];
			arr[min_idx] = temp;
		}
	}
}
void printArrsy(int arr[], int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[10];
	int i;
	printf("please input 10 numbers:");
	for (i = 0; i < 10; i++)
	{
		scanf_s("%d", &arr[i]);
	}
	selectionSort(arr, 10);
	printf("array after sort:");
	printArrsy(arr, 10);
	return 0;
}
  1. 求一个3X3的整形矩阵对角线元素之和。
cpp 复制代码
#include <stdio.h>
int main()
{
	int matrix[3][3] = {
		{1,2,3},
		{4,5,6},
		{7,8,9}
	};
	int diagonalSum = 0;
	for (int i = 0; i < 3; i++)
	{
		diagonalSum += matrix[i][i];
	}
	printf("3X3 diagonalSum is: %d\n", diagonalSum);
	return 0;
}
  1. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。
cpp 复制代码
#include <stdio.h>
void insertIntoSortedArray(int arr[], int* n, int num)
{
	int i;
	int isAscending = (arr[0] <= arr[*n -1]);
	if (isAscending)
	{
		for (i = *n - 1; (i >= 0 && arr[i] > num); i--)
		{
			arr[i + 1] = arr[i];
		}
	}
	else
	{
		for (i = *n - 1; (i >= 0 && arr[i] < num); i--)
		{
			arr[i + 1] = arr[i];
		}
	}
	arr[i + 1] = num;
	(*n)++;
}
void printArray(int arr[], int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[100] = {1, 3, 5, 7, 9};
	int n = 5;
	int num;
	printf("please input number: ");
	scanf_s("%d", &num);
	insertIntoSortedArray(arr, &n, num);
	printf("array after sort is: ");
	printArray(arr, n);
	return 0;
}
  1. 将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。
cpp 复制代码
#include <stdio.h>
void reverseArray(int arr[], int n)
{
	int start = 0;
	int end = n - 1;
	int temp;
	while (start < end)
	{
		temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		start++;
		end--;
	}
}
void printArray(int arr[], int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = { 8, 6, 5, 4, 1 };
	int n = sizeof(arr) / sizeof(arr[0]);
	printf("initial array is:");
	printArray(arr, n);
	reverseArray(arr, n);
	printf("array after sort:");
	printArray(arr, n);
}
  1. 输出以下的杨辉三角形(要求输出10行)。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

cpp 复制代码
#include <stdio.h>
#define N 10
int main()
{
	int triangle[N][N];
	for (int i = 0; i < N; i++)
	{
		triangle[i][0] = 1;
		triangle[i][i] = 1;
		for (int j = 1; j < i; j++)
		{
			triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
		}
	}
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			printf("%d ", triangle[i][j]);
		}
		printf("\n");
	}
}
  1. 输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为

8 1 6

3 5 7

4 9 2

要求输出1~n2的自然数构成的魔方阵。

相关推荐
励志成为美貌才华为一体的女子22 分钟前
python算法和数据结构刷题[4]:查找算法和排序算法
数据结构·算法·排序算法
阿豪学编程31 分钟前
c++ string类 +底层模拟实现
开发语言·c++
tt5555555555551 小时前
每日一题-判断是不是完全二叉树
数据结构·算法
-VE-1 小时前
myshell
linux·c++
嘻嘻哈哈的zl2 小时前
初级数据结构:栈和队列
c语言·开发语言·数据结构
君义_noip2 小时前
信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2
算法·动态规划·信息学奥赛·斜率优化
Bluesonli2 小时前
第 1 天:UE5 C++ 开发环境搭建,全流程指南
开发语言·c++·ue5·虚幻·unreal engine
因兹菜2 小时前
[LeetCode]day4 977.有序数组的平方
数据结构·算法·leetcode
憨猪在度假3 小时前
Cmake学习笔记
c++·笔记·学习