超星高级语言程序设计实验作业 (实验04 数组及其在程序设计中的应用)(二)

超星高级语言程序设计实验作业

实验04 数组及其在程序设计中的应用(二)

注:以下内容仅供交流,代码都是本人自己写的,还请同学们先自己编写再进行交流。

7.检验矩阵重复元素

题目描述:编写程序判断任意给定nn的两维整型数组中是否有相同元素。
输入:第一行输入数组行数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 a[100],n,i,k;
	scanf_s("%d", &n);
	for ( i = 0; i < n*n; i++){
		scanf_s("%d", &a[i]);
	}
	for ( i = 0; i < n*n; i++){
		for ( k = i+1; k < n*n; k++){
			if (a[i]==a[k]){
				printf("YES");
				exit(0);
			}
		}
	}
	printf("NO");
	return 0;
}

这道题中我用了exit函数来方便结束程序,exit包含在stdlib.h中,用于结束程序exit(0)表示正常退出。

8.矩阵转置

问题描述: 编写程序,将任意给定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>
void input(int a[10][10],int n){
	int i, j;
	for ( i = 0; i < n; i++){
		for ( j = 0; j < n; j++)
			scanf_s("%d", &a[i][j]);
	}
}
void out(int a[10][10], int n) {
	int i, j;
	for ( i = 0; i < n; i++){
		for ( j = 0; j < n; j++){
			printf("%d", a[j][i]);
			if (j != n - 1) printf(" ");
		}
		if (i != n - 1) printf("\n");
	}
}
int main() {
	int n,a[10][10];
	scanf_s("%d", &n);
	input(a, n);
	out(a, n);
	return 0;
}

9.检验矩阵主对角线对称

题目描述:编写程序,判断任意给定nn的两维整型数组是否关于主对角线对称。
输入:第一行输入数组行数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>
void input(int a[10][10], int n) {
	int i, j;
	for ( i = 0; i < n; i++){
		for ( j = 0; j < n; j++)
			scanf_s("%d", &a[i][j]);
	}
}
int main() {
	int i, j, a[10][10], n;
	scanf_s("%d", &n);
	input(a, n);
	for ( i = 0; i < n; i++){
		for ( j = 0; j < n; j++){
			if (a[i][j]!=a[j][i]){
				printf("NO"); 
				exit(0);
			}
		}
	}
	printf("YES");
	return 0;
}

这里同样用了exit函数方便结束程序。

10.字符串反序

问题描述:编写程序,将给定的字符串反序输出。
输入:一个长度不超过255的字符串,字符串中可能含有空白字符。
输出:反序输出的字符串。
样例1:
输入 A 输出 A
样例2:
输入 123 45 输出 54 321

这道题目有两种方法
方法一
用字符型数组输入后再反序输出,这里我就放代码了,这种方法还是挺简单的
方法二

#include <stdio.h>
#include<string.h>
int main(){
    char a[256];
    int i;
    gets(a);
    printf("%s",strrev(a));
    return 0;
}

看起来更简单不是吗😄
这里用了strrev函数,将字符串逆置,在头文件stdlib.h中。

11.规则形式构建集合

题目描述:
设整数集合 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 insert(int x, int* p,int *r) {
    int* q;
    q = p;
    for (; q > r; q--){				//for循环用于检查是否有重复
        if (x == *q) return 1;
    }
    for (; *p > x; p--)				//直接将当前生成的数进行比较并插入集合中
        *(p + 1) = *p;
    *(p + 1) = x;
    return 0;
}
//主函数
int main() {
    int n,flag;
    scanf_s("%d", &n);
    int a[500] = { 1 };
    for (int i = 0, j = 0; i < 400; j++) {
        flag=insert(2 * a[j] + 1, &a[i++],a);	//flag用于判断是否有重复,
        										//若有重复函数返回值为1,i不增加。
        if (flag)i--;
        flag=insert(3 * a[j] + 1, &a[i++],a);
        if (flag)i--;
    }
    for (int i = 0; i < n; i++){
        printf("%d", a[i]);
    if (i != n - 1) printf(" ");
    }
    return 0;
}

题目中虽然要求最多用到前300项,可是生成过程中会出现后面元素生成的数比前面小的情况,所以需要生成多于300项来保证前300项正确。
这里我直接生成了400项

 for (int i = 0, j = 0; i < 400; j++)

12.约瑟夫问题(Josephus)

题目描述:
古代某法官要判决 n 个犯人死刑, 他有一条荒唐的逻辑, 将犯人首尾相接排成圆圈,所有计数从1开始; 然后从第 s 个人开始数, 每数到第 m 个犯人,则拉出来处决; 然后再数 m 个,数到的犯人再处决;… ; 但剩下的最后一个犯人可以赦免。编程序,给出处决顺序,并告知哪一个人活下来。
输入:三个正整数 n(≤1000),s和m,都可以使用int类型变量表示。
输出:依次输出被处决人员的编号,每个编号之间用一个西文空格间隔,最后一个编号后无字符。
样例:
输入:6 1 5
输出:5 4 6 2 3 1

#include<stdio.h>
//以下是判断函数,用于判断计数时需要跳过的死人
int judge(int a[], int n, int pointer) {
	while (a[pointer] == 0){ 
		pointer = pointer + 1;
		if (pointer > n) pointer = pointer % n;
	}
	return pointer;
}
//以下是输出函数,用于不断输出被杀死的人的序号
//flag标记第一个空格不输出,sum用于计数剩余人数,pointer用于指向当前的人
void out(int a[], int n, int s, int m) {
	int pointer = s - 1, sum = n, flag = 1,i;
	while(sum>=1){
		for ( i = 0; i < m; i++){
			pointer = pointer + 1;
			if (pointer > n) pointer = pointer % n; //判断pointer是否超过人数n,并使其重新归1构成环
			pointer = judge(a, n, pointer);
		}
		if (flag) flag = 0;
		else printf(" ");
		printf("%d", a[pointer]);
		a[pointer] = 0;			//人被杀死后赋值0标记死亡
		sum--;
	}
}
int main() {
	int a[1001],n,s,m;			//定义了一个数组,用数组中储存的0或1来判断人的死活
	scanf_s("%d%d%d", &n, &s, &m);
	int i;
	for ( i = 0; i <= n; i++) a[i] = i;		//为每个人赋值使其处于非0(活)状态
	out(a, n, s, m);
	return 0;
}

程序挺复杂的,这个题目可以去百度看一看,挺有帮助
https://baike.baidu.com/item/%E7%BA%A6%E7%91%9F%E5%A4%AB%E9%97%AE%E9%A2%98/3857719?fr=aladdin

13.英文翻译自然数

题目描述:按常规英文输出1000以内自然数的英文读法。
输入:每个测试输入包含 1 个测试用例,给出正整数 n(0<= n <1000)
输出:输出占一行:如果 0<= n <1000, 用规定的格式输出 n,所有英文单词小写,最后一个单词后无字符;否则输出ERR。
样例:
输入:123
输出:one hundred and twenty-three

#include<stdio.h>
#include<stdlib.h>
void judge(int n) {
	if (n < 0 || n>1000) {
		printf("ERR");
		exit(0);
	}
	else if (n == 0){ 
		printf("zero");
		exit(0);
	}
	else if (n==1000)
	{
		printf("one thousand");
		exit(0);
	}
 }
void out(int n) {
	int a, b, c,flag=0;
	c = n % 10;
	b =( n / 10 )% 10;
	a = n / 100;
	switch (a){
	case 0:break;
	case 1:printf("one hundred"); break;
	case 2:printf("two hundred"); break;
	case 3:printf("three hundred"); break;
	case 4:printf("four hundred"); break;
	case 5:printf("five hundred"); break;
	case 6:printf("six hundred"); break;
	case 7:printf("seven hundred"); break;
	case 8:printf("eight hundred"); break;
	case 9:printf("nine hundred"); break;
	}
	if (a!=0&&(b != 0||c!=0)) printf(" and ");
	switch (b){
	case 0:break;
	case 1:flag = 1; break;
	case 2:printf("twenty"); break;
	case 3:printf("thirty"); break;
	case 4:printf("forty"); break;
	case 5:printf("fifty"); break;
	case 6:printf("sixty"); break;
	case 7:printf("seventy"); break;
	case 8:printf("eighty"); break;
	case 9:printf("ninety"); break;
	}
	if (flag)
	{
		switch (c){
		case 0:printf("ten"); break;
		case 1:printf("eleven"); break;
		case 2:printf("twelve"); break;
		case 3:printf("thirteen"); break;
		case 4:printf("fourteen"); break;
		case 5:printf("fifteen"); break;
		case 6:printf("sixteen"); break;
		case 7:printf("seventeen"); break;
		case 8:printf("eighteen"); break;
		case 9:printf("nineteen"); break;
		}
	}
	else {
		if (b!=0&&c!=0)printf("-");
		switch (c){
		case 1:printf("one"); break;
		case 2:printf("two"); break;
		case 3:printf("three"); break;
		case 4:printf("four"); break;
		case 5:printf("five"); break;
		case 6:printf("six"); break;
		case 7:printf("seven"); break;
		case 8:printf("eight"); break;
		case 9:printf("nine"); break;
		}
	}
}
int main() {
	int n;
	scanf_s("%d", &n);
	judge(n);
	out(n);
	return 0;
}

问题不大,用switch就行了,不过判断有点麻烦。😅

  • 24
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值