吉林大学超星慕课平台——高级语言程序设计 实验04 数组及其在程序设计中的应用(2022级)

目录

1. (程序题)

2. (程序题)

3. (程序题)

4. (程序题)

5. (程序题)

6. (程序题)

7. (程序题)

8. (程序题)

9. (程序题)

10. (程序题)

11. (程序题)

12. (程序题)

13. (程序题)


1. (程序题)

题目编号:Exp04-Basic01,GJBook3例-06-13

题目名称:括号匹配

题目描述:编写程序,从终端读入以‘@’为结束符的字符序列,检查该字符序列中的 ( 与 )、 [ 与 ] 、{ 与 } 是否匹配(个数相等且位置不相交)。

输入:包含一串以‘@’为结束符的字符串,其间可能包含空白或其它非括号字符。

输出:如果字符串中三类括号匹配,则输出YES;否则输出NO。
 

样例1:

输入:

{a,a}b{c[cc]c}  {a(bb[cc]dd)a}@
输出:
YES

样例2:

输入:
{a,a}b{c[cc]c] {a(bb[cc]dd)a}@
输出:
NO
#include<stdio.h>

#include<stdbool.h>

#define size 100

int top = 0;

char a[100];

bool push(char x) {

	if (top > size - 1)return false;

	else {

		a[top] = x;

		top++;

		return true;

	}

}

char pop(void) {

	if (top == 0) return '\0';

	else {

		top--;

		return a[top];

	}

}

int check(char x, char y) {

	if (x == '\0' || x == '@') { printf("NO"); return 0; }

	else if (x != y) { printf("NO"); return 0; }

	else return 1;

}

int main() {

	char ch, out;

	int i = 1;

	push('@');

	ch = getchar();

	while (ch != '@') {

		switch (ch) {

		case'[':

		case'(':

		case'{':push(ch); break;

		case']':out = pop(); i = check(out, '['); break;

		case'}':out = pop(); i = check(out, '{'); break;

		case')':out = pop(); i = check(out, '('); break;

		default:break;

		}

		ch = getchar();

		if (i == 0) break;

	}

	out = pop();

	if (i == 1)

	{

		if (out == '@') {

			printf("YES");

		}

		else {

			printf("NO");

		}

	}

	return 0;

}

2. (程序题)

题目编号:Exp04-Basic02

题目名称:n倍数关系

题目描述:

给定若干不完全相同的正整数(<10000)和n(n<5),计算这些正整数里面有多少数对满足:其中一个是另一个的n倍。例如:1 4 3 2 9 7 18 22,n=3时得到的答案是2;因为3是1的3倍,9是3的3倍。


输入:输入第一行给出正整数n的值,接下来包括多组测试数据。每组数据最多100个整数占用一行,以数字0结束(不计入100个整数里)。测试数据不超过20组,最后一行只包括-1,表示输入数据结束。

输出:对每组输入数据,输出一行,给出有多少数对满足其中一个是另一个n倍。(注:最后一行末尾无换行符等多余字符。)
 

样例:

输入:
2
1 4 3 2 9 7 18 22 0
2 4 8 10 0
7 5 11 13 1 3 0
-1
输出:
3
2
0
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main() {

	int n;

	scanf("%d", &n);

	int i = 0, j = 0;

	int a[20][100], b[20];

	for (int iio = 0; iio < 20; iio++) {

		b[iio] = 0;

	}

	for (int hh = 0; hh < 20; hh++) {

		for (int ll = 0; ll < 100; ll++) {

			a[hh][ll] = -2;

		}

	}

	while (1) {

		scanf("%d", &a[i][j]);

		if (a[i][j] == -1) {

			break;

		}

		else if (a[i][j] == 0) {

			i++;

			j = -1;

		}

		j++;

	}

	for (int m = 0; m < i; m++) {

		for (int s = 0; s < 100; s++) {

			for (int p = 0; p < 100; p++) {

				if (p == s) { continue; }

				if (a[m][s] * n == a[m][p]) {

					b[m]++;

				}

			}

		}

	}

	for (int uuu = 0; uuu < i; uuu++) {

		if (uuu != 0)

			printf("\n%d", b[uuu]);

		else {

			printf("%d", b[uuu]);

		}

	}

}

3. (程序题)

题目编号:  Exp04-Basic03

题目名称:  数组排序
题目描述:  编写函数,分别采用教材给出的“主元选择排序”、“冒泡排序”和“逐步增加递增子序列”排序方法对给定数组进行排序。综合运用调试方法,观察不同排序方法在排序过程中数组元素值的变化情况,如观察递增排序如下序列{9、8、7、6、5、4、3、2、1、0},{0、1、2、3、4、5、6、7、8、9}和{2、9、4、7、6、5、8、3、0、1}时,数组中元素比较次数、移动或交换次数。

说明:

(1)对于“主元选择排序”和“冒泡排序”,执行完3个赋值操作,计为1次交换。

(2)对于“逐步增加递增子序列”排序,每执行一次while循环的循环条件判断,计为1次比较;如果在某轮比较中元素本身的位置没有变化,则本轮移动次数为0。

(3)因本题目的是观察输出数据,深入理解排序算法;所以样例点和实测点一致。

输入:包含10个整数的待排序数组。

输出:在一行内依次输出,递增排序时,主元排序比较次数 和 移动/交换次数、冒泡排序比较次数 和 移动/交换次数和递增子序列排序比较次数 和 移动/交换次数,相邻数字之间以一个西文空格间隔。

样例1:

输入:
9 8 7 6 5 4 3 2 1 0
输出:
45 9 90 45 54 54

样例2:

输入:
0 1 2 3 4 5 6 7 8 9
输出:
45 9 9 0 9 0

样例3:

输入:
2 2 3 3 5 5 4 4 6 6
输出:
45 9 27 4 13 6

样例4:

输入:
1 0 3 2 5 4 7 6 9 8
输出:
45 9 18 5 14 10

样例5:

输入:
1 2 3 4 5 5 4 3 2 1
输出:
45 9 81 20 29 24
#include<stdio.h>

int zy1 = 0, zy2 = 0, mp1 = 0, mp2 = 0, cr1 = 0, cr2 = 0;

void zy(int b[10]) {

	int i, j, k, r;

	for (i = 0; i < 9; i++) {

		j = i; zy2++;

		for (k = i + 1; k < 10; k++) {

			zy1++;

			if (b[k] < b[j])

				j = k;

			r = b[i];

			b[i] = b[j];

			b[j] = r;

		}

	}



}

void mp(int b[10]) {

	int i, r, flag = 1;

	while (flag) {

		flag = 0;

		for (i = 0; i < 9; i++) {

			mp1++;

			if (b[i] > b[i + 1]) {

				mp2++;

				r = b[i]; b[i] = b[i + 1]; b[i + 1] = r;

				flag = 1;

			}

		}

	}

}

void cr(int b[10]) {

	int i, j, k, r, flag;

	for (i = 1; i < 10; i++) {

		cr1++;

		flag = 0;

		j = i - 1;

		while ((b[j] > b[i]) && (j >= 0)) {

			j--;

			flag = 1;

			cr1++;

		}

		r = b[i];

		for (k = i - 1; k >= j + 1; k--) {

			b[k + 1] = b[k];

			if (flag)cr2++;

		}

		if (flag)cr2++;

		b[j + 1] = r;

	}

}

int main() {

	int a[10], b[10], c[10];

	for (int s = 0; s < 10; s++) {

		scanf("%d", &a[s]);

		b[s] = a[s]; c[s] = a[s];

	}

	zy(a); mp(b); cr(c);

	printf("%d %d %d %d %d %d", zy1, zy2, mp1, mp2, cr1, cr2);

}

4. (程序题)

题目编号:Exp04-Basic04,GJBook3-06-19

题目名称:删除重复元素

题目描述:编写函数,不使用其他辅助数组,把整型数组中重复元素删得只剩一个;所有未被删除元素都保留最先顺序移动到数组前面。


输入:第一行输入数组长度n(≤100),第二行依次从键盘随机输入n个整数作为数组元素值。

输出:已删除重复元素的数组,各元素间以一个西文空格间隔,最后一个元素后无字符。

样例1:

输入:
10
1 1 2 3 3 3 2 1 2 4
输出:
1 2 3 4

样例2:

输入:
10
1 0 2 2 2 2 2 2 2 2
输出:
1 0 2
#include<stdio.h>
int main() {
	int a[100], n, count = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	for (int m = 0; m < n; m++) {
		if (a[m] < 10492) {
			for (int ss = m + 1; ss < n; ss++) {
				if (a[m] == a[ss]) {
					a[ss] = 10492;
				}
			}
		}
	}
	for (int h = 0; h < n; h++) {
		if (a[h] < 10492) {
			count++;
			if (count == 1) { printf("%d", a[h]); }
			else { printf(" %d", a[h]); }
		}
	}

}

5. (程序题)

题目编号:Exp04-Basic05,GJBook3-06-06

题目名称:转移0元素

题目描述:编写程序,不使用其他辅助数组,把给定整型数组中所有0元素全部移到后面,且所有非0元素的顺序不变。
 

输入:第一行输入数组长度n(≤100),第二行依次从键盘随机输入n个整数作为数组元素值。

输出:已将所有0元素串到后面的整数数组,各元素间以一个西文空格间隔,最后一个元素后无字符。
 

样例1:

输入:
10
0 3 1 0 0 0 1 2 3 0
输出:
3 1 1 2 3 0 0 0 0 0

样例2:

输入:
10
0 0 0 0 0 0 1 2 3 4
输出:
1 2 3 4 0 0 0 0 0 0
#include<stdio.h>

int main() {

	int n, top = 0;

	long long a[100];

	scanf("%d", &n);

	for (int i = 0; i < n; i++) {

		scanf("%lld", &a[i]);

	}

	for (int s = 0; s < n; s++) {

		if (a[s] != 0 && s != top) {

			a[top] = a[s];

			top++;

			a[s] = 0;

		}

		else if (a[s] != 0 && s == top) { top++; }

	}

	for (int h = 0; h < n; h++) {

		if (h == 0)printf("%lld", a[h]);

		else printf(" %lld", a[h]);

	}

}

6. (程序题)

题目编号 :Exp04-Basic06,GJBook3-06-04

题目名称:循环右移

题目描述:编写程序,不使用其它辅助数组,把一维整型数组中的各个元素循环右移j位。

输入:

第一行输入两个整数,n表示数组长度(0<n<=100),j表示循环右移的位数(j>=0);

第二行依次从键盘随机输入n个整数作为数组元素值。

输出:

循环右移后的整数数组,各元素间以一个西文空格间隔,最后一个元素后无字符。

样例1:

输入:
10 2
1 2 3 4 5 6 7 8 9 0
输出:
9 0 1 2 3 4 5 6 7 8

样例2:

输入:
10 23
1 2 3 4 5 6 7 8 9 0
输出:
8 9 0 1 2 3 4 5 6 7
#include<stdio.h>

int main() {

	int n, j, a[100];

	scanf("%d%d", &n, &j);

	for (int m = 0; m < n; m++) {

		scanf("%d", &a[m]);

	}

	j = j % n;

	for (int i = 0; i < n; i++) {

		if (i == 0)printf("%d", a[(i + n - j) % n]);

		else printf(" %d", a[(i + n - j) % n]);



	}

}

7. (程序题)

题目编号:Exp04-Basic07,GJBook3-06-01

题目名称:检验矩阵重复元素

题目描述:编写程序判断任意给定n*n的两维整型数组中是否有相同元素。
 

输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。

输出:如果数组中有相同元素,则输出YES;否则,输出NO。
 

样例1:

输入:
3
1 2 3 4 5 6 7 8 9
输出:
NO

样例2:

输入:
3
1 1 2 3 4 5 6 7 8
输出:
YES
#include<stdio.h>

#include<stdlib.h>

int main() {

	int n, a[100];

	scanf("%d", &n);

	for (int i = 0; i < n * n; i++) {

		scanf("%d", &a[i]);

	}

	for (int s = 0; s < n * n; s++) {

		for (int m = s + 1; m < n * n; m++) {

			if (a[s] == a[m]) {

				printf("YES");

				exit('0');

			}

		}

	}

	printf("NO");

}

8. (程序题)

题目编号: Exp04-Basic08,GJBook3-06-03

题目名称: 矩阵转置

问题描述: 编写程序,将任意给定n*n的两维整型数组转置。

输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。

输出:按先行后列、从左至右的顺序输出转置后数组内的所有元素,每行n个元素,同一行内的各元素间以一个西文空格间隔;每行最后一个元素除必要的回车换行符外无其它字符。

样例1:

输入:
3
1 2 3
1 2 3
1 2 3
输出:
1 1 1
2 2 2
3 3 3

样例2:

输入:
3
1 1 1
2 2 2
3 3 3
输出:
1 2 3
1 2 3
1 2 3
#include<stdio.h>

#include<stdlib.h>

int main() {

	int n, a[10][10], b[10][10];

	scanf("%d", &n);

	for (int h = 0; h < n; h++) {

		for (int l = 0; l < n; l++) {

			scanf("%d", &a[h][l]);

			b[l][h] = a[h][l];

		}

	}

	for (int s = 0; s < n; s++) {

		for (int t = 0; t < n; t++) {

			if (t == 0)printf("%d", b[s][t]);

			else printf(" %d", b[s][t]);

		}

		printf("\n");

	}

}

9. (程序题)

题目编号:Exp04-Basic09,GJBook3-06-02

题目名称:检验矩阵主对角线对称

题目描述:编写程序,判断任意给定n*n的两维整型数组是否关于主对角线对称。
 

输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。

输出:如果数组关于主对角线对称,则输出YES;否则输出NO。

样例1:

输入:

3
1 2 3
2 1 2
3 2 1
输出:
YES

样例2:

输入:

3
0 0 1
2 1 2
3 2 1
输出:
NO
#include<stdio.h>

#include<stdlib.h>

int main() {

	int n, a[10][10];

	scanf("%d", &n);

	for (int i = 0; i < n; i++) {

		for (int p = 0; p < n; p++) {

			scanf("%d", &a[i][p]);

		}

	}

	for (int m = 0; m < n; m++) {

		for (int b = 0; b < n; b++) {

			if (a[m][b] != a[b][m]) {

				printf("NO");

				exit('0');

			}

		}

	}

	printf("YES");

}

10. (程序题)

题目编号:Exp04-Basic10,GJBook3-06-12

题目名称:字符串反序

问题描述:编写程序,将给定的字符串反序输出。

输入:一个长度不超过255的字符串,字符串中可能含有空白字符。

输出:反序输出的字符串。

样例1:

输入 A            输出 A

样例2:

输入 123 45    输出  54 321

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main() {

	char a[255];

	int len;

	gets_s(a);

	len = strlen(a);

	for (int i = len - 1; i >= 0; i--) {

		printf("%c", a[i]);

	}



}

11. (程序题)

题目编号:Exp04-Enhance01,GJBook3-06-25

题目名称:规则形式构建集合

题目描述:

设整数集合 M 定义如下:

(1) 1∈M ;

(2) 若 x ∈M , 则 2x+1 ∈M , 3x+1 ∈M ;

(3) 没有别的整数属于集合 M 。

编程序按递增顺序生成并输出集合 M 的前n项


输入:一个正整数n(≤300)。

输出:按递增序列输出n个属于集合M的整数,各数间以一个西文空格间隔;最后一个数后无字符。

样例1:

输入:10
输出:1 3 4 7 9 10 13 15 19 21

样例2:

输入:1
输出:1
#include<stdio.h>
int main() {
	int n;
	scanf("%d", &n);
	int a[300] = { 1 }, i, j, k;
	for (i = j = 0,k=1; k < n; k++) {
		if (3 * a[i] > 2 * a[j]) { a[k] = 2 * a[j] + 1; j++; }
		else if (3 * a[i] < 2 * a[j]) { a[k] = 3 * a[i] + 1; i++; }
		else { a[k] = 2 * a[i] + 1; i++; j++; }
	}
	for (int s = 0; s < n; s++) { printf("%d ", a[s]); }
}

12. (程序题)

题目编号 :Exp04-Enhance02,GJBook3-06-26

题目名称:约瑟夫问题(Josephus)

题目描述:

古代某法官要判决 n 个犯人死刑, 他有一条荒唐的逻辑, 将犯人首尾相接排成圆圈,所有计数从1开始; 然后从第 s 个人开始数, 每数到第 m 个犯人,则拉出来处决; 然后再数 m 个,数到的犯人再处决;... ; 但剩下的最后一个犯人可以赦免。编程序,给出处决顺序,并告知哪一个人活下来。

输入:三个正整数 n(≤1000),s和m,都可以使用int类型变量表示。

输出:依次输出被处决人员的编号,每个编号之间用一个西文空格间隔,最后一个编号后无字符。
 

样例:

输入:6 1 5
输出:5 4 6 2 3 1
#include <stdio.h>

int main() {

	int n, s, m, a[1009];

	scanf_s("%d %d %d", &n, &s, &m);

	int i, j;

	int h = s - 1, count = 0;

	for (i = 0; i <= n - 1; i++) {

		a[i] = i;

	}

	while (count <= n - 1) {

		h = (h + m - 1) % (n - count);

		if (count == 0) { printf("%d", a[h] + 1); }

		else { printf(" %d", a[h] + 1); }

		a[h] = 114514;

		j = 0;

		for (i = 0; i <= n - 1 - count; i++)

			if (a[i] != 114514) {

				a[j] = a[i];

				j++;

			}

		count++;

	}

}

13. (程序题)

题目编号 :Exp04-Enhance03,freshman-1006

题目名称:英文翻译自然数

题目描述:按常规英文输出1000以内自然数的英文读法。
 

输入:每个测试输入包含 1 个测试用例,给出正整数 n(0<= n <1000)

输出:输出占一行:如果 0<= n <1000, 用规定的格式输出 n,所有英文单词小写,最后一个单词后无字符;否则输出ERR。

样例:

输入:123
输出:one hundred and twenty-three
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

int main() {

	int n, g, s, b;

	scanf("%d", &n);

	if (n >= 1000 || n < 0) { printf("ERR"); }

	else {

		char s1[10][10] = { "","one","two","three","four","five","six","seven","eight","nine" };

		char s2[10][10] = { "ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen" };

		char s3[10][10] = { "","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety" };

		g = n % 10;

		s = (n / 10) % 10;

		b = n / 100;

		if (b != 0) {

			printf("%s hundred", s1[b]);

			if (g != 0 || s != 0) {

				printf(" and");

				if (s == 1) { printf(" %s", s2[g]); }

				else if (s == 0) { printf(" %s", s1[g]); }

				else {

					printf(" %s", s3[s]);

					if (g != 0) {

						printf("-%s", s1[g]);

					}

				}

			}

		}

		if (b == 0) {

			if (g != 0 || s != 0) {

				if (s == 1) { printf("%s", s2[g]); }

				else if (s == 0) { printf("%s", s1[g]); }

				else {

					printf("%s", s3[s]);

					if (g != 0) {

						printf("-%s", s1[g]);

					}

				}

			}

			else { printf("zero"); }

		}

	}

}

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值