XJTU大计基例题分享(第13周)

个人水平有限,只是分享一下自己的思路和做法,希望大家多评判指正

1.

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

样例:

输入:

3

zhang 122

wang 233

li 567

输出:

li 567

wang 233

zhang 122

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct Phonelist//定义结构体
{
	char name[30];
	char num[20];
}P;
void sort(P* phone, int n);//声明函数

int main()
{
	int n;
	P phone[100];
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%s%s", &phone[i].name, &phone[i].num);
	}
	sort(phone, n);
	for (int i = 0; i < n; i++)
	{
		printf("%s %s\n", phone[i].name, phone[i].num);//按格式输出
	}
	return 0;
}

void sort(P* phone, int n)//冒泡排列,从小到大
{
	for (int i = 0; i < n; i++)
	{
		for (int j = n - 1; j > i; j--)
		{
			if (strcmp(phone[j].name, phone[j - 1].name) < 0)//后面的name比前面小则交换位置
			{
				P temp = phone[j];//temp暂存数据
				phone[j] = phone[j - 1];
				phone[j - 1] = temp;
			}
		}
	}
}

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef struct Data//定义结构体
{
	char studentnumber[8];
	char name[30];
	int score1;
	int score2;
	int score3;
	int totalscore;
}D;
void sort(D* st, int n);//声明函数
int main()
{
	int n;
	D stu[100];
	scanf("%d", &n);
	for (int i = 0; i < n; i++)//输入
	{
		scanf("%s%s%d%d%d", &stu[i].studentnumber, &stu[i].name, &stu[i].score1, &stu[i].score2, &stu[i].score3);
		stu[i].totalscore = stu[i].score1 + stu[i].score2 + stu[i].score3;
	}
	sort(stu, n);
	for (int i = 0; i < n; i++)//输出
	{
		printf("%s %s %d %d %d %d\n", stu[i].studentnumber, stu[i].name, stu[i].score1, stu[i].score2, stu[i].score3, stu[i].totalscore);
	}
	return 0;
}
void sort(D* st, int n)//冒泡排序
{
	for (int i = 0; i < n; i++)
	{
		for (int j = n - 1; j > i; j--)
		{
			if (st[j].totalscore < st[j-1].totalscore)
			{
				D temp = st[j];
				st[j] = st[j - 1];
				st[j - 1] = temp;
			}
		}
	}
}

3.

编写一个程序,从键盘上读入一个数字串,把数字转化为对应的小写英语数字单词输出。例如:输入234,输出two three four。

输入:一串数字

输出:用空格隔开英文数字单词(英文字母都是小写)。

样例:

234

two three four

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	const char word[][20] = { "zero","one","two","three","four","five","six","seven","eight","nine" };//定义二维字符串常量
	char instr[100];
	scanf("%s", instr);
	printf("%s", word[instr[0] - '0']);
	for (int i = 1; i < strlen(instr); i++)
	{
		printf(" %s", word[instr[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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

typedef struct data//定义结构体
{
	char zimu;
	int t;
}D;
void Bubblesort(D* count);
int main()
{
	D count[26];
	for (int i = 0; i < 26; i++)//初始化
	{
		count[i].zimu = 'A' + i;//结构体数组下标与字母对应
		count[i].t = 0;
	}
	char instr[82];
	gets(instr);
	_strupr(instr);//转换成大写
	for (int i = 0; i < strlen(instr); i++)
	{
		if (instr[i] >= 'A' && instr[i] <= 'Z')
		{
			count[instr[i] - 'A'].t++;
		}
	}
	Bubblesort(count);//冒泡排列
	for (int i = 0;i < 25;i++)
	{
		printf("%c-%d ", count[i].zimu, count[i].t);
	}
	printf("%c-%d\n", count[25].zimu, count[25].t);

	return 0;
}
void Bubblesort(D* count)
{
	for (int i = 0; i < 26; i++)
	{
		for (int j = 25; j>i; j--)
		{
			if (count[j].t > count[j - 1].t)
			{
				D temp = count[j];
				count[j] = count[j - 1];
				count[j - 1] = temp;
			}
		}
	}
}

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int* Bubblesort(int* a, int n);

int main()
{
	int n;
	scanf("%d", &n);
	int a[100] = { 0 };

	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	Bubblesort(a, n);
	int max = a[0];//依次赋值
	int min = a[n - 1];
	int middle = a[(n - 1) / 2];
	for (int i = 0; i < n-1; i++)//清0输出
	{
		if (i == 0)
			a[i] = min;

		else if (i == (n - 1) / 2)
			a[i] = max;
		else
			a[i] = 0;
		
		printf("%d ", a[i]);
	}
	printf("%d\n", middle);
	return 0;
}
int* Bubblesort(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;
			}
		}
	}
}

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
double fun(int a[], int n, int* max, int* min);
int main()
{
	int n;
	scanf("%d", &n);
	int input[100];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &input[i]);
	}
	int max;
	int min;
	double average = fun(input, n, &max, &min);
	printf("%d %d %.6lf", max, min, average);
	return 0;
}
double fun(int a[], int n, int* max, int* min)//将max,min的地址传递到函数
{
	double sum = 0;
	*max = *min = a[0];//修改地址内的数据
	for (int i = 0; i < n; i++)
	{
		sum += a[i];
		if (a[i] > *max)
			*max = a[i];
		if (*min > a[i])
			*min = a[i];
	}
	return sum / n;
}

7.

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

样例:

输入:A# 7b

输出:b

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str[81];
	gets(str);//有空格用gets
	for (int i = 0; str[i]; i++)
	{
		if (str[i] < 'a' || str[i]>'z')
		{
			for (int j = i; str[j]; j++)
				str[j] = str[j + 1];//用后面的数据覆盖前面,即删除一位
			i--;//再检查一遍a[i]确保是小写字母
		}

	}
	printf("%s\n", str);
	return 0;
}

8.

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

输入:

占一行

输出:

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

样例:

输入:aaa bbb aaa ###

输出:aaa-2 bbb-1

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct words//根据题目要求建结构体,word+个数
{
	char word[20];
	int count;
}W;
int main()
{
	W input[100];
	int n = 0;
	char instr[20];
	scanf("%s", instr);
	while (strcmp(instr, "###"))//当为###时退出循环
	{
		int flag = 0;//标志是否为新的word
		for (int i = 0; i < n; i++)//寻找并判断是否为新的word
		{
			if (strcmp(instr, input[i].word) == 0)
			{
				input[i].count++;
				flag = 1;//不是新的word,改变标识

				break;
			}
		}
		if (flag == 0)//若是新的
		{
			strcpy(input[n].word, instr);
			input[n++].count = 1;
		}
		scanf("%s", instr);//再次输入
	}
	for (int i = 0; i < n - 1; i++)
	{
		printf("%s-%d ", input[i].word, input[i].count);
	}
	printf("%s-%d\n", input[n - 1].word, input[n - 1].count);
	
	return 0;
}

9.

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

输入输出格式要求:

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

样例:

输入:AaBbCc

输出:abc

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void Bubblesort(char* lower, int j);

int main()
{
	char str[81];
	scanf("%s", str);
	char lower[81];//存放小写字母
	int i = 0;
	int j = 0;
	for (i; str[i]; i++)
	{
		if (str[i] <= 'z' && str[i]>='a')
		{
			lower[j++] = str[i];
		}
	}
	Bubblesort(lower, j);//冒泡排序
	lower[j] = '\0';
	printf("%s\n",lower);
	return 0;
 }
void Bubblesort(char* lower,int j)
{
	for (int i = 0; i < j; i++)
	{
		for (int k = j - 1; k > i; k--)
		{
			if (lower[k] < lower[k - 1])
			{
				char temp;
				temp = lower[k];
				lower[k] = lower[k - 1];
				lower[k - 1] = temp;

			}
		}
	}
}

10.

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

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

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

样例:

输入:good

输出:good

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4267)

#include<stdio.h>
#include<string.h>

int main()
{
	char inStr[200] = { 0 };
	(void)scanf("%s", inStr);
	int len = strlen(inStr);
	len = len % 2 == 0 ? len - 1 : len;
	for (int i = 0; i < len; i += 2)
	{
		for (int j = len - 1; j > i; j -= 2)
		{
			if (inStr[j] < inStr[j - 2])
			{
				int temp = inStr[j];
				inStr[j] = inStr[j - 2];
				inStr[j - 2] = temp;
			}
		}
	}
	printf("%s", inStr);
	return 0;
}

(这个是我copy崔舒宁老师的代码,老师写的代码很简洁,有很多值得我们学习的地方)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值