《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的自然数构成的魔方阵。

相关推荐
Andlin3 分钟前
《CMakeList 知识系统学习系列(三):函数和宏》
c++
Forget the Dream8 分钟前
设计模式之迭代器模式
java·c++·设计模式·迭代器模式
️Carrie️35 分钟前
10.2 继承与多态
c++·多态·继承
卑微小文38 分钟前
2025国内网络反爬新高度:代理IP智能轮换算法揭秘
后端·算法·架构
Nicole Potter41 分钟前
内存泄漏出现的时机和原因,如何避免?
c++·游戏·面试·c#
却道天凉_好个秋1 小时前
c++ 嵌入汇编的方式实现int型自增
开发语言·汇编·c++
tyler-泰勒2 小时前
c++:迭代器的失效
开发语言·c++
决斗小饼干2 小时前
震惊!C++程序真的从main开始吗?99%的程序员都答错了
c++
辰尘_星启2 小时前
【vscode】一键编译运行c/c++程序
c语言·c++·vscode·debug·cmake
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧2 小时前
C语言_数据结构总结7:顺序队列(循环队列)
c语言·开发语言·数据结构·算法·visualstudio·visual studio