2021-05-20

C语言OJ题—xjtu大计基作业第十二周

推荐一本书:《算法笔记》 作者胡凡(看完常见的编程题完全乱杀)

第一题:编写一个程序,读入n个用户姓名和电话号码,
按姓名的字典顺序排列后,
输出用户的姓名和电话号码,n从键盘输入。
样例:输入:3
张 122
王 233
李 567
输出:
李 567
王 233
张 122

#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++)
    { 
     if(i == n - 1) 
       printf("%s", list[i]) ;
       else
         printf("%s\n", list[i]);
    }
	return 0;
}
/*有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 std 
{
	char num[20];
	char name[20];
	int g1;
	int g2;
	int g3;
	int grades;
};
int main()
{
	int n,i,j;
	struct std t;
	scanf("%d", &n);
	struct std a[100];
	for (i = 0;i < n;i++)scanf("%s %s %d %d %d",a[i].num, a[i].name,&a[i].g1,&a[i].g2,&a[i].g3);
	for (i = 0;i < n;i++)a[i].grades = a[i].g1 + a[i].g2 + a[i].g3;
	for (i = 0;i < n - 1;i++)
		for (j = i + 1;j < n;j++)
			if (a[i].grades>a[j].grades)
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
	for (i = 0;i < n;i++)
	printf("%s %s %d %d %d %d\n", a[i].num, a[i].name, a[i].g1, a[i].g2, a[i].g3,a[i].grades);
	return 0;
}
/*编写一个程序,从键盘上读入一个数字串,把数字转化为对应的小写英语数字单词输出。例如:输入234,输出two three four。
输入:一串数字
输出:用空格隔开英文数字单词(英文字母都是小写)。
样例:
234
two three four*/
#include<stdio.h>
int main() 
{
	char a[10][10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}, b[40];
	int n;
	gets(b);
	for (int i = 0; b[i] != '\0'; i++)
		(i==0)?printf("%s", a[b[i] - '0']): printf(" %s", a[b[i] - '0']);
	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 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() {
	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;
}
/*编写程序,有一个包含奇数个项的整数序列,按照以下规则进行排序:
最大值排在中间,最小值排在最左,中值排在最右,其它值清为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 sz[100] = {0};
	int n;
	scanf("%d", &n);
	int temp;
	int d = (n - 1) / 2;
	for (int i = 0; i <= n - 1; i++)
	{
		scanf("%d",&sz[i]);
	}
	for (int i = 0; i <= n - 1; i++)
		for (int j = 0; j <= n - 2; j++)
		{
			if (sz[j] > sz[j + 1])
			{
				temp = sz[j];
				sz[j] = sz[j + 1];
				sz[j + 1] = temp;
			}
		}
	temp = sz[d];
	for (int i = 0; i<=n-1; i++)
	{
		if (i == 0)
		{
			continue;
		}
		else if(i==d)
		{
			sz[i] = sz[n - 1];
		}
		else if (i==n-1)
		{
			sz[i] = temp;
		}
		else
		{
			sz[i] = 0;
		}
	}
	for (int i = 0; i <= n - 2; i++)
	{
		printf("%d ", sz[i]);
	}
	printf("%d", sz[n-1]);
	return 0;
}
/*编写函数,求有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>
#include<math.h>
#include<string.h>
double fun()
{
    int n;
    scanf("%d", &n);
    int* sz;
   sz = (int*)(malloc(n * sizeof(int)));
   for (int i = 0; i < n; i++)
   {
       scanf_s("%d", &sz[i]);
   }
   int max = sz[0], min = sz[0];
       float sum = 0;
   float average = 0;
	for (int i = 0; i <n; i++)
	{
		sum = sum + sz[i];
		if (sz[i] >= max)
		{
			max = sz[i];
		}
		else if (sz[i] <= min)
		{
			min = sz[i];
		}
	}
	average = sum / (float)n;
    printf("%d %d %.6lf", max,min,average);
}
int main()
{
    fun();
	return 0;
}
/*输入一个英文字符串(长度<81)可能包含空格,删除其中所有非小写字母的字符,并输出删除后的字符串(小写字母的相对位置保持不变)。
样例:
输入:A# 7b
输出:b
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void dele(char* str)
    {
        char* p = str;
        while (*str)
        {
            if (*str>='a'&&*str<='z')
                *p++ = *str;
            str++;
        }
        *p = '\0';
    }
int main()
{
	char sz[81];
	gets(sz);
    dele(sz);
    puts(sz);
	return 0;
}
/*输入一系列英文单词,单词之间用空格隔开(一到多个空格),用“###”表示输入结束,统计输入过哪些单词以及各单词出现的次数,统计时区分大小写字母。本题假定:不重复的单词数不超过100个;每个单词长度限制在20以内。
输入:
占一行
输出:
占一行,其格式为:单词1-个数 单词2-个数 …(单词与个数中间用减号连接,各输出组之间用一个空格分隔,单词依照出现的先后次序统计)
样例:
输入:aaa bbb aaa ###
输出:aaa-2 bbb-1
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
struct MyStruct
{
	char word[22];
	int times;
}a[2020];
int check(char *d, char *b)
{
	if (strlen(d) != strlen(b)) return 0;
	int k = strlen(d);
	for (int w = 0; w < k; w++)
	{
		if (d[w] != b[w]) return 0;
	}
	return 1;
}
int main()
{
	char s[1010];
	int i = 0;
	do
	{
		scanf("%s", s);
		if (s[0] == '#' && s[1] == '#' && s[2] == '#' && s[3] == '\0') break;
		int k = 0;
		for (int j = 0; j < i; j++)
		{
			if (check(a[j].word, s))
			{
				a[j].times++;
				k = 1;
				break;
			}
		}
		if (k == 0)
		{
			strcpy(a[i].word, s);
			a[i].times = 1;
			i++;
		}
	} while (1);
	for (int j = 0; j < i-1; j++)
	{
		printf("%s-%d ", a[j].word, a[j].times);
	}
	printf("%s-%d", a[i-1].word, a[i-1].times);
	return 0;
}
/*定义字符串数组str,其数组长度为81,键盘读入一个字符串(少于81个字符)。将该字符串中出现的所有小写字母按字母序升序输出(字母序为:abcdefg…xyz)。
输入输出格式要求:
输入输出各占一行,第一行是输入,第二行是输出。
样例:
输入:AaBbCc
输出:abc*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void dele(char* sz)
{
    char* p = sz;
    while (*sz)
    {
        if (*sz >= 'a' && *sz<= 'z')
            *p++ = *sz;
        sz++;
    }
    *p = '\0';
}
void sort(char* sz)
{
    int len = strlen(sz),temp;
    for(int i = 0; i <= len-1;i++)
        for (int j = 0; j <= len-2; j++)
            if (sz[j] > sz[j + 1])
            {
                temp = sz[j];
                sz[j] = sz[j + 1];
                sz[j + 1] = temp;
            }
}
int main()
{
	char sz[81];
    gets(sz);
    dele(sz);
    sort(sz);
	puts(sz);
}
/*用户输入一个字符串,将字符串中的奇数位置上的字符按字母表中的顺序排序,仍按顺序保存在奇位置上,其他字母位置不变。例如teacher,t,a,h,r排序后结果为a,h,r,t,则结果字符串为:aehcret。
输入格式:长度小于100的字符串,
输出:奇数位置的字符排序后的字符串
样例:
输入:good
输出:good*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char sz1[100] = {0};
	gets(sz1);
//	puts(sz1);
	char sz[100] = {0};
	int temp;
	int len = strlen(sz1);
	//printf("%d\n", len);
	int j = 0;
	for (int i = 0; i <= len; i = i + 2)
	{
		sz[j] = sz1[i];
		j++;
	}
	//sz[j] = '\0';
	//puts(sz);
	int len1 = strlen(sz);
	for (int i = 0; i < len1; i++)
		for (int j = 0; j < len1 - 1; j++)
			if (sz[j] > sz[j + 1])
			{
				temp = sz[j];
				sz[j] = sz[j + 1];
				sz[j + 1] = temp;
			}
	int k = 0;
	for (int i = 0; i <= len; i = i + 2)
	{
		sz1[i] = sz[k];
		k++;
	}
	puts(sz1);
}

参考,交流,相互学习。
(今天代码能力被好朋友肯定啦,高兴了许久,连夜更新。)

  • 35
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树杰同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值