XJTU_ 西安交通大學2020大學計算機作業-第十二週

大白菜菜菜菜發表於2020-12-13

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++)
		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

相關文章