2021年西交大计基题目解析(第12周)

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

样例:

输入:

3

张 122

王 233

李 567

输出:

李 567

王 233

张 122

#include<stdio.h>
#include<string.h>
struct person {
	char name[20];
	char phonenumber[40];
};
int main() {
	struct person men[200];
	int num;
	scanf("%d", &num);
	for (int i = 0; i < num; i++) {
		scanf("%s", men[i].name);
		scanf("%s", men[i].phonenumber);
	}
	//排序
	struct person temp;
	for (int i = 0; i < num - 1; i++) {
		for (int j = 0; j < num-1-i; j++) {
			if (strcmp(men[j].name, men[j+1].name) > 0) {
				temp = men[j];
				men[j] = men[j+1];
				men[j+1] = temp;
			}
		}
	}for (int i = 0; i < num; i++) {
		printf("%s %s\n", men[i].name, men[i].phonenumber);
	}
	return 0;
}

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

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

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

样例:

输入:

2

2021001 li 60 80 70

2021002 wang 100 90 80

输出:

2021001 li 60 70 80 210

2021002 wang 100 90 80 270

#include<stdio.h>
#include<string.h>
struct person {
	char xuehao[20];
	char name[20];
	int a, b, c;
	int sum;
};
int main() {
	struct person men[200];
	int num;
	scanf("%d", &num);
	for (int i = 0; i < num; i++) {
		scanf("%s %s", men[i].xuehao, men[i].name);
		scanf("%d %d %d", &men[i].a, &men[i].b, &men[i].c);
		men[i].sum = men[i].a + men[i].b + men[i].c;
	}
	//排序
	struct person temp;
	for (int i = 0; i < num - 1; i++) {
		for (int j = 0; j < num-1-i; j++) {
			if (men[j].sum-men[j+1].sum > 0) {
				temp = men[j];
				men[j] = men[j+1];
				men[j+1] = temp;
			}
		}
	}for (int i = 0; i < num; i++) {
		printf("%s %s ", men[i].xuehao,men[i].name);
		printf("%d %d %d %d\n", men[i].a, men[i].b, men[i].c, men[i].sum);
	}
	return 0;
}

3.编写一个程序,从键盘上读入一个数字串,把数字转化为对应的小写英语数字单词输出。例如:输入234,输出two three four。 输入:一串数字 输出:用空格隔开英文数字单词(英文字母都是小写)。 样例: 234 two three four

#include<stdio.h>
#include<string.h>
int main() {
	char English[10][10] = { "zero","one","two","three","four","five","six","seven","eight","nine" };
	char num[10];
	scanf("%s", num);
	for (int i = 0; i < strlen(num); i++) {
		if (i == 0)
			printf("%s", English[num[i]-'0']);
		else
			printf(" %s", English[num[i]-'0']);
	}
	return 0;
}

4.输入一个字符串(其长度不超过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 I-0 J-0 K-0 L-0 M-0
N-0 O-0 P-0 Q-0 R-0 S-0 T-0 Y-0 Z-0

#include<stdio.h>
#include<string.h>
int main() {
	int arr[128] = { 0 };
	char a[100];
	gets(a);
	for (int i = 0; i < strlen(a); i++) {
		if (65 <= a[i] && a[i] <= 90) {
			arr[a[i]]++;
		}
		else if (97 <= a[i] && a[i] <= 122) {
			arr[a[i] - 32]++;
		}
	}int max ;
	for (int i = 65; i <= 90; i++) {
		max = 65;
		for (int j = 65; j <= 90; j++) {
			if (arr[max] < arr[j]) {
				max = j;
			}
		}
		if (max > 0) {
			if (i == 65) 
				printf("%c-%d", max, arr[max]);
			else 
			printf(" %c-%d", max, arr[max]);
			arr[max] = -1;
		}
	}
	return 0;
}

5.编写程序,有一个包含奇数个项的整数序列,按照以下规则进行排序:

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

输入为2行:第一行n表示要输入的是整数序列的项数,n是奇数。第二行输入的是n个整数序列。

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

样例1:

输入

3

66 10 30

输出

10 66 30

样例2:

输入

5

12 20 9 88 32

输出

9 0 88 0 20

#include<stdio.h>
int main() {
	int arr[100];
	int i, j, len, temp;
	scanf("%d", &len);
	for (i = 0; i < len; i++) {
		scanf("%d", &arr[i]);
	}
	for (i = 0; i < len; i++) {
		for (j = 0; j < len - 1 - i; j++) {
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	for (i = 0; i < len; i++) {
		if (i == 0)
			printf("%d", arr[i]);
		else if (i == len / 2)
			printf(" %d", arr[len - 1]);
		else if (i == len - 1)
			printf(" %d", arr[len / 2]);
		else
		    printf(" 0");
	}
	return 0;
}

6.编写函数,求有n个元素的一维数组中的最大值和最小值,并返回数组元素的平均值,函数原形如下:

double fun(int a[],int n,int *max,int *min);

输入输出格式:

输入:输入n+1个数,各个数之间用空格分隔。第一个数为数组元素的个数n。

输出:3个数字。第一个数字为数组中的最大元素值,第二个数字为数组中的最小元素值,第三个数字为数组元素的平均值(保留小数点后6位有效数字)。3个数之间用空格分开。

样例:

输入:3 1 5 9

输出:9 1 5.000000

#include<stdio.h>
double fun(int arr[], int len) {
	double sum = 0;
	int temp;
	for (int i = 0; i < len; i++) {
		for (int j = 0; j < len - 1 - i; j++) {
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
  for (int i = 0; i < len; i++) {
  sum+=arr[i];
  }
	printf("%d %d ", arr[len - 1], arr[0]);
	return sum / len;
}
int main() {
	int arr[200];
	int len;
	scanf("%d", &len);
	for (int i = 0; i < len; i++) {
		scanf("%d", &arr[i]);
	}
	printf("%lf", fun(arr, len));
	return 0;
}

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

样例:

输入:A# 7b

输出:b

#include<stdio.h>
#include<string.h>
int main() {
	char a[100];
	gets(a);
	for (int i = 0; i < strlen(a); i++) {
		if (a[i] >= 97 && a[i] <= 122)
			printf("%c", a[i]);
	}
	return 0;
}

8.输入一系列英文单词,单词之间用空格隔开(一到多个空格),用“###”表示输入结束,统计输入过哪些单词以及各单词出现的次数,统计时区分大小写字母。本题假定:不重复的单词数不超过100个;每个单词长度限制在20以内。

输入:

占一行

输出:

占一行,其格式为:单词1-个数 单词2-个数 …(单词与个数中间用减号连接,各输出组之间用一个空格分隔,单词依照出现的先后次序统计)

样例:

输入:aaa bbb aaa ###

输出:aaa-2 bbb-1

#include<stdio.h>
#include<string.h>
int main() {
	char a[100][20];
	int n = 0;
	while (scanf("%s", a[n])) {
		if (strcmp(a[n],"###")==0)
			break;
		n++;
	}
	for (int i = 0; i < n; i++) {
			int k = 0;
		if (strcmp(a[i],"***")!=0) {
			for (int j = i+1; j < n; j++) {
				if (a[j] != "***" && strcmp(a[i], a[j]) == 0) {
					k++;
					strcpy(a[j], "***");
				}
			}
			if (i == 0)
				printf("%s-%d", a[i],k + 1);
			else
				printf(" %s-%d",a[i], k + 1);
		}
	}
	return 0;
}

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

输入输出格式要求:

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

样例:

输入:AaBbCc

输出:abc

#include<stdio.h>
#include<string.h>
int main() {
	char str[81];
	int	a[26] = {0};
	gets(str);
	for (int i = 0; i < strlen(str); i++) {
		if (str[i] >= 97 && str[i] <= 122) {
			a[str[i] - 'a']++;
		}
	}
	for (int i = 0; i < 26; i++) {
		if (a[i] != 0) {
			for (int j = 0; j < a[i]; j++) {
				printf("%c", i + 'a');
			}
		}
	}
	return 0;
}

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

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

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

样例:

输入:good

输出:good

#include<stdio.h>
#include<string.h>
int main() {
	char a[100];
	int temp;
	gets(a);
	for (int i = 0; i < strlen(a); i+=2) {
		for (int j = 0; j < strlen(a) - 1 - i; j+=2) {
			if (a[j] > a[j + 2]&&j+2<strlen(a)) {
				temp = a[j];
				a[j] = a[j + 2];
				a[j + 2] = temp;
			}
		}
	}
	puts(a);
	return 0;
}
  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值