超星学习通高级语言程序设计课程 实验 4 数组 题目及答案

以下均为个人编写,肯定有不到之处,也欢迎指正和修改

以下均为Vs2019环境下写的,因此有#define _CRT_SECURE_NO_WARNINGS的宏定义

1 括号匹配

题目描述:编写程序,从终端读入以‘@’为结束符的字符序列(序列总长度不超过1000个字符),检查该字符序列中的(与)、[与] 、{ 与 } 是否匹配(个数相等且位置不相交)。
输入:包含一串以‘@’为结束符的字符串,其间可能包含空白或其它非括号字符。
输出:如果字符串中三类括号匹配,则输出YES;否则输出NO。
输入:
{ a,a }b{ c[cc]c }  {a(bb[cc]dd)a}@
输出:
YES

涉及对栈的模仿的一道题,课本原题

#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
#define size 1000
char stack[size], ch;
int top;
void initial() {
	top = 0;
}
bool push(char x)
{
	if (top > size - 1)
		return false;
	else {
		stack[top] = x;
		top++;
		return true;
	}
}
char pop()
{
	if (top == 0)
		return '\0';
	else {
		top--;
		return stack[top];
	}
}
void check(char x, char y) {
	if (x == '\0' || x == '@')
	{
		printf("NO");
		exit(0);
	}
	else if (x != y)
	{
		printf("NO");
		exit(0);
	}
}
int main()
{
	char ch, out; initial();
	push('@');
	ch = getchar();
	while (ch != '@')
	{
		switch (ch)
		{
		case'(':
		case'{':
		case'[':push(ch); break;
		case')':out = pop(); check(out, '('); break;
		case'}':out = pop(); check(out, '{'); break;
		case']':out = pop();  check(out, '['); break;
		}
		ch = getchar();
	}
	out = pop();
	if (out == '@')
		printf("YES");
	else printf("NO");
	return 0;
}

2

给定若干不完全相同的正整数( < 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倍;如果没有满足要求的数对,则输出0。
 (注:最后一行末尾无换行符等多余字符)。

输入:
2
1 4 3 2 9 7 18 22 0
2 4 8 8 0
7 5 11 13 1 3 0
-1
Plain Text
输出:
3
3
0

#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
int MAX(int a, int b)
{
	if (a >= b)
		return a;
	else return b;
}
int min(int a, int b)
{
	if (a >= b)
		return b;
	else return a;
}
int main()
{
	int n, num[101] = {0}, i, m, a[20] = {0}, b, c;//a[]储存结果
	scanf("%d", &n);
	for (i = 0; i < 20; i++)//i为行数
	{
		for (m = 0; m <=100; m++)//m为列数
		{
			scanf("%d", &num[m]);
			if (num[m] == 0)
			{
				for (b = 0; b < m - 1; b++)//数组内数两两取余,得0则a[i]++
				{
					c = b + 1;
					//printf("%d", c);
					do {
						if (MAX(num[c],num[b]) %min(num[c], num[b] )== 0&&MAX(num[c], num[b]) / min(num[c], num[b])==n)
							a[i]=a[i]+1;
						//printf("a[i]=%d", a[i]);
						c++;
					} while (c < m);
				}
				break;//输入0时终止这次循环
			}
			if (m == 0 && num[m] == -1)//某行第一个字符为-1循环全部终止进入打印结果的语句
			{
				goto next;
			}
		}
	}
next:for (m = 0; m < i; m++)
		printf("%d\n", a[m]);
		

}

3、

数组排序
题目描述 : 编写函数,分别采用教材给出的“主元选择排序”、“冒泡排序”和“逐步增加递增子序列”排序(插入排序)方法对给定数组进行排序。综合运用调试方法,观察不同排序方法在排序过程中数组元素值的变化情况,如观察递增排序如下序列{ 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个整数的待排序数组。
输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值