【数组】习题

沈阳航空航天大学习题的整理,仅供参考。

1.求多个学生的平均成绩

【问题描述】一个学习小组有5个人,每个人有三门课(高数、英语和C语言)的考试成绩,求每人的平均成绩。按行输出每个学生的各科成绩及平均成绩。

【输入形式】按高数、英语和C语言课程顺序输入每个学生的成绩。
【输出形式】按行输出每个同学每个同学的每门课成绩及平均成绩。
【样例输入】

95 84 74 60 35

87 67 98 78 69

98 89 78 76 67
【样例输出】

95 87 98 93.33

84 67 89 80.00

74 98 78 83.33

60 78 76 71.33

35 69 67 57.00
【样例说明】输出每个同学信息各占一行,且平均成绩保留两位小数

#include<stdio.h>
int main()
{
	int a[3][5], m, n;
	float sum;
	for (m = 0; m < 3; m++)
		for (n = 0; n < 5; n++)
			scanf("%d", &a[m][n]);
	for (n = 0; n < 5; n++)
	{
		sum = 0;
		for (m = 0; m < 3; m++)
		{
			printf("%d ", a[m][n]);
			sum += a[m][n];
		}
		printf("%.2f\n", sum / 3);
	}
	return 0;
}

2.顺序查找

【问题描述】输入一组整数和一个待查数据,在一组整数中查找待查数据是否存在。
【输入形式】输入一个整数n,表示一组整数的个数(个数不会超过50个),输入n个整数,输入一个待查数据。
【输出形式】如果查找成功,返回该数据在数组中的下标;如果查找失败,输出no。
【样例输入】5  34 23 12 14 76 12
【样例输出】2

【样例输入】7  4  2  32  41 47  61  81  90
【样例输出】no
【样例说明】数据之间用空格隔开

#include<stdio.h>
int main()
{
	int n, arr[50], i, x;//x查找数
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &arr[i]);
	scanf("%d", &x);
	for (i = 0; i < n; i++)
	{
		if (x == arr[i])
		{
			printf("%d", i);
			break;
		}
		if (i == n - 1)
			printf("no");
	}
	return 0;
}

3. 数组最大、最小元素与第一个和最后一个元素的对调

【问题描述】输入n个整数,其中n为大于等于2 的正整数。将数组中最大元素与第一个元素对调,最小元素与最后一个元素对调,并输出新数组。
【输入形式】n及n个整数
【输出形式】n个整数
【样例输入】10 1 2 3 4 5 6 7 8 9 10
【样例输出】10 2 3 4 5 6 7 8 9 1

#include<stdio.h>
int main()
{
	int n, arr[100], i, s;//a最大下标,m最小下标,s换数
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &arr[i]);
	int max = arr[0], a = 0;
	for (i = 0; i < n; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
			a = i;
		}
	}
	s = arr[0];
	arr[0] = arr[a];
	arr[a] = s;
	int min = arr[0], m = 0;
	for (i = 0; i < n; i++)
	{
		if (arr[i] < min)
		{
			min = arr[i];
			m = i;
		}
	}
	s = arr[n - 1];
	arr[n - 1] = arr[m];
	arr[m] = s;
	for (i = 0; i < n; i++)
		printf("%d ", arr[i]);
	return 0;
}

4. 院士名单排序

【问题描述】2019年11月22日,中国科学院、中国工程院公布了2019年两院院士增选结果。共选举产生64名科学院院士和75名工程院院士、20名外籍科学院院士和29名外籍工程院院士。其中来自航空航天领域的新科学院院士有2名,分别是李东旭(女)和祝学军(女)。新工程院院士共8人,分别是曹喜滨、向锦武、肖龙旭、朱广生、魏毅寅、宫声凯、曹建国、李贤玉(女)。请输入某两位院士的汉语拼音,按照字典次序进行排列并输出排列结果。

【输入形式】输入两个院士名字的汉语拼音,中间用空格隔开,不包含空格。

【输出形式】排序后的两个院士的名字的汉语拼音,中间用空格隔开。

【样例输入】lidongxu zhuxuejun

【样例输出】lidongxu zhuxuejun

【样例输入】caoxibin caojianguo

【样例输出】caojianguo caoxibin

(1)使用字符串库函数

#include<stdio.h>
#include<string.h>
int main()
{
	char name1[50], name2[50];
	scanf("%s %s", name1, name2);
	int cmp = strcmp(name1, name2);
	if (cmp <= 0)
		printf("%s %s", name1, name2);
	else
		printf("%s %s", name2, name1);
	return 0;
}

(2)不使用字符串库函数

#include<stdio.h>
int main()
{
	int i, t;
	char a[50], b[50];
	scanf("%s %s", a, b);
	for (i = 0; i < 50; i++)
	{
		if (a[i] > b[i])
		{
			t = 1;
			break;
		}
		if (a[i] < b[i])
		{
			t = 0;
			break;
		}
	}
	if (t == 0)
		printf("%s %s", a, b);
	if (t == 1)
		printf("%s %s", b, a);
	return 0;
}

5.计算两个二维数组的差

【问题描述】输入两个同为m*n的二维整数数组A和B(m,n<10),计算A-B的差并输出。
【输入形式】m|n|第1个m*n二维数组A|第2个m*n二维数组B
【输出形式】m*n二维数组C
【样例输入】

2

3

1 2 3

4 5 6

-1 -2 -3

-4 -5 -6

【样例输出】

2 4 6

8 10 12

#include<stdio.h>
int main()
{
	int m, n;
	int A[10][10], B[10][10], arr[10][10];
	int i, j;
	scanf("%d %d", &m, &n);
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &A[i][j]);
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &B[i][j]);
		}
	}
	for (i = 0; i < m; i++) 
	{
		for (j = 0; j < n; j++)
		{
			arr[i][j] = A[i][j] - B[i][j];
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

6.将数组按照每5个一组分组,求其平均值

【问题描述】输入一个整数的数组,按从前到后次序进行分组,每组包含5个数,剩余不足5个数自成一组。分别对每组数计算其平均值。
【输入形式】首先输入数组个数n,再分别输入n个数组元素,数据之间用空格隔开。数组元素不超过50个。
【输出形式】输出求出的若干个平均值,每个数据之间用空格隔开,平均值用double表示,保留两位小数。
【样例输入】8 7 6 5 1 12 4 5 11
【样例输出】6.20 6.67

#include <stdio.h>
int main()
{
    int n, i, j, count;
    double sum = 0, avg;
    int arr[100];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < n; i += 5)
    {
        count = 0;
        for (j = i; j < i + 5 && j < n; j++)
        {
            sum += arr[j];
            count++;
        }
        avg = sum / count;
        printf("%.2f ", avg);
        sum = 0;
    }
    if (i < n)
    {
        count = n - i;
        sum = 0;
        for (j = i; j < n; j++)
        {
            sum += arr[j];
        }
        avg = sum / count;
        printf("%.2f\n", avg);
    }
    return 0;
}

7.折半查找

【问题描述】输入一组有序整数和一个待查整数,用折半查找法查找待查数据是否在这有序数中。
【输入形式】输入整数n代表有序数的个数(n不超过50),接着输入n个按升序排列的整数,最后输入一个待查数据。
【输出形式】如果查找成功,返回待查数据在数组中的下标;如果查找失败,输出“no“。
【样例输入】5 3 6 8 9 12 9
【样例输出】3

【样例输入】6 3 6 8 9 12 19 5
【样例输出】no
【样例说明】输入的数据之间用空格隔开

#include<stdio.h>
void zb(int x, int arr[], int n)
{
	int ji = 0, high = n - 1, low = 0, mid;
	while (high >= low)
	{
		mid = (high + low) / 2;
		if (x < arr[mid])
			high = mid - 1;
		else if (x > arr[mid])
			low = mid + 1;
		if (x == arr[mid])
		{
			printf("%d", mid);
			ji = 1;
			break;
		}
	}
	if (ji == 0)
		printf("no");
}
int main()
{
	int n, i, x, arr[50];
	void zb(int x, int arr[], int n);

	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &arr[i]);
	scanf("%d", &x);
	zb(x, arr, n);
	return 0;
}

8.十进制转换为R进制

【问题描述】输入一个十进制整数,将其转换成N进制数(1<N<=16)

【输入形式】一个十进制数 整数N

【输出形式】数字或字母由 (0-9,A,B,C,D,E,F)

【样例输入】300 16

【样例输出】12C

【样例输入】100 2

【样例输出】1100100

#include<stdio.h>
int main()
{
	int num, n, i, j, sum = 0;
	int s[1000] = { 0 };
	scanf("%d%d", &num, &n);
	for (i = 0; num != 0; i++)
	{
		sum = num % n;
		num = num / n;
		s[i] = sum;
	}
	for (j = i - 1; j >= 0; j--)
	{
		if (s[j] >= 10)
			printf("%c", s[j] + 55);
		else
			printf("%d", s[j]);
	}
	return 0;
}

9.求整数数组组中特定值K出现次数

【问题描述】求整数数组组中特定值出现次数。
【输入形式】输入N个整数,以-1作为结束(-1不记在数组中),然后输入一个整数K,数据以空格隔开

【输出形式】整数K在N个整数中出现的次数C
【样例输入】3 1 1 2 2 3 -1 2
【样例输出】2
【样例输入】3 1 1 2 2 3 -1 0
【样例输出】0

【特殊说明】数组元素个数不超过50个

#include<stdio.h>
int main()
{
	int arr[50], K, c = 0, i, N;
	for (i = 0; i < 50; i++)
	{
		scanf("%d", &arr[i]);
		if (arr[i] == -1)
			break;
	}
	N = i;
	scanf("%d", &K);
	for (i = 0; i < N; i++)
		if (arr[i] == K)
			c++;
	printf("%d", c);
	return 0;
}

10.输入包含3种括号的的字符串,编写算法判断其各对括号是否匹配。

【问题描述】输入可能包含'{'、‘}’、'['、']'、'('、')'这6种字符的字符串(不超过20个,不考虑空字符串),如果3种左右括号出现的次数能够匹配——比如出现3个左花括号和3个右花括号,2个左方括号和2个右方括号等,则认为匹配,否则不匹配。只考虑3种括号的匹配,其他字符不予考虑。    

【输入形式】<字符串><enter>
【输出形式】matched||unmatched
【样例1输入】123avd{[()]}!@#
【样例1输出】matched

【样例2输入】??@{[(()]}]]]]@??
【样例1输出】unmatched

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#define N 20
int  main()
{
	char ss[N];
	//a[2][3]用来分别存放6种括号的个数,第0行和第1行的第0列分别存放第1种左右括号的个数,第0行和第1行的第1列分别存放第2种左右括号的个数……
	int a[2][3] = { 0 };
	int i, j;
	scanf("%s", ss);
	for (i = 0; ss[i] != '\0'; i++)
	{
		if (ss[i] == '{')
			a[0][0]++;
		if (ss[i] == '}')
			a[1][0]++;
		if (ss[i] == '[')
			a[0][1]++;
		if (ss[i] == ']')
			a[1][1]++;
		if (ss[i] == '(')
			a[0][2]++;
		if (ss[i] == ')')
			a[1][2]++;
	}
	int flag = 1;
	for (j = 0; j <= 2; j++)
	{
		if (a[0][j] != a[1][j])
		{
			flag = 0;
			break;
		}
	}
	if (flag == 1)
		printf("matched\n");
	else printf("unmatched\n");
	return  0;
}

11.将任意输入的一串英文字母按字典顺序排序并输出。

【问题描述】输入输入一串英文字母,按ASCII顺序排序后输出。

【输入形式】<字符串>
【输出形式】<字符串>

【样例输入】ertSAuqW
【样例输出】ASWeqrtu

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
int main()
{
	char  s[N], t;
	int  i, j, SIZE;
	gets(s);//注:若该步骤无法运行则改为gets_s(s)
	SIZE = strlen(s);
	for (i = 1; i < SIZE; i++)
		for (j = 0; j < SIZE - 1; j++)
		{
			if (s[i] < s[j])
			{
				t = s[i];
				s[i] = s[j];
				s[j] = t;
			}
		}
	puts(s);
	return 0;
}

12.删除字符串中特定字符,并输出。

【问题描述】任意输入一串字符s1,以回车键结束;再输入一个字符ch,把s1中所有ch删除,然后输出新字符串。

【输入形式】<字符串> <字符>
【输出形式】<字符串>

【样例输入】abcd*1@?/wdsd

           d
【样例输出】abc*1@?/ws

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
int main()
{
    char s1[N], s2[N] = "\0", ch;
    int i, j;
    gets(s1);//若无法运行则改为gets_s(s1)
    fflush(stdin);
    ch = getchar();
    i = 0; j = 0;
    while (s1[i] != '\0')
    {
        if (s1[i] != ch)
        {
            s2[j] = s1[i];
            j++;
        }
        i++;
    }
    puts(s2);
    return 0;
}

13.向一个升序整数数组中插入一个整数,使之仍然保持原有序列。

【问题描述】任意输入一个保持升序的整数数组a,以-1结束;再输入一个整数x,编写算法将x插入数组a中,使之仍然保持升序,并输出新升序数组。

【输入形式】升序数组 整数x
【输出形式】新升序数组,以空格隔开。
【样例输入】

1 2 3 5 6 -1

4
【样例输出】

1 2 3 4 5 6
【样例说明】数组总长度不超过20。

#include <iostream>
#include <stdio.h>
#define N 20
int main()
{
    int a[N], i;
    int x, t, j;
    int len;
    for (i = 0;; i++)
    {
        scanf("%d", &t);
        if (t != -1)
            a[i] = t;
        else break;
    }
    len = i;
    scanf("%d", &x);
    for (i = 0; i < len; i++)
    {
        if (x <= a[i])
            break;
    }
    for (j = len - 1; j >= i; j--)
    {
        a[j + 1] = a[j];
    }
    a[i] = x;
    for (i = 0; i < len + 1; i++)
        printf("%d ", a[i]);
    return 0;
}

14.把字符串中的小写字符转换为大写字母

【问题描述】输入一段字符存在数组,将其中的小写字母转化为大写字母,最后将转化后的字符串输出。
【输入形式】输入一串字符,一回车作为结束
【输出形式】输出不包含小写字母的字符串,其他字符不变。
【样例输入】aBcdEFg
【样例输出】ABCDEFG

#include<stdio.h>
int main()
{
	char c, str[66];
	int i;
	gets(str);
	for (i = 0; (c = str[i]) != '\0'; i++)
	{
		if (c >= 'a' && c <= 'z')
			c -= 32;
		str[i] = c;
	}
	puts(str);
	return 0;
}

15.冒泡排序

【问题描述】对数据进行数据排序(冒泡排序),其中数组有10个整数
【输入形式】输入数组
【输出形式】排序好的数组
【样例输入】10 1 2 7 6 8 9 3 4 5
【样例输出】1 2 3 4 5 6 7 8 9 10

#include<stdio.h>
int main()
{
	int a[10], i, j, t;
	for (i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	for (j = 0; j < 9; j++)
		for (i = 0; i < 9 - j; i++)
			if (a[i] > a[i + 1])
			{
				t = a[i + 1];
				a[i + 1] = a[i];
				a[i] = t;
			}
	for (i = 0; i < 10; i++)
		printf("%d ", a[i]);
	return 0;
}

16.数组前半部分按升序排列,后半部分按降序排列

【问题描述】输入一串整数,以-1为结束(-1不记在数组中),数组前半部分用按升序排列,后半部分按降序排列。
【输入形式】输入一串整数,以-1为结束
【输出形式】输出排序好的数组
【样例输入】3 5 2 1 21 34  2 1 12 -1
【样例输出】1 2 3 5 21 34  12  2 1

【样例说明】如果数组个数是奇数,则中间的数据两边排序都不参加;数组元素个数不超过50。

#include<stdio.h>
int main()
{
	int i, j, n, a[100], t;
	for (i = 0; i < 100; i++)
	{
		scanf("%d", &a[i]);
		if (a[i] == -1)
			break;
	}
	n = i;
	for (j = 0; j <= n / 2; j++)
		for (i = 0; i < n / 2 - 1; i++)
			if (a[i] > a[i + 1])
			{
				t = a[i];
				a[i] = a[i + 1];
				a[i + 1] = t;
			}
	for (j = n - 1; j >= n / 2; j--)
		for (i = n - 1; i > n / 2 ; i--)
			if (a[i] > a[i - 1])
			{
				t = a[i];
				a[i] = a[i - 1];
				a[i - 1] = t;
			}
	for (i = 0; i < n; i++)
		printf("%d ", a[i]);
	return 0;
}

17.评分统计程序

共有8个评委打分,统计时,去掉一个最高分和去掉一个最低分,其余6个分数的平均分即是最后得分,程序最后应显示这个得分,显示精度为1位整数,两位小数,程序如下,请将程序补充完整。

#include"stdio.h"
void main()
{
	float x[8] = { 9.2,9.5,9.8,7.4,8.5,9.1,9.3,8.8 };
	float aver, max, min;
	int i;
	for (aver = 0, i = 0; i < 8; i++)
		aver += x[i];
	max = x[0];
	min = max;
	for (i = 1; i < 8; i++)
	{
		if (max < x[i])
			max = x[i];
		if (min > x[i])
			min = x[i];
	}
	aver = (aver - max - min) / 6;
	printf("average=%4.2f\n", aver);
    return 0;
}
  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lnk_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值