2019级吉林大学计软实验题目解析

本文相关题解仅供参考,请读者独立完成实验题目!

2019-2020 学年 第 1 学期

计算机科学与技术学院、软件学院 《程序设计基础》实验题目(2019 级补充)

考查时间:2019 年 12 月

一、

编写子函数,对于给定的二维整型数组,首先对每行从小到大排序,之后对每列从小到大排序(上述两步记为 1 轮);反复执行上述排序过程,直到没有变动为止。
注:作为实参的二维整型数组,每行元素个数、每列元素个数均在[4, 10]之间。 函数原型为:int msort(int a[][10], int m, int n) //m 表示行数、n 表示列数、函数返回执行的轮数。

算法的设计与分析:

本程序使用冒泡排序。先进行一次行排序,再进行一次列排序,每一个回合完成计数器加一。当所有元素排序结束后返回实际进行回合次数。

源代码:

#include
 
int msort(int a[][10],int m,int n){//m为行 n为列 
	int i,t,j,r;
	int flag;//标识是否进行变换 
	int cnt=0;
	while(flag){/*冒泡排序*/ 
		flag=0;
		for(i=0;i<m;i++)//i作为行 
		for(t=0;t<n-1;t++)
		for(j=t+1;j<n;j++)
			if(a[i][t]>a[i][j]){
				r=a[i][t];
				a[i][t]=a[i][j];
				a[i][j]=r;
				flag=1;
			}
		for(i=0;i<n;i++)//i作为列 
		for(t=0;t<m-1;t++)
		for(j=t+1;j<m;j++)
			if(a[t][i]>a[j][i]){
				r=a[j][i];
				a[j][i]=a[t][i];
				a[t][i]=r;
				flag=1;
			}
			cnt++;
		}
		return cnt-1;//由于最后一次检查肯定是空,实际执行次数应为cnt-1
	}

int main(){
	int a[100][10],i,j,m,n;
	scanf("%d%d",&m,&n);
	for(i=0;i<m;i++)
	for(j=0;j<n;j++)
	scanf("%d",&a[i][j]);
	printf("%d\n",msort(a,m,n));
	for(i=0;i<m;i++)
	for(j=0;j<n;j++)
	{
	 if(j!=n-1)printf("%d ",a[i][j]);
	 else printf("%d\n",a[i][j]);
}
	return 0;
}

测试用例:


Input: 4 4
2 1 3 5
4 9 7 8
10 9 2 4
6 3 9 5
Ouput: 1
1 2 3 5
2 4 6 9
3 5 8 9
4 7 9 10


Input:5 6
3 6 2 5 1 2
3 9 10 24 40 2
8 7 2 4 3 2
4 3 6 9 2 0
1 9 20 10 15 22
Output:1
0 2 2 3 5 6
1 2 3 4 6 8
1 2 3 4 7 9
2 3 9 10 20 22
2 9 10 15 24 40


Input:6 4
2 3 5 4
2 10 3 9
5 6 8 11
2 3 1 0
6 9 8 10
2 3 9 8
Output:1
0 1 2 3
2 3 4 5
2 3 8 9
2 3 8 10
5 6 9 10
6 8 9 11

其实正常用例应该多检测一下边界情况,但是输入10x10的元素实属麻烦,各位不厌其烦的尽量多试试几个样例。

二、

每个学生的信息卡片包括学号(满足标识符的要求)、姓名和成绩三项。定义存储学生信息的单向 链表的结点类型;编写函数,由文件 in.txt 依次读入 n(n≥0)个学生的信息,创建一个用于管理学生 信息的单向链表,并随时剔除学号不满足标识符要求的结点;编写函数,对该链表进行整理,保证该 单向链表的结点顺序满足学号从小到大的顺序,最后将整理后的链表信息存入文件 out.txt。

算法的设计与分析

链表的创建中声明了三个指针:head、p0、p,分别是指向链表头指针,查找插入位置指针,申请新节点指针。在输入元素过程中,按学号从小到大顺序插入,并保证每次循环进行一次链表中学号顺序正确。

源代码:

#include
#include 
struct stu{
	int code;
	char name[20];
	int grade;
	struct stu* next;
}; 
struct stu*create(){/*创建链表,并按要求顺序连接*/ 
    FILE *f1;
	f1=fopen("in.txt","r");
	if(f1==NULL){
		printf("Error!");
		exit(1);
	}
	struct stu*head,*p,*p0;//head为头指针,p为用于申请新节点,p0用于寻找插入位置 
	p0=(struct stu*)malloc(sizeof(struct stu));
	head=p0;
	head->next=NULL;
	while(!feof(f1)){
		p=(struct stu*)malloc(sizeof(struct stu));
		fscanf(f1,"%d",&p->code);
		fscanf(f1,"%s",p->name);
		fscanf(f1,"%d",&p->grade);
		if(p->code<=0)continue;//对不满足标识符要求的元素直接跳过录入 
		while(p0->next!=NULL&&p0->next->code<p->code)
		p0=p0->next;
		if(p0->next==NULL){//对应p1录入或者p0已查到最后一个元素两种情况
			p0->next=p;//正常接入链表最后一个元素 
			p->next=NULL;
		}
		else{//查到插入位置 
		p->next=p0->next;
		p0->next=p;
		}
		p0=head;
	}
	p=head;
	head=head->next;//修改头指针指向p1 
	free(p);//释放空间 
	fclose(f1);
	return head;
}
void output(struct stu*head)/*输出链表到文件*/ 
{
	FILE *f;
	struct stu *p=head;
	f=fopen("out.txt","w");
	while(p!=NULL){
		fprintf(f,"%d ",p->code);
		fprintf(f,"%s",p->name);
		fprintf(f," %d\n",p->grade);
		p=p->next;
	}
	fclose(f);
}
int main(){
	struct stu*head;
	head=create();
	output(head);
	return 0;
}

测试用例:

Input:
3 lzw 95
5 wzy 90
-2 shs 20
6 zzl 88
4 hzh 89
2 wdb 93
1 yqh 95
-1 lll 98
Ouput:
1 yqh 95
2 wdb 93
3 lzw 95
4 hzh 89
5 wzy 90
6 zzl 88


Input:
3 lzw 95
5 wzy 90
b shs 20
6 zzl 88
4 hzh 89
2 wdb 93
1 yqh 95
a lll 98
Ouput:
1 yqh 95
2 wdb 93
3 lzw 95
4 hzh 89
5 wzy 90
6 zzl 88


Input:
32 xck 100
57 wy 98
31 ll 23
18 wp 66
0 wy 90
Ouput:
18 wp 66
31 ll 23
32 xck 100
57 wy 98

你可能感兴趣的:(c语言)