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