XJTU大计基作业第13周

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

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


int main()
{	
	int n, flag = 0;
	typedef struct phone_number
	{
		char last_name[10];
		char number[12];
	}Phone;
	Phone a[10], temp;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%s%s", a[i].last_name,a[i].number);
	}
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (strcmp(a[j].last_name, a[j + 1].last_name) > 0)
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{	
		if (flag)printf("\n");
		printf("%s %s", a[i].last_name, a[i].number);
		flag++;
	}
	return 0;
}
//第一个思路就是构造二维数组,将每个人的信息区分开
//不过更推荐使用结构体(可以将不同类型的数据存放在一起)
//首先要定义结构体数据类型,再用类型去声明变量
//strcmp可以理解为ascii码相减得到返回值
//输出结构体类型的变量只能访问到成员变量输出,不可将结构体变量作为整体输出
//有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>	
#include<math.h>
#include<string.h>


int main()
{	
	int n, flag = 0;
	typedef struct Student
	{
		char number[10];
		char name[10];
		int scores[4];
	}Student;
	Student student[15];
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{	
		student[i].scores[3] = 0;
		scanf("%s%s", student[i].number, student[i].name);
		for (int j = 0; j < 3; j++)
		{
			scanf("%d", &student[i].scores[j]);
			student[i].scores[3] += student[i].scores[j];
		}
	}
	for (int i = 0; i < n - 1; i++)
	{	
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (student[j].scores[3] > student[j+1].scores[3])
			{
				Student temp = student[j];
				student[j] = student[j + 1];
				student[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		if (flag)printf("\n");
		printf("%s %s", student[i].number, student[i].name);
		for (int j = 0; j < 4; j++)
		{
			printf(" %d", student[i].scores[j]);
		}
		flag++;
	}
	return 0;
}
//计算总成绩前记得初始化!
//成绩要进行计算,所以最好用整形数组(需要一个个赋值),即使字符串数组输入更方便
//注意输出格式
//注意比较成绩后交换结构体,需要构造结构体变量作为中间变量
//有n名学生,每个学生的数据包含学号、姓名、
// 三门课的成绩。可以从键盘输入n个学生的数据
// ,按总成绩从小到大排序,打印包含学号、姓名
 、三门课成绩和总成绩的成绩单。
//编写一个程序,从键盘上读入一个数字串,
// 把数字转化为对应的小写英语数字单词输出。
// 例如:输入234,输出two three four。
//
//输入:一串数字
//
//输出:用空格隔开英文数字单词(英文字母都是小写)
// 。
//
//样例:
//
//234
//
//two three four
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>	
#include<math.h>
#include<string.h>


int main()
{	
	char num[50];
	scanf("%s", num);
	int len = strlen(num), flag = 0;
	for (int i = 0; i < len; i++)
	{
		if (flag)printf(" ");
		switch (num[i])
		{
		case '0':printf("zero"); break;
		case '1':printf("one"); break;
		case '2':printf("two"); break;
		case '3':printf("three"); break;
		case '4':printf("four"); break;
		case '5':printf("five"); break;
		case '6':printf("six"); break;
		case '7':printf("seven"); break;
		case '8':printf("eight"); break;
		case '9':printf("nine"); 
		}
		flag++;
	}
	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
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>	
#include<math.h>
#include<string.h>

void findmax(int* count)
{	
	int max = count[0], maxsub = 0, flag = 0;
	for (int j = 0; j < 26; j++)
	{
		for (int i = 1; i < 26; i++)
		{
			if (max < count[i])
			{
				max = count[i];
				maxsub = i;
			}
		}
		if (flag)printf(" ");
		printf("%c-%d", maxsub + 'A', count[maxsub]);
		count[maxsub] = -1;
		max = count[0];
		maxsub = 0;
		flag++;
	}
}

int main()
{	
	char letters[81];
	gets(letters);
	int len = strlen(letters);
	int count[26] = { 0 }, temp = 0, flag = 0;
	for (char i = 'A'; i <= 'Z'; i++, temp++)
	{	
		for (int j = 0; j < len; j++)
		{
			if (letters[j] == i || letters[j] == i - 'A' + 'a')
			{
				count[temp]++;
			}
		}
	}
	findmax(count);
	return 0;
}
//刚开始想用冒泡排序将出现的次数最多的排到最前面并最先冒泡(从最后开始比)
//但发现很难取到对应的字母(除非用结构体将字母和出现次数进行关联)
//这里采用了直接找次数最多并输出(下标与字母关联),然后置为-1(不能是0,这样会比较字母顺序)
//注意每次输出后最大下标,最大次数都要重设为初始值,如果设为其他值,第一个就没法比较
//最大下标不设为初始值0就会出现如果没有进入到if就会再输出原来的
//编写程序,有一个包含奇数个项的整数序列,
// 按照以下规则进行排序:
//
//最大值排在中间,最小值排在最左,中值排在最右,
// 其它值清为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>	
#include<math.h>
#include<string.h>

void sort(int* num,int n,int* change)
{	
	int max = num[0], min = num[0], middle = num[0];
	for (int i = 0; i < n; i++)
	{	
		int count = 0;
		if (max < num[i])  max = num[i];
		if (min > num[i])  min = num[i];
		for (int j = 0; j < n; j++)
		{
			if (num[i] > num[j])count++;
		}
		if (count == (n - 1) / 2)middle = num[i];
	}
	change[n / 2] = max;
	change[0] = min;
	change[n - 1] = middle;
}

int main()
{	
	int n, num[21], flag = 0, change[21] = { 0 };
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &num[i]);
	}
	sort(num,n,change);
	for (int i = 0; i < n; i++)
	{	
		if (flag)printf(" ");
		printf("%d",change[i]);
		flag++;
	}
	
	return 0;
}
//gets不能用于整形数组
//这题用冒泡排序会好一些(可能会有重复的)
//这里传入了一个全为0的数组对应的指针用于修改
//编写函数,求有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>	
#include<math.h>
#include<string.h>

double fun(int* a,int n,int* max,int* min)
{	
	*max = a[0],*min=a[0];
	double temp = 0, aver;
	for (int i = 0; i < n; i++)
	{	
		temp += a[i];
		if (*max < a[i]) *max = a[i];
		if (*min > a[i]) *min = a[i];
	}
	aver = temp / n;
	return aver;
}

int main()
{		
	int m, d;
	int* max = &m, *min = &d;
	int a[20] = { 0 }, n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	double k = fun(a, n, max, min);
	printf("%d %d %lf", m, d, k);
	return 0;
}
//定义指针的时候*是跟着指针名的,如上方的*min
//相当于还是定义的整数,只不过max是其地址罢了
//指针要初始化才能使用,必须要声明指针对应的变量,然后把变量的地址给指针
// m = *max只是把max指向的变量的值给m,并没有实现m和max的绑定,当改变max指向的变量的值时与m无关
//正确的做法是int* max = &m,这样m的地址是始终不变,始终为max
//输入一个英文字符串(长度<81)可能包含空格,删除其中所有非小写字母的字符,并输出删除后的字符串 //(小写字母的相对位置保持不变)。

//样例:

//输入:A# 7b

//输出:b

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

void strdel(char *string,int len)
{	
	int count = 0;
	char change[81] = { '\0' };
	for (int i = 0; i < len; i++)
	{
		if (string[i] >= 'a' && string[i]<='z')
		{
			change[count] = string[i];
			count++;
		}
	}
	printf("%s", change);
}

int main()
{		
	char string[81];
	gets(string);
	int len = strlen(string);
	strdel(string,len);
	return 0;
}
//输入一系列英文单词,单词之间用空格隔开(一到多个空格),用“###”表示输入结束,统计输入过哪些单词以及各单词出现的次数,统计时区分大小写字母。本题假定:不重复的单词数不超过100个;每个单词长度限制在20以内。
//
//输入:
//
//占一行
//
//输出:
//
//占一行,其格式为:单词1 - 个数 单词2 - 个数 …(单词与个数中间用减号连接,各输出组之间用一个空格分隔,单词依照出现的先后次序统计)
//
//
//
//样例:
//
//输入:aaa bbb aaa ###
//
//输出:aaa - 2 bbb - 1

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

int main()
{
	char word[150] = { 0 }, temp[21] = { 0 };
	int len = 0, flag = 0;
	gets(word);
	for (int j = 0; word[j] != '#'; j++)
	{
		int m = 0;
		if (word[j] != ' ')
		{
			temp[len] = word[j];
			len++;
		}
		else
		{
			int count = 0;
			if (temp[0] == 0)continue;
			while (strstr(word, temp) != NULL)
			{
				char* k = strstr(word, temp);
				count++;
				for (; *k != ' '; k++) *k = ' ';
			}
			if (flag)printf(" ");
			printf("%s-%d", temp, count);
			flag++;
			while (temp[m] != 0)
			{
				temp[m] = 0;
				m++;
			}
			len = 0;
		}
	}
	return 0;
}
//直接gets所有输入到word数组中
//构造一个数组来存放每个单词,每取出一个单词在word中查找,查找完后对与该单词相同的单词置为' ',temp,len也置0
//置' '后继续遍历下一个单词,注意这时候当temp为0直接进行下一次循环,否则程序会卡住
//当遍历到'#'终止程序

//定义字符串数组str,其数组长度为81,键盘读入一个字符串(少于81个字符)。将该字符串中出现的所

//有小写字母按字母序升序输出(字母序为:abcdefg…xyz)。

//输入输出格式要求:

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

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


void riser(char* strlow, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (strlow[j] > strlow[j + 1])
			{
				char temp = strlow[j + 1];
				strlow[j + 1] = strlow[j];
				strlow[j] = temp;
			}
		}
	}
	printf("%s", strlow);
}


void strlower(char* str, int len)
{	
	char strlow[81] = { 0 };
	int count = 0;
	for (int i = 0; i < len; i++)
	{
		if (str[i] >= 'a' && str[i] <= 'z')
		{
			strlow[count] = str[i];
			count++;
		}
	}
	riser(strlow,count);
}



int main()
{
	char string[81];
	gets(string);
	int len = strlen(string);
	strlower(string, len);
	return 0;
}
//strlower用于取出所有小写字母
//riser采用冒泡排序
//注意strlower调用riser,不能先定义strlower,也可先定义,再初始化
//用户输入一个字符串,将字符串中的奇数位置上的字符按
// 字母表中的顺序排序
// ,仍按顺序保存在奇位置上,其他字母位置不变。
// 例如teacher,t, a, h, r排序后结果为a, h, r, t,
// 则结果字符串为:aehcret。
//
//输入格式:长度小于100的字符串,
//
//输出:奇数位置的字符排序后的字符串

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





void strodd(char* string, int len)
{	
	char str[100] = { 0 };
	int count = 0;
	for (int i = 0; i < len - 1; i+=2)
	{
		for (int j = 0; j < len - 1 - i; j += 2)
		{
			if (string[j] > string[j + 2]&&j + 2< len)
			{
				char temp = string[j + 2];
				string[j + 2] = string[j];
				string[j] = temp;
			}
		}
	}
	printf("%s", string);
}



int main()
{
	char string[81];
	gets(string);
	int len = strlen(string);
	strodd(string, len);
	return 0;
}
//仿照一般的冒泡排序即可,自增改为+=2
//并且限制j+2<len 否则可能会把终止符交换到最前面

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xjtu计组第六章作业主要涉及计算机组成原理的相关概念和知识点。这一章节主要包括存储器的层次结构、存储器的组织和管理、存储器的屏蔽、存储器的操作和传输等内容。 首先,存储器的层次结构是计算机中非常重要的一个组成部分。它包括寄存器、高速缓存、主存和辅助存储器等。每一层的存储器容量和速度不同,寄存器最小而速度最快,辅助存储器容量最大但速度最慢。 其次,存储器的组织和管理也是我们需要了解的内容。存储器的组织有两种方式,分别是按地址方式和按内容方式组织。在存储器的管理中,我们需要学习如何管理地址空间、如何进行地址转换和管理内存映射等。 另外,存储器的屏蔽是实现存储器的一种方式。比如,在32位计算机中,通过屏蔽将地址划分为子地址、块地址和字地址,以实现对存储器的访问。 最后,我们还需要了解存储器的操作和传输。存储器的操作包括读取数据和写入数据两个过程,而存储器的传输是指数据在存储器之间的传输。我们需要学习存储器的读写操作的过程、存储器传输的方式以及优化存储器传输的方法。 总的来说,xjtu计组第六章作业涵盖的内容较为广泛,包括存储器的层次结构、组织和管理、屏蔽以及操作和传输等方面。通过完成这份作业,我们可以更好地理解和掌握计算机组成原理这门课程的核心概念和知识。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值