C语言——数组练习题

1. 写出一个高效的算法来搜索m×n矩阵中的值,判断一个值是否在这个矩阵中出现。

这个矩阵具有以下特性:

每行中的整数从左到右是排序的。

每一列的整数从上到下是排序的。

在每一行或每一列中没有重复的整数。

样例:

矩阵:

1 2 9 10

3 4 11 12

5 7 12 14

6 9 14 16

整数:7

结果:1

提示:这个矩阵叫做杨氏矩阵,在搜索过程中,遵循杨氏矩阵的搜索规律,从左上角开始,key小于矩阵中该点的值,往左走,大于则往下走

#include<stdio.h>
int main()
{
	int a[4][4] = { {1,2,9,10},{3,4,11,12},{5,7,12,14},{6,9,14,16} };
	int row,col,key,sum = 0;
	row = 0;
	col = 3;
	printf("整数:");
	scanf_s("%d", &key);
	if (key<a[0][0] || key>a[3][3])
		sum=0;
	else
	{
		while (row < 4 && col >= 0)
		{
			if (key < a[row][col])
				col--;
			else if (key > a[row][col])
				row++;
			else if (key == a[row][col])
			{
				sum = 1;
				break;
			}
		}
	}
	printf("结果:%d\n", sum);
	return 0;
}

Ps. 本段代码没有采用从控制台输入矩阵的方式,而是在代码段中写入矩阵并按要求进行处理。可能与题意有偏差。(控制台输入矩阵可以考虑输入矩阵大小后对其进行动态内存分配)

2. 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。

这个矩阵具有以下特性:

每行中的整数从左到右是排序的。

每一列的整数从上到下是排序的。

在每一行或每一列中没有重复的整数。

样例:

矩阵:

1 3 5 7

2 4 7 8

3 5 9 10

给出key = 3,返回 2

#include<stdio.h>
int main()
{
	int a[3][4] = { {1,3,5,7},{2,4,7,8},{3,5,9,10} };
	int row, col, key, sum = 0;
	row = 0;
	col = 3;
	printf("整数:");
	scanf_s("%d", &key);
	if (key<a[0][0] || key>a[2][3])
		sum = 0;
	else
	{
		while (row < 3 && col >= 0)
		{
			if (key < a[row][col])
			{
				col--;
				continue;
			}
			else if (key > a[row][col])
			{
				row++;
				continue;
			}
			else if (key == a[row][col])
			{
				sum++;
				row++;
				continue;
			}
		}
	}
	printf("结果:%d\n", sum);
	return 0;
}

3. 给定一个包含 m * n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素。

样例:

给定如下矩阵:

 [ 1, 2, 3 ],

 [ 4, 5, 6 ],

 [ 7, 8, 9 ]

应返回 [1,2,3,6,9,8,7,4,5]。

#include<stdio.h>
int main()
{
	int a[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	int temp[9] = { 0 };
	int i,j,c=0,k=0;
	while (k<9)
	{
		for (i=c,j=c; j < 3 - c; j++, k++)
		{
			if (k == 9)break;
			temp[k] = a[i][j];
		}
		for (j--,i++; i < 3 - c; i++, k++)
		{
			if (k == 9)break;
			temp[k] = a[i][j];
		}
		for (j--,i--; j >= c; j--, k++)
		{
			if (k == 9)break;
			temp[k] = a[i][j];
		}
		for (j++,i--; i > c; i--, k++)
		{
			if (k == 9)break;
			temp[k] = a[i][j];
		}
		i++;
		c++;
	}
	for (k = 0; k < 9; k++)
	{
		printf("%d", temp[k]);
	}
	return 0;
}

4.完成fun函数和相应的测试主函数

  1. 编写一个函数:int fun(float score[], int m, float below[]); score为一数组,代表一个班学生的成绩表,该成绩表有m个元素(m个学生),函数返回低于平均值的元素个数,并将低于平均分的分数放在below 所指的数组中,如果函数输入数据异常,函数返回-1。例如,当 score 数组中的数据为 10.1、20.2、30.3、40.4、50.5、60.6、70.7、80.8、90.9时,函数返回的认输应该是 4,below 中的数据应为10.1、20.2、30.3、40.4。
  2. 编写主函数,用于测试fun函数。要求从键盘输入数组元素的个数n,利用随机数函数产生n个0~100之间的浮点数(带1位小数),即产生的每个数大于等于0.0且小于100.0,调用fun函数,用以确定fun函数是否正确。

提示和要求:

  1. 主函数能够测试fun函数的各种情况,比如输入异常情况,观测fun函数是否返回-1;正常输入时,观测fun函数能否正确给出结果。数组score,数组below以及函数返回值等内容输出到显示器,方便观测函数是否正确。
  2. 随机数产生函数是rand(),随机数种子设置函数是srand(),请自行设置随机数种子以产生不同的随机数,需要的头文件是stdlib.h
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    void func(float score[], int m, float below[])
    {
    	int i,num=0,k=0,t;
    	float avr,sum=0;
    	if (score == NULL || m <= 0)
    		t = -1;
    	else
    	{
    		for (i = 0; i < m; i++)
    		{
    			sum =sum+ score[i];
    		}
    		avr = sum / m;
    		for (i = 0; i < m; i++)
    		{
    			if (score[i] < avr)
    			{
    				num++;
    				below[k] = score[i];
    				k++;
    			}
    		}
    		t=num;
    	}
    }
    
    int fun(float score[], int m, float below[])
    {
    	int i, num = 0, k = 0;
    	float avr, sum = 0;
    	if (score == NULL || m <= 0)
    		return -1;
    	else
    	{
    		for (i = 0; i < m; i++)
    		{
    			sum = sum + score[i];
    		}
    		avr = sum / m;
    		for (i = 0; i < m; i++)
    		{
    			if (score[i] < avr)
    			{
    				num++;
    				below[k] = score[i];
    				k++;
    			}
    		}
    		return num;
    	}
    }
    
    int main()
    {
    	int n,i,c,result;
    	printf("Please enter the amounts of students:");
    	scanf_s("%d", &n);
    	printf("Please enter the type:");
    	scanf_s("%d", &c);
    	float t1;
    	srand((unsigned)time(NULL));
    	float* a, below[1000] = { 0 };
    	a = (float *)calloc(n, sizeof(float));
    	if (a == NULL||below==NULL)
    	{
    		printf("#error! Failed to Malloac.\n");
    	}
    	else
    	{
    		switch (c) 
    		{
    			case(1):
    				for (i = 0; i < n; i++)
    				{
    					t1 = (rand() % 10001);
    					*(a + i) = t1 / 100;
    				}
    				func(a, n, below);
    				printf("The results:\n");
    				for (i = 0; *(below + i) != '\0'; i++)
    				{
    					printf("%.1f ", below[i]);
    				}
    				break;
    			case(2):
    				for (i = 0; i < n; i++)
    				{
    					t1 = (rand() % 10001);
    					*(a + i) = t1 / 100;
    				}
    				result=fun(a, n, below);
    				printf("The results:");
    				printf("%d", result);
    				break;
    			default:break;
    		}
    	}
    	free(a);
    	return 0;
    }
    

        

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯并按条件打印笑脸 11.经典兔子问题 12.判断素数 13.水仙花数问题 14.正整数分解质因数 15.学习成绩划分 16.正整数求其最大公约数和最小公倍数 17.统计英文字母/空格/数字个数 18.求s=a+aa+aaa+aa...a的值 19.求解"完数" 20.球体自由落下物理问题 21.猴子吃桃问题 22.乒乓球比赛抽签问题 23.打印菱形图案 24.分数数列求和 25.求1+2!+3!+...+20!的和 26.利用递归方法求5! 27.将输入字符以相反顺序打印 28.岁数问题 29.求解正整数位数 30.判断回文数 31.星期几猜测游戏 32.改变文本颜色 33.学习gotoxy()与clrscr()函数 34.练习函数调用 35.设置文本颜色 36.求100之内的素数 37.对10个数进行排序 38.求3*3矩阵对角线元素之和 39.数字插入数组重新排序 40.将一个数组逆序输出 41.static定义静态变量用法 42.使用auto定义变量用法 43.使用static的另一用法 44.使用external的用法 45.使用register定义变量方法 46.宏#define命令练习(1) 47.宏#define命令练习(2) 48.宏#define命令练习(3) 49.#if #ifdef和#ifndef的综合应用 50.#include 的应用练习 51.学习使用按位与 & 52.学习使用按位或 | 53.学习使用按位异或 ^ 54.取一个整数从右端开始的4~7位。 55.学习使用按位取反~ 56.用circle画圆形 57.学用line画直线 58.用rectangle画方形 59.画图综合例子 60.画图综合例子2 61.打印杨辉三角形 62.学习putpixel画点 63.画椭圆ellipse 64.利用ellipse and rectangle画图 65.画个最优美的图案 66.输入3个数字按大小顺序输出 67.输入数组交换元素重新输出 68.多个整数后移位置问题 69.圆圈报数问题 70.计算一个字符串长度 71.编写输入/输出函数 72.创建链表 73.反向输出链表 74.连接两个链表 75.算一道简单题目 76.调用函数求1/2+1/4+...+1/n 77.填空练习(指向指针的指针) 78.找到年龄最大的人 79.字符串排序 80.海滩猴子分桃 81.已知公式条件求数字 82.八进制转换为十进制 83.求0-7所能组成的奇数个数 84.由两个素数之和表示的偶数 85.判断一个素数能被几个9整除 86.两个字符串连接程序 87.结构体变量传递 88.读取数字的整数值并打印出该值个数的* 89.数据加密 90.专升本一题 91.时间函数举例1 92.时间函数举例2 93.时间函数举例3 94.一个猜数游戏 95.家庭财务管理小程序 96.计算字符串中子串出现的次数 97.输入字符并保存到磁盘 98.字符串转换成大写字母并输出保存 99.文件操作应用1 100.文件操作应用2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值