c语言程序设计(第二版)余贞侠课后习题解析-第七章(数组)

本文涵盖了C语言编程的多个经典问题,包括输入浮点数并升序排序、找出整数数组中与平均值最接近的数、二维数组的最大值和最小值及其下标、计算矩阵行和列的总和、比较三个字符串大小以及实现字符串复制功能。这些实例展示了C语言在数值处理和数组操作上的基本应用。
摘要由CSDN通过智能技术生成
        自己写的,只是留个记录,有误请指正,部分来一些优秀博主

1.输入m个浮点数,然后按升序进行排序并输出。

#define  _CRT_SECURE_NO_WARNINGS /*防止scanf使用报错*/
#include<stdio.h>
#include <stdlib.h>
#define MAX 100

//浮点数输入函数
void Num_input(float data[], int m)
{
	int i;
	for (i = 0; i < m; i++)
	{
		scanf("%f", &data[i]);
	}
}

//对输入的浮点数进行升序排序
void Num_sort(float data[], int m)
{
	int i, j;
	float temp;

	利用选择法进行升序排序
	//for (i = 0; i < m; i++)
	//{
	//	for (j = i + 1; j < m; j++)
	//	{
	//		if (data[i] > data[j])
	//		{
	//			temp = data[i];
	//			data[i] = data[j];
	//			data[j] = temp;
	//		}
	//	}
	//	
	//}

	//利用冒泡排序升序排序
	for (i = 0; i < m - 1; i++)
	{
		for (j = 0; j < m - 1 - i; j++)
		{
			if (data[j] > data[j + 1])
			{
				temp = data[j];
				data[j] = data[j + 1];
				data[j + 1] = temp;
			}
		}
	}
}

//输出浮点数
void Num_output(float data[], int m)
{
	int i;
	for (i = 0; i < m; i++)
	{
		printf("%.2f\t", data[i]);
	}
}


int main()
{
	float num[MAX];
	int n;
	printf("请输入浮点数个数n:");
	scanf("%d", &n);
	if (n<1 || n>MAX)
	{
		printf("n不合法,应在[1,%d]\n", MAX);
		exit(0);
	}
	printf("\n请输入%d个浮点数.....\n", n);
	Num_input(num, n);
	printf("排序前:\n");
	Num_output(num, n);
	Num_sort(num, n);
	printf("\n排序后:\n");
	Num_output(num, n);
	printf("\n");
	return 0;
}

在这里插入图片描述

2.输入10个整数,找出与平均值最接近的数并输出。

#define  _CRT_SECURE_NO_WARNINGS /*防止scanf使用报错*/
#include<stdio.h>
#include<math.h>
#define N 10

//输入函数
void num_input(int data[],int n)
{
	int i;
	printf("请输入%d个整数:\n",n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &data[i]);
	}
}

//平均值计算函数
float ave_cal(int data[], int n)
{
	int i, sum = 0;
	float aver;
	for (i = 0; i < n; i++)
	{
		sum += data[i];
	}
	aver = sum * 1.0 / n;
	return aver;
}

//找出与平均值最接近的数
int close_aver(int data[], int n)
{
	float average = ave_cal(data,n);
	
	int close_ave_num = fabs(data[0] - average);
	int i, loca = 0;
	//前面已经设置了一个假定最接近平均数的值,这里就不用再让i从0开始了
	for (i = 1; i < n; i++)			
	{
		float temp = fabs(data[i]-average);
		if (temp < close_ave_num)
		{
			close_ave_num = temp;
			loca = i ;
		}
	}
	return data[loca];
}

int main()
{
	int num[N], local = 0, close_ave_num;
	float ave;

	num_input(num, N);
	ave = ave_cal(num, N);
	close_ave_num = close_aver(num, N);

	printf("ave = %.2f\n", ave);
	printf("close_ave_num = %d \n", close_ave_num);
	printf("\n");
	return 0;
}

在这里插入图片描述

3.找出二维数组中的最大值和最小值,并给出对应下标值。

#define  _CRT_SECURE_NO_WARNINGS /*防止scanf使用报错*/
#include<stdio.h>
#define ROW 2
#define COLUM 3

//定义寻找最大值与最小值函数
void seek_max_min(int a[][COLUM])
{
	int i, j;
	int row = 0, colum = 0;
	int min, max;
	max = a[0][0];			//初始max的值为第一个数,然后开始比较
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COLUM; j++)
		{
			if (a[i][j] > max)
			{
				max = a[i][j];
				row = i;
				colum = j;
			}
		}
	}
	printf("最大值为:%5d\n所在行为:%5d\n所在列为:%5d\n\n", max, row + 1, colum + 1);

	min = a[0][0];			//初始min的值为第一个数,然后开始比较
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COLUM; j++)
		{
			if (a[i][j] < min)
			{
				min = a[i][j];
				row = i;
				colum = j;
			}
		}
	}
	printf("最小值为:%5d\n所在行为:%5d\n所在列为:%5d\n\n", min, row + 1, colum + 1);
}

void seek_max_min(int a[][COLUM]);

int main()
{
	int a[ROW][COLUM];
	int i, j;
	printf("请输入%d行%d列二维数组的总计%d个数据(用空格隔开):\n", ROW, COLUM, ROW * COLUM);
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COLUM; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}

	printf("输入的数组为:\n");
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COLUM; j++)
		{
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	seek_max_min(a);
	return 0;
}

在这里插入图片描述

4.输入一个m行n列的矩阵,输出各行与各列的元素之和。

#define  _CRT_SECURE_NO_WARNINGS /*防止scanf使用报错*/
#include<stdio.h>
#define ROW 3
#define COLUM 2

//定义数组各行各列元素计算函数
void calc_sumRow_sumColu(int a[][COLUM])
{
	int sumRow[ROW] = { 0 };		//定义保存每行元素和的数组
	int sumColu[COLUM] = { 0 };			//定义保存每列元素和的数组	

	int i, j;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COLUM; j++)
		{
			sumRow[i] += a[i][j];
			sumColu[j] += a[i][j];
		}
	}

	//打印计算结果
	for (i = 0; i < ROW; i++)
	{
		printf("第%d行和为:%d\n", i + 1, sumRow[i]);
	}
	printf("\n");
	for (j = 0; j < COLUM; j++)
	{
		printf("第%d列和为:%d\n", j + 1, sumColu[j]);
	}
}

int main()
{
	int i, j;
	int a[ROW][COLUM];
	printf("请输入%d行%d列二维数组的总计%d个数据(用空格隔开):\n", ROW, COLUM, ROW * COLUM);
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COLUM; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}

	printf("输入的矩阵为:\n");
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COLUM; j++)
		{
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	calc_sumRow_sumColu(a);
	return 0;
}

在这里插入图片描述

5.输入3个字符串,找出其中最大的字符串。

#define  _CRT_SECURE_NO_WARNINGS /*防止scanf使用报错*/
#include<stdio.h>
#include <string.h>
#define ROW 3

int main()
{
	char str[ROW][60];
	char string[60];
	printf("请输入%d个字符串:\n",ROW);
	int i;
	for (i = 0; i < ROW; i++)
	{
		gets_s(str[i]);
	}
	if (strcmp(str[0], str[1]) > 0)
		strcpy(string, str[0]);
	else
		strcpy(string, str[1]);
	if (strcmp(str[2], string) > 0)
		strcpy(string, str[2]);
	printf("\n最大的字符串为:%s\n", string);
	printf("\n");

	return 0;
}

在这里插入图片描述

6.自编写字符串复制函数(功能与strcpy完全一样)。

#define  _CRT_SECURE_NO_WARNINGS /*防止scanf使用报错*/
#include<stdio.h>
#include<string.h>
#define M 100

/*同时需要将'\0'复制过去*/
int main()
{
	char s1[M] = { 'a','c','e','h','z','t' };
	char s2[M];

	printf("原字符串为:%s\n", s1);
	printf("\n请输入需要进行复制的字符串:");
	scanf("%s", s2);
	int lens1 = strlen(s1);

	int i;
	for (i = 0; i <= strlen(s2); i++)
	{
		int m = lens1 + i;
		s1[m] = s2[i];
	}
	printf("\n复制过后的新字符串为:%s\n", s1);
	return 0;
}

在这里插入图片描述

7.编程将一个输入的ASCII数字串转换成对应的整数(数字串对应的数的范围不超过32位整数的值的范围)。

#define  _CRT_SECURE_NO_WARNINGS /*防止scanf使用报错*/
#include<stdio.h>

int myatoi(char a[])
{
	int res = 0, i = 0;
	while (a[i] != '\0')
	{
		res = a[i] - '0' + res * 10;
		i++;
	}
	return res;
}

int main()
{
	char str[] = "221225";
	printf("%d\n", myatoi(str));
	printf("\n");
	return 0;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是快卡黎嫩哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值