沈阳航空航天大学习题的整理,仅供参考。
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;
}