编程61-70

61.输出用户姓名和电话号码

编写一个程序,读入 n 个用户姓名和电话号码,按姓名的字典顺序排列后,输出用户的姓名和电
话号码, n 从键盘输入。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct Numlist {
	char name[50];
	char num[50];//不能用int,因为空间不够
}Numlist;
int main() {
	Numlist numlist[100];
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%s%s", numlist[i].name, numlist[i].num);
	}
	for (int i = 0; i < n; i++) {
		for (int j = n - 1; j > i; j--) {
			if (strcmp(numlist[j].name, numlist[j - 1].name) < 0) {
				Numlist temp;
				temp=numlist[j];
				numlist[j]=numlist[j - 1];
				numlist[j - 1]=temp;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		printf("%s %s\n", numlist[i].name, numlist[i].num);
	}
	return 0;
}

小知识:创建 结构体变量 的语句们

方法一

struct book {
   char title[50];
   char author[50];
   float value;
};

这里,语句最后的分号不能少。

方法二

struct book {
   char title[MAXTITL];
   char author[MAXAUTL];
   float value;
} a={"math","ergexwz",100.00};

方法三

typedef struct Book {
   char title[MAXTITL];
   char author[MAXAUTL];
   float value;
}Book;

这里,将结构体变量重命名

62.统计大学生成绩

n 名学生,每个学生的数据包含学号、姓名、三门课的成绩。可以从键盘输入 n 个学生的数据,
按总成绩从小到大排序,打印包含学号、姓名、三门课成绩和总成绩的成绩单。(测试时,数据
从键盘输入。)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef struct Gradelist {
	char id[20];
	char name[20];
	int course1;
	int course2;
	int course3;
	int total;
}Gradelist;
int main() {
	int n;
	scanf("%d", &n);
	Gradelist glist[30];
	for (int i = 0; i < n; i++) {
		scanf("%s%s%d%d%d", glist[i].id, glist[i].name, //这里成员是数组不要&
		&glist[i].course1, &glist[i].course2, &glist[i].course3);
		glist[i].total = glist[i].course1 + glist[i].course2 + glist[i].course3;
	}
	for (int i = 0; i < n; i++) {
		for (int j = n - 1; j > i; j--) {
			if (glist[j].total < glist[j - 1].total) {
				Gradelist temp = glist[j];
				glist[j] = glist[j - 1];
				glist[j - 1] = temp;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		printf("%s %s %d %d %d %d\n",
		glist[i].id, glist[i].name, glist[i].course1,
		glist[i].course2, glist[i].course3, glist[i].total);
	}
	return 0;
}

63.输出数字英文单词

编写一个程序,从键盘上读入一个数字串,把数字转化为对应的小写英语数字单词输出。例如:
输入 234 ,输出 two three four
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main(){
	char word[][20] = { "zero", "one", "two", "three",
	"four", "five", "six", "seven", "eight", "nine" };
	char input[50];
	scanf("%s", input);
	printf("%s", word[input[0] - '0']);
	for (int i = 1; i < strlen(input); i++) {
		printf(" %s", word[input[i] - '0']);
	}//字符的ASCII码减0的ASCII码即得对应数字
	return 0;
}

64.统计字母出现次数

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

方法一:利用二维数组

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char input[99];
	scanf("%s", input);
	int list[26][2];
	for (int i = 0; i < 26; i++) {
		list[i][0] = i;
		list[i][1] = 0;
	}
	_strupr(input);
	for (int i = 0; i < strlen(input); i++) {
		if (input[i] >= 'A' && input[i] <= 'Z') {
			list[input[i] - 'A'][1]++;
		}
	}
	for (int i = 0; i < 26; i++) {
		for (int j = 25; j > i; j--) {
			if (list[j][1] > list[j - 1][1]) {
				int temp0 = list[j][0];
				list[j][0] = list[j - 1][0];
				list[j - 1][0] = temp0;
				int temp1 = list[j][1];
				list[j][1] = list[j - 1][1];
				list[j - 1][1] = temp1;
			}
		}
	}
	for (int i = 0; i < 26; i++) {
		(i == 0) ? printf("%c-%d", 'A' + list[i][0], list[i][1]) : 
			printf(" %c-%d", 'A' + list[i][0], list[i][1]);
	}
	return 0;
}

命名二维数组的另一种方式

int count[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} };

带空格输出的一种方式:

int cnt=0;
printf("%s%c-%d",cnt++?" ":"",i+'A',max);

方法二:利用结构体

gets_s和gets的区别:

在于gets不会限制输入的数量,所以容易出错,而gets_s在输入时就限制了长度,比较安全

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct _count
{
	char alphabet;
	int c;
} Count;
void BubbleAlpha(Count count[]);
int main()
{
	Count count[26];
	for (int i = 0; i < 26; i++){
		count[i].alphabet = 'A' + i;
		count[i].c = 0;
	}
	char input[100];
	gets_s(input, 100);
	/*gets_s和gets的区别在于gets不会限制输入的数量,所以容易出错,而gets_s在输入时
	久限制了长度,比较安全*/
	_strupr(input); //转为大写字母
	int i = 0;
	while (input[i]){
		if (input[i] >= 'A' && input[i] <= 'Z'){
			count[input[i] - 'A'].c++;
		}
		i++;
	}
	BubbleAlpha(count);
	printf("%c-%d", count[0].alphabet, count[0].c);
	for (int i = 1; i < 26; i++){
		printf(" %c-%d", count[i].alphabet, count[i].c);
	}
	return 0;
}
void BubbleAlpha(Count* count)
{
	for (int i = 0; i < 26; i++)//经典排序双循环
	{
		for (int j = 25; j > i; j--)
		{
			if (count[j].c > count[j - 1].c)
			{
				Count temp = count[j];
				count[j] = count[j - 1];
				count[j - 1] = temp;
			}
		}
	}
}

65.输出特定整数序列

编写程序,有一个包含奇数个项的整数序列,按照以下规则进行排序:
最大值排在中间,最小值排在最左,中值排在最右,其它值清为 0
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void Bubble(int a[], int n);//冒泡排序
int main(){
	int a[100] = { 0 }, n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	Bubble(a, n);
	int min = a[0];
	int mid = a[n / 2];
	int max = a[n - 1];
	printf("%d", a[0]);
	for (int i = 1; i < n; i++){
		if (i == n / 2){
			a[i] = max;
		}
		else if (i == n - 1){
			a[i] = mid;
		}
		else{
			a[i] = 0;
		}
		printf(" %d", a[i]);
	}
	/*或者:
	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 Bubble(int a[], int n){
	for (int i = 0; i < n; i++){
		for (int j = n - 1; j > i; j--){
			if (a[j] < a[j - 1]){
				int temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;
			}
		}
	}
}

66.编写函数

编写函数,求有 n 个元素的一维数组中的最大值和最小值,并返回数组元素的平均值,函数原形
如下:
double fun(int a[],int n,int max,int min);
输入:输入 n+1 个数,各个数之间用空格分隔。第一个数为数组元素的个数 n
输出: 3 个数字。第一个数字为数组中的最大元素值,第二个数字为数组中的最小元素值,第三
个数字为数组元素的平均值(保留小数点后 6 位有效数字 ) 3 个数之间用空格分开。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
double fun(int a[], int n, int* max, int* min) {
	for (int i = 0; i < n; i++) {
		for (int j = n - 1; j > i; j--) {
			if (a[j] < a[j - 1]) {
				int temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;
			}
		}
	}
	max = a + n - 1;
	min = a;
	double sum = 0;
	for (int i = 0; i < n; i++) {
		sum += a[i];
	}
	printf("%d %d ", *max, *min);
	return sum / n;
}
int main(){
	int n;
	scanf("%d", &n);
	int a[100];
	for (int i = 0; i < n; i++) {
		scanf("%d", a + i);
	}
	printf("%.6lf", fun(a, n, a[1], a[1]));
	return 0;
}

67.输出小写字母

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

方法一:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char a[82];
	gets_s(a, 82);
	int len = strlen(a);
	for (int i = 0; i < len; i++) {
		if (a[i] >= 'a' && a[i] <= 'z') {
		}
		else {
			for (int j = i; j < len; j++) {
				a[j] = a[j + 1];
			}
			len--; i--;
		}
	}
	printf("%s", a);
	return 0;
}

方法二:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
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;
}

68.统计单词数目

输入一系列英文单词,单词之间用空格隔开(一到多个空格),用 “###” 表示输入结束,统计输入
过哪些单词以及各单词出现的次数,统计时区分大小写字母。本题假定:不重复的单词数不超过
100 个;每个单词长度限制在 20 以内。
注意:C语言中,字符串不能作逻辑运算。如:
char x[100][20];
scanf("%s", &x[0]);
if(x[0] == "###"){//这一就出错了!!
   <语句1>;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct _wordcount {
	char word[20];
	int nble;
}wordcount;
int main() {
	char x[100][20];
	scanf("%s", &x[0]);
	int num = 0;
	for (int i = 1; strcmp(x[i - 1], "###"); i++) {
		num++;
		scanf("%s", &x[i]);
	}
	wordcount wcount[100];
	for (int i = 0; i < 100; i++)wcount[i].nble = 0;
	strcpy(wcount[0].word, x[0]); int n = 1; wcount[0].nble++;
	for (int i = 1; i < num; i++) {
		int flag = 1;
		for (int j = 0; j < n; j++) {
			if (strcmp(x[i], wcount[j].word) == 0) {//the same
				wcount[j].nble++;
				flag = 0;
			}
		}
		if (flag) {
			strcpy(wcount[n].word, x[i]);
			wcount[n].nble++;
			n++;
		}
	}
	int cnt = 0;
	for (int i = 0; i < n; i++) {
		printf("%s%s-%d", (cnt++) ? " " : "", wcount[i].word, wcount[i].nble);
	}
	return 0;
}

69.升序输出所有小写字母

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

方法一:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void Bubble(char a[]) {
	for (int i = 0; i < strlen(a); i++) {
		for (int j = strlen(a) - 1; j > i; j--) {
			if (a[j] < a[j - 1]) {
				char temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;
			}
		}
	}
}
int main() {
	char x[82];
	scanf("%s", x);
	char a[82]; int num = 0;
	for (int i = 0; i < strlen(x); i++) {
		if (x[i] >= 'a' && x[i] <= 'z') {
			a[num] = x[i];
			num++;
		}
	}		
	a[num] = '\0';
	Bubble(a);
	printf("%s", a);
	return 0;
}

方法二:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
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;
}

70.字符串奇数位排序

用户输入一个字符串,将字符串中的奇数位置上的字符按字母表中的顺序排序,仍按顺序保存在
奇位置上,其他字母位置不变。例如 teacher t,a,h,r 排序后结果为 a,h,r,t ,则结果字符串为:
aehcret
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void Bubble(char a[]) {
	for (int i = 0; i < strlen(a); i++) {
		for (int j = strlen(a) - 1; j > i; j--) {
			if (a[j] < a[j - 1]) {
				char temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;
			}
		}
	}
}
int main() {
	char x[100];
	scanf("%s", x);
	char a[100] = {0};//直接将所有字符变为空字符,方便后序调用函数strlen(a)
	for (int i = 0; i < strlen(x); i += 2) {
		a[i / 2] = x[i];
	}
	Bubble(a);
	for (int i = 0; i < strlen(x); i++) {
		printf("%c", (i % 2) ? x[i] : a[i / 2]);
	}
	return 0;
}

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值