XJTU_ 西安交通大学2020大学计算机作业-第十二周

XJTU_ 西安交通大学2020大学计算机作业-第十二周

XJTU_ 西安交通大学2020大学计算机作业-第十二周

注:所有题所有用例均已通过。

俺又更新了,还是求点星星👇
文章没上传到github,反正没人点星星:https://github.com/nobodyXX/XJTU_C_homework/blob/main/week7,如果这篇文章带给你了帮助或者灵感,欢迎给我点个星星,谢谢!!!

有老师把答案发在了github上,终于不用看咱这辣鸡的代码了https://github.com/AndrewChui/CHomeWork

第一题

编写一个程序,读入n个用户姓名和电话号码,按姓名的字典顺序排列后,输出用户的姓名和电话号码,n从键盘输入。

样例输入:
3
zhang 12345678
wang 23456789
liu 34567890
样例输出:
liu 34567890
wang 23456789
zhang 12345678

#include<stdio.h>
#include<string.h>
int main() {
	char list[26][30];
	int n;
	scanf("%d\n", &n);//千万记得有换行符
	for (int i = 0; i < n; i++) gets(list[i]);
	for (int i=0;i<n;i++)
		for (int j = 0; j < n-1-i; j++) {
			if (strcmp(list[j], list[j + 1])>0) {
				strcpy(list[25], list[j]);
				strcpy(list[j], list[j+1]);
				strcpy(list[j+1], list[25]);
			}
		}
	for (int i = 0; i < n; i++)
		(i == n - 1) ? printf("%s", list[i]) : printf("%s\n", list[i]);
	return 0;
}

第二题

有n名学生,每个学生的数据包括学号、姓名、三门课的成绩。可以从键盘输入n个学生的数据,按总成绩从小到大排序,打印包含学号、姓名、三门课成绩和总成绩的成绩单。(测试时,数据从键盘输入。)

输入:第1行为整数n,后面n行表示n个人的信息,包括学号、姓名、和三门课的成绩,每行的数据间用空格隔开。

输出:n行,表示n个人的信息,包括学号、姓名、三门课的成绩和总成绩,数据间一个空格,末尾无空格。

样例输入:
2
2004002 lisi 60 80 70
2004003 wangwu 85 92 87
样例输出:
2004002 lisi 60 80 70 210
2004003 wangwu 85 92 87 264

int main() {
	struct Student
	{
		char id[10];
		char name[20];
		int a[3];
		int sum;
	} stu[101];
	int n;
	scanf("%d\n", &n);//记得有换行符
	/*
	for (int i = 0; i < n; i++) {
		if(i==n-1)//最后一行没有空格!
			scanf("%s %s %d %d %d", stu[i].id, stu[i].name, &stu[i].a[0], &stu[i].a[1], &stu[i].a[2]);
		else
			scanf("%s %s %d %d %d\n", stu[i].id, stu[i].name, &stu[i].a[0], &stu[i].a[1], &stu[i].a[2]);
		stu[i].sum = stu[i].a[0] + stu[i].a[1] + stu[i].a[2];
	}
	*/
	//上面注释掉的代码是错误示范,输入不用考虑换行符,谢谢评论区好心人提醒。写成这样就行
	for (int i = 0; i < n; i++) 
			scanf("%s %s %d %d %d", stu[i].id, stu[i].name, &stu[i].a[0], &stu[i].a[1], &stu[i].a[2]);
	for (int i=0;i<n;i++)
		for (int j = 0; j < n - i - 1; j++) {
			if (stu[j].sum > stu[j + 1].sum) {
				stu[100] = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = stu[100];
			}
		}
	for (int i = 0; i < n; i++) {
		if(i==n-1)
			printf("%s %s %d %d %d %d", stu[i].id, stu[i].name, stu[i].a[0], stu[i].a[1], stu[i].a[2], stu[i].sum);
		else
			printf("%s %s %d %d %d %d\n", stu[i].id, stu[i].name, stu[i].a[0], stu[i].a[1], stu[i].a[2], stu[i].sum);

	}
	return 0;
}

第三题

"输入一个字符串(其长度不超过81),分别统计其中26个英文字母出现的次数(不区分大、小写字母),并按字母出现次数从高到低排序,若次数相同,按字母顺序排列。字母输出格式举例,例如:A-3,表示字母A出现3次,C-0表示字母C没有出现。

输入:

第一行为输入,占一行

输出:

第二行为输出,占一行。按照字母输出格式从高到低输出,各字母输出之间用一个空格字符分隔。

样例:

123abcAABXxwvUu+

A-3 B-2 U-2 X-2 C-1 V-1 W-1 D-0 E-0 F-0 G-0 H-0

样例输入:
ABCDEFGHIJKLMNOPQTSTUVWXYZ
样例输出:
T-2 A-1 B-1 C-1 D-1 E-1 F-1 G-1 H-1 I-1 J-1 K-1 L-1 M-1 N-1 O-1 P-1 Q-1 S-1 U-1 V-1 W-1 X-1 Y-1 Z-1 R-0

int main() {
	char a[200];
	int max=0, dir[26][2] = {
		{'A',0}, {'B',0}, {'C',0}, {'D',0}, {'E',0}, {'F',0},
		{'G',0}, {'H',0}, {'I',0}, {'J',0}, {'K',0}, {'L',0},
		{'M',0}, {'N',0}, {'O',0}, {'P',0}, {'Q',0}, {'R',0},
		{'S',0}, {'T',0}, {'U',0}, {'V',0}, {'W',0}, {'X',0},
		{'Y',0}, {'Z',0} };
	gets(a);
	for (int i = 0; a[i] != '\0'; i++) (a[i] >= 'a'&&a[i] <= 'z') ? a[i] = a[i] % 'a' + 'A' : 0;
	for (int i = 0; a[i] != 0; i++)
		for (int j = 0; j < 26; j++)
			if (a[i] == dir[j][0]) {
				dir[j][1]++;
				max = (dir[j][1] > max) ? dir[j][1] : max;
			}
	for (int i = 0, b = 0; max >= 0; i++, max--)//排序太麻烦了,不排了
		for (int j = 0; j < 26; j++)
			(dir[j][1] == max) ? ((b == 0) ? printf("%c-%d", dir[j][0], dir[j][1]),b++ :printf(" %c-%d", dir[j][0], dir[j][1])) : 0;
	return 0;
}

第四题

"输入只含小写字母的字符串,要求按字典序以从小到大的顺序输出,且输出的每个字符之间空1格。(字符串长度不超过20)

样例:

abazc

a a b c z

样例输入:
hello
样例输出:
e h l l o

int main() {
	char a[25];
	gets(a);
	for (int i = 'a', b = 0; i <= 'z'; i++)
		for (int j = 0; a[j] != '\0'; j++)
			if (a[j] == i)(b == 0) ? printf("%c", a[j]), b++ : printf(" %c", a[j]);
	return 0;
}

第五题

"有一个包含奇数个项的整数序列,请编程按照以下规则排序:

最大值排在中间,最小值排在最左,中值排在最右,其它值清为0。

输入2行,第一行n表示要输入的数的个数,n是奇数。第二行输入的n个数。

输出,排序后的数组,数据空格分隔,最后一个数据后面没有空格。

样例1:

输入

5

12 20 9 88 32

输出

9 0 88 0 20

样例2:

输入

3

66 10 30

输出

10 66 30

样例输入:
9
99 1 2 3 4 5 6 7 8
样例输出:
1 0 0 0 99 0 0 0 5

int main() {
	int a[101], n;
	scanf("%d\n", &n);
	for (int i = 0; i < n; i++) (i == 0) ? scanf("%d", &a[i]) : scanf(" %d",&a[i]);
	for(int i=0;i<n;i++)
		for(int j=0;j<n-i-1;j++)
			if (a[j] > a[j + 1]) {
				a[100] = a[j];
				a[j] = a[j + 1];
				a[j + 1] = a[100];
			}
	printf("%d", a[0]);
	for (int i = 1; i < n - 1; i++)(i == n / 2) ? printf(" %d", a[n-1]) : printf(" 0");
	printf(" %d", a[n/2]);
	return 0;
}

第六题

编写函数,函数原型如下:

void fun(int n,char res[]);

该函数的功能是将整数n的各位数字逆序排列,存放到res字符数组中。例如整数1035,逆序后为5301。

输入输出格式:

输入:一个整数(整数数位不超过15位)。

输出:逆序后的值。

样例输入:
123456
样例输出:
654321

#include<string.h>
void fun(int n, char res[]) {
	for (int i = n - 1; i >= -1; i--)printf("%c", res[i]);
}
int main() {
	int n;
	char a[20];
	gets(a);
	fun(strlen(a), a);
	return 0;
}

第七题

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

输入输出格式:

输入:一行数字(数字之间没有空格),这行数字的长度不大于1000。输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。

输出:分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。

样例输入:
0051231232050775
样例输出:
0 77 12312320

#include<math.h>
#include<string.h>
//yysy我觉得这道题写的不错
int main() {//这点儿排序题,每道题都要写一大堆,搞人心态
	char a[1000];
	gets(a);
	int b[501] = { 0 }, l = strlen(a), n = 1;//n计有效数字的个数
	for (int i = l-1,j=0,k=0; i>=0; i--) {//字符转数字
		if (a[i] == '5' && i!=l-1 && a[i+1]!='5') j = 0, k++, n++;
		//防止数个5连在一起,i=l-1的话不会判断a[l-1]
		else if(a[i]!='5')b[k] = b[k] + (a[i] - '0')*pow(10, j),j++;
	}
	n = (a[0] == '5') ? n - 1 : n;
	//n = (a[l - 1] == '5') ? n - 1 : n;//防止开头结尾是5
   //结尾不用判断,上个if语句n不会加一
	for (int i = 0; i < n; i++)
		for (int j = 0; j<n-i-1;j++)
			if (b[j] > b[j + 1]) {
				b[500] = b[j];
				b[j] = b[j + 1];
				b[j + 1] = b[500];
			}
	for (int i = 0; i < n; i++)(i == 0) ? printf("%d", b[i]) : printf(" %d", b[i]);
}

第八题

定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。

输入:5个单词

输出:最大和最小单词(按字典序)

样例输入:
this is a book end
样例输出:
max:this min:a

#include<string.h>
int main() {
	char a[6][20];
	for (int i = 0; i < 5; i++)(i == 0) ? scanf("%s", a[i]) : scanf(" %s", a[i]);
	for (int i=0;i<5;i++)
		for(int j=0;j<5-1-i;j++)
			if (strcmp(a[j], a[j + 1])>0) {
				strcpy(a[5], a[j]);
				strcpy(a[j], a[j+1]);
				strcpy(a[j+1], a[5]);
			}
	printf("max:%s min:%s", a[4], a[0]);
	return 0;
}

第九题

定义一个含20个元素的整型数组并初始化为a[20]={1,2,3,4,5,6,7,8,9,10}。另外定义一个大小为10的整型数组b。

要求:输入整数n(1<=n<=10),然后输入n个整数存入b中,再输入一个整数k(1<= k <=10),将数组b中的n个元素依次插入到数组a中从第k位开始的地方,插入完成后,输出数组a(元素间用空格隔开)。

输入:整数n,n个整数,整数k。

输出:数组a

样例输入:
3 13 14 15 4
样例输出:
1 2 3 4 13 14 15 5 6 7 8 9 10

int main() {
	int a[20] = { 1,2,3,4,5,6,7,8,9,10 }, b[10], k, n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)scanf(" %d", &b[i]);
	scanf(" %d", &k);
	for (int i = 0; i < 10; i++) {
		if(i==k)//偷了个懒没对a操作
			for(int j=0;j<n;j++) (k==0&&j==0)? printf("%d", b[j]) : printf(" %d", b[j]);
		(i == 0 && k!=0) ? printf("%d", i + 1) : printf(" %d", i + 1);
	}
	return 0;
}

第十题

编写冒泡排序函数,函数原型:void BubbleSort(int a[],int n);对n个整数升序排序。

编写选择排序函数,函数原型:void SelectionSort(int a[],int n);对n个整数降序排序。

编写main函数,输入10个整数,利用函数将其按升序和降序分别输出排序结果。(输入输出数据间用一个空格分隔)

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

void BubbleSort(int a[], int n) {
	for (int i=0;i<n;i++)
		for(int j=0, temp;j<n-i-1;j++)
			if(a[j]>a[j+1]){
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
	for (int i = 0; i < n; i++)(i == 0) ? printf("%d", a[i]) : printf(" %d", a[i]);
}
void SelectionSort(int a[], int n) {
	for (int i = 0; i < n; i++) {
		int max = i, temp;
		for (int j = i + 1; j < n; j++)
			if (a[j] > a[max]) max = j;
		temp = a[i];
		a[i] = a[max];
		a[max] = temp;
	}
	for (int i = 0; i < n; i++)
		printf(" %d", a[i]);
}
int main() {
	int a[10];
	for (int i = 0; i < 10; i++)(i == 0) ? scanf("%d", &a[i]) : scanf(" %d", &a[i]);
	BubbleSort(a, 10);
	SelectionSort(a, 10);
	return 0;
}

第十一题

输入一个英文字符串(长度<81)可能包含空格,删除其中所有非小写字母字符,并输出删除后的字符串(小写字母的相对位置保持不变)。

样例输入:
AaBbCc &d*e%
样例输出:
abcde

int main() {
	char a[100];
	gets(a);
	for (int i = 0; a[i] != '\0'; i++)(a[i] >= 'a'&&a[i] <= 'z') ? printf("%c", a[i]) : 0;
	return 0;
}

第十二题

查找一个字符在字符串中的第一个位置并输出这个位置。位置从0开始

输入输出格式:

输入:待查找的字符串和需要查找的字符,可能含有空格。(输入时,待查找的字符串与所需查找的字符用*号隔开)

“待查找字符串*需要查找的字符”

输出:字符的位置(如有多个相同的字符,只查找第一个,如果没有输出-1。)

样例输入:
fbhby Wml*W
样例输出:
6

#include<string.h>
int main() {
	char a[100];
	gets(a);
	int l = strlen(a), b=-1;
	for (int i = 0; a[i] != '*'; i++)
		if (a[i] == a[l - 1]) {
			b = i;
			break;
		}
	printf("%d", b);
	return 0;
}

第十三题

输入字母、数字和空格组成的字符串,提取字符串中的整数并输出,字符串中的非数字字符视为分割符。输出数据间以英文逗号分隔,末尾没有逗号。并换行输出其和值。若字符串中没有数据时,输出“NO”。输入的字符串长度不超过80。

输入格式:占一行,输入字符串。

输出格式:占两行。第一行:各数据间用一个英文逗号分隔,第二行:它们的和值。

样例输入:
1 2 3
样例输出:
1,2,3
6

#include<math.h>
#include<string.h>
int main() {
	char a[100];
	gets(a);
	int b[51] = {0}, l = strlen(a), n = 0, sum = 0;
	for (int i = l - 1, j = 0; i >= 0; i--) {
		if (a[i] >= '0'&&a[i] <= '9') b[n] = b[n] + (a[i] - '0')*pow(10, j), j++;
		else if (i != l-1 && a[i+1] >= '0' && a[i+1] <= '9')j = 0, n++;
	}
	n = (a[0] >= '0'&&a[0] <= '9') ? n + 1 : n;//防止开头不是0-9
	if (n == 0) {
		printf("NO");
		return 0;
	}
	for (int i = n - 1; i >= 0; i--) {
		if (n == 1) printf("%d\n", b[i]);//n=1专属
		else (i != 0) ? printf("%d,", b[i]) : printf("%d\n", b[i]);
		sum = sum + b[i];
	}
	printf("%d", sum);
	return 0;
}

第十四题

输入两个字符串s,t,按ASCII顺序输出在s或t中出现过(不区分大小写)的字符(全部转为大写输出),重复的字符只出现一次。如s=“meeting” 和t=" sayING", 则u=" AEGIMNSTY"。s,t长度不超过100。

输入:两个字符串中间用空格隔开

输出:结果字符串,按ASCII排序。

样例输入:
discussed security
样例输出:
CDEIRSTUY

int main() {
	char s[101], t[101];
	scanf("%s %s", s, t);
	for (int i = 'A'; i <= 'Z'; i++)
		for (int j = 0; s[j] != -52 || t[j] != -52; j++)
			if (s[j] == i || s[j] == i + 32 || t[j] == i || t[j] == i + 32) {
				printf("%c", i);
				break;
			}
	return 0;
}

第十五题

定义字符串数组str,其数组长度为81,键盘读入一个字符串(少于81个字符)。将该字符串中出现的所有小写字母按字母序升序输出(字母序为:abcdefg…xyz)。

输入输出格式要求:

输入输出各占一行,第一行是输入,第二行是输出。

样例输入:
Bcaf48c
样例输出:
accf

int main() {
	char a[81];
	gets(a);
	for (int i = 'a'; i <= 'z'; i++)
		for (int j = 0; a[j] != '\0'; j++)
			if (a[j] == i)printf("%c", a[j]);
	return 0;
}

第十六题

输入整数n和2n个整数,将序号为奇数的数从小到大排序,将序号为偶数的数从大到小排序。n不超过12。

输入:整数n和2n个整数。

输出:按要求的排序结果,数间以空格隔开。

样例输入:
2 4 3 8 2
样例输出:
4 3 8 2

int main() {
	int a[100], b[100], n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf(" %d", &a[i]);
		scanf(" %d", &b[i]);
	}
	for (int i = 0, temp; i < n; i++) {
		for (int j = 0, temp; j < n - i - 1; j++) {
			if (a[j] > a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
			if (b[j] < b[j + 1]) {
				temp = b[j];
				b[j] = b[j + 1];
				b[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < n; i++)(i == 0) ? printf("%d %d", a[i], b[i]) : printf(" %d %d", a[i], b[i]);
	return 0;
}

第十七题

输入n及n个正整数,对偶数从小到大排序,对奇数从大到小排序,输出从小到大的偶数,再输出从大到小的奇数,在一行中,用一个空格隔开。

输入:n及n个正整数,用空格隔开。

输出:输出从小到大的偶数,再输出从大到小的奇数,用一个空格隔开

样例输入:
7 78 47 49 54 58 9 52
样例输出:
52 54 58 78 49 47 9

int main() {
	int a[100], b[100], n, n1 = 0, n2 = 0;
	scanf("%d", &n);
	for (int i = 0, temp; i < n; i++) {
		scanf("%d", &temp);
		if (temp % 2 == 0)a[n1] = temp, n1++;
		else b[n2] = temp, n2++;
	}
	for (int i = 0; i < n1; i++) {
		for (int j = 0, temp; j < n1 - i - 1; j++) {
			if (a[j] > a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < n2; i++) {
		for (int j = 0, temp; j < n2 - i - 1; j++) {
			if (b[j] < b[j + 1]) {
				temp = b[j];
				b[j] = b[j + 1];
				b[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < n1; i++)(i == 0) ? printf("%d", a[i]) : printf(" %d", a[i]);
	for (int i = 0; i < n2; i++)(n1 == 0&&i==0) ? printf("%d", b[i]) : printf(" %d", b[i]);
	return 0;
}

第十八题

输入字符串(长度不超过200,不包含空格,至少有1个字符),除首尾字符外,将其余的字符按ascii码降序排列。

样例输入:
announced
样例输出:
auonnnecd

#include<string.h>
int main() {
	char a[201];
	gets(a);
	int l = strlen(a);
	for (int i=1;i<l-1;i++)
		for(int j=1, temp;j<l-i-1;j++)
			if (a[j] < a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
	puts(a);
	return 0;
}

第十九题

用户输入一个字符串,将字符串中的奇数位置上的字符按字母表中的顺序排序,仍按顺序保存在奇位置上。例如teacher,t,a,h,r排序后结果为a,h,r,t,则结果字符串为:aehcret。

输入格式:长度小于100的字符串,

输出:奇数位置的字符排序后的字符串

样例输入:
import
样例输出:
import

#include<string.h>
int main() {
	char a[101];
	gets(a);
	int l = strlen(a);
	for (int i = 0; i < l - 1; i = i + 2)
		for (int j = 0, temp; j < l - i - 2; j = j + 2)
			if (a[j] > a[j + 2]) {
				temp = a[j];
				a[j] = a[j + 2];
				a[j + 2] = temp;
			}
	puts(a);
	return 0;
}

都看到这儿了,点个星星呗https://github.com/nobodyXX/XJTU_C_homework/blob/main/week7

  • 41
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值