XJTU大计基作业-第12周

//编写函数,去掉一个字符串中除头部和尾部空格外的所有空格,
//并编写主函数进行调用测试。
//
//输入:
//
//占一行(注:输入的字符串长度不会超过80)
//
//输出:
//
//占一行
//


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

void cut(char* string,int len)
{	
	int begin=0,count=0;
	char stringcut[80] = { '\0'};
	for (int i = 0; i < len; i++)
	{
		if (string[i] != ' ') begin = 1;
		if (string[i] == ' ' && begin == 1)continue;
		stringcut[count] = string[i];
		count++;
	}
	_strrev(string);
	for (int j = 0; string[j] == ' '; j++)
	{
		stringcut[count] = ' ';
		count++;
	}
	printf("%s", stringcut);
}
int main()
{
	char string[80];
	gets(string);
	int len = strlen(string);
	cut(string, len);
	return 0;
}
//传数组指针的时候注意类型!,这里是字符串数组类型为char非int!
//要验证数组最后的空格有没有删去,可以翻转再输出
//"写出正整数的三位分节格式。如,
//当用户输入82668634时,程序应该输出82,668,634。
//
//输入:正整数
//
//输出:三位分解格式。
//
//样例:
//
//82668634
//
//82, 668, 634


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

void divide(int n)
{	
	int count = 0,temp=0;
	char div[20]={'\0'};
	while (n)
	{	
		div[count] = n % 10 + '0';
		if (temp == 2&& n / 10 != 0)
		{
			count++;
			div[count] = ',';
			temp = 0;
		}
		else temp++;
		n /= 10;
		count++;
	}
	printf("%s", _strrev(div));
}

int main()
{	
	int n;
	scanf("%d", &n);
	divide(n);
	return 0;
}
//从个位开始取,最后利用strrev翻转字符串
//注意divide函数中当取到首位时后面不用再加逗号,因此要加一个验证条件n/10!=0
//当对字符串数组一个个赋值时,必须要初始化'\0'否则scanf无法正确输出!(当然用for就没问题)
//整形和字符运算后为整形,然后赋值给char类型,他是会自动转换的
//将字符串中奇数下标(从0开始)的字符顺序颠倒。如字符12345678,结果为18365472

//输入:字符串,不含空格。

//输出:结果字符串。


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

void strreverse(char* string,int len)
{	
	int count = 1, j = 0;
	char stringrev[20] = { '\0' };
	if (len % 2 == 0)
	{	
		for (int i = len - 1; i > 0 ; i -= 2,j += 2)
		{	
			stringrev[count - 1] = string[j];
			stringrev[count] = string[i];
			count+=2;
		}
	}
	else
	{	
		for (int i = len - 2; i > 0; i -= 2,j += 2)
		{	
			stringrev[count - 1] = string[j];
			stringrev[count] = string[i];
			count += 2;
		}
		stringrev[count-1] = string[j];
	}
	printf("%s", stringrev);
}

int main()
{	
	char string[20];
	scanf("%s", string);
	int len = strlen(string);
	strreverse(string, len);
	return 0;
}
//先判断个数奇偶
//同时将颠倒的和正常的赋值给新建数组(新建数组要初始化)
//若为奇数,还需多将数组赋值一次

//输入一个长度不超过 100 的字符串,
// 删除串中的重复字符。
//
//输入:
//
//输入要检查的字符串,长度不超过100个字符
// 。例如:abacaeedabcdcd。
//
//输出:
//
//删除重复字符后的字符串。例如:abced。


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

void strdel(char* string,int len)
{	
	int count = 0;
	for (int i = 0; i < len; i++)
	{	
		count = 0;
		for (int j = i-1; j >= 0; j--)
		{
			if (string[i] == string[j])
			{
				count = 1;
				break;
			}
		}
		if (count == 1)continue;
		else printf("%c", string[i]);
	}
}

int main()
{	
	char string[100];
	gets(string);
	int len = strlen(string);
	strdel(string, len);
	return 0;
}
//每遍历到一个字符都与前面的比较,若相同则遍历下一个
//编写程序,输入字符串到字符数组s中,再输入一个字符给变量c,判断s中是否有c,若有则将该字符从s 
//中删除后输出。若没有,则输出字符串“NotFound”。

//输入2行,1个字符串和1个字符:

//输出:删除后的字符串

//样例1:

//输入:

//smiles

//s

//输出:

//mile

//样例2:

//输入:

//smiles

//a

//输出:

//NotFound

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

void strfound(char* string,int len,char c)
{	
	char str[30] = { '\0' };
	int count = 0, temp = 0;
	for (int i = 0; i < len; i++)
	{	
		
		if (string[i] == c) count = 1;
		else
		{
			str[temp] = string[i];
			temp++;
		}
	}
	if (count == 0)printf("NotFound");
	else printf("%s", str);
}

int main()
{	
	char string[100],c;
	gets(string);
	scanf("%c", &c);
	int len = strlen(string);
	strfound(string,len,c);
	return 0;
}
//新建数组存放其他元素,当找到c后不存放进去,并用count记录

//"输入两个字符串,统计第2个字符串
// (至少含2字符)
// 在第1个字符串中出现的次数。
// 没有出现,次数为0.
//
//输入:两个字符串,以空格分隔。
//
//输出:出现次数,整数。

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

int strfound(char* string,int len,char* target,int len2)
{	
	int temp = 0;
	for (int i = 0; i < len; i++)
	{	
		if (string[i] == target[0])
		{	
			int count = 0;
			for (int j = 0,m = i; j < len2; j++,m++)
			{
				if (string[m] == target[j])count++;
			}
			if (count == len2)temp++;
		}
	}
	printf("%d", temp);
}

int main()
{	
	char string[40],target[10];
	scanf("%s", string);
	scanf("%s", target);
	int len = strlen(string);
	int len2 = strlen(target);
	strfound(string,len,target,len2);
	return 0;
}
//当第一数组某一元素与第二数组首元素相同时,遍历第二数组进行查找
//注意查找完后仍是从第一数组下一个开始遍历(保证重复的也要算进去)
//可以使用strstr函数
//"输入字符串,字符串中有若干星号*,
// 去掉字符串首尾的星号(*),
// 保留中间的星号。 字符串长度不大于200.
//
//输入:带有 * 号的字符串。
//
//输出:首尾不带 * 号的字符串。
//
//样例:
//
//* **street * *music * ***
//
//street * *music
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>	
#include<math.h>
#include<string.h>

void strdel(char* string,int len)
{	
	int i = 0,j,m=len-1;
	while (string[i] == '*')i++;
	while (string[m] == '*')m--;
	for (j = i; j < len; j++)
	{
		string[j - i] = string[j];
	}
	string[m - i + 1] = '\0';
	printf("%s", string);
}

int main()
{	
	char string[200];
	gets(string);
	int len = strlen(string);
	strdel(string,len);
	return 0;
}
//利用两次while循环找到首部星号个数i,和把m定位到最后一个非星号元素
//然后所有元素都向前移动i位,然后利用定位的m找到前移后最后一个非星号元素
//(错误)注意若前移后再定位的话令string[m+1]='\0'即可,因为后面的星号也前移了
//上面这种定位方法还是有问题,当最后面没有星号的时候,就失效了
//所谓孪生素数是指间隔为 2 的相邻素数,
// 例如最小的孪生素数是3和5, 5和7也是孪生数。
//
//编写程序,求给定区间[m, n]中的孪生数的数量
// 。例如[2, 10]中的孪生数有(3, 5)和(5, 7),
// 则[2, 10]中孪生数的数量为2.
//
//输入:正整数m, n, m, n > 1.
//
//输出:[m, n]中的孪生的数量
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>	
#include<math.h>
#include<string.h>

int findpris(int m,int n)
{	
	int count = 0;
	for (int i = m; i <= n - 2; i++)
	{	
		int j = i + 2;
		if (find(i) + find(j) == 0)count++;
	}
	return count;
}

int find(int x)
{
	for (int i = 2; i <= x - 1; i++)
	{
		if (x % i == 0) return 1;
	}
	return 0;
}

int main()
{	
	int m, n;
	scanf("%d%d", &m, &n);
	printf("%d",findpris(m, n));
	return 0;
}
//利用find函数找素数
//利用findpris函数找相邻的素数
//注意i的范围要小于n-2 因为i还要+2
//从键盘输入一个32位的二进制形式的IP地址,
// 将其转换为点分十进制的表示,
// 如果输入的字符串中含有1和0以外的字符,
// 则输出“该字符串不是正确的IP地址”。
//
//输入:0、1二进制序列,不会超过32位,
// 位数不足时程序自动在前面补0.
//
//输出:点分IP地址。
//

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

int jugde(char* ip,int len)
{	
	for (int i = 0; i < len; i++)
	{
		if (ip[i] != '0' && ip[i] != '1') return 0;
	}
	return 1;
}

void zeroChange(char* ip, int len)
{
	if (len != 32)
	{
		for (int i = len - 1; i >= 0; i--)
		{
			ip[i + 32 - len] = ip[i];
		}
		for (int i = 0; i < 32 - len; i++)
		{
			ip[i] = '0';
		}
	}
}

void pointChange(char* ip, int len)
{	
	int sum = 0,flag = 0;
	if (jugde(ip, len) == 0)printf("该字符串不是正确的IP地址");
	else
	{
		zeroChange(ip, len);
		for (int i = 0; i < 32; i++)
		{
			sum = base * sum + ip[i] - '0';
			if (i % 8 == 7)
			{
				flag == 0 ? printf("%d", sum) : printf(".%d", sum);
				flag++;
				sum = 0;
			}
		}
	}
}

int main()
{	
	char str_ip[33] = { '\0' };
	scanf("%s", str_ip);
	int len = strlen(str_ip);
	pointChange(str_ip,len);
	return 0;
}
//这里编写了三个函数和一个宏,judge函数判断是否合法,zeroChange用于补0,pointChange用于点分转换
//judge判断不合法时返回0,zeroChange先后移缺少的位数,再补0,ip数组必须初始化'\0'否则后移后没有终止符
//点分转换时,类比十进制相加,进行转换(关键),当遍历到某些位数时就输出,并将sum置0
//在医院打点滴(吊针)的时候,如果滴起来有规律,
// 先是滴一滴,停一下;然后滴二滴,停一下;
// 再滴三滴,停一下...,现在有一个问题:
// 这瓶盐水一共有v毫升,每一滴是d毫升,
// 每一滴的速度是一秒(假设最后一滴不到d毫升
// ,则花费的时间也算一秒),停一下的时间也是一秒
// ,这瓶水什么时候能滴完呢?(0 < d < v < 6000)
//	输入:一滴是多少毫升和一瓶盐水有多少毫升,
// 中间用空格隔开.
//	输出:滴完需要多少时间.

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

int main()
{	
	int time=0;
	double d,v;
	scanf("%lf %lf", &d, &v);
	for (int i = 1;; i++)
	{
		if (d * i < v)
		{
			time += i * 1 + Stay;
			v -= d * i;
		}
		else if (d * i == v)
		{
			time += i * 1;
			break;
		}
		else
		{
			if (v == 0)break;
			else
			{
				time += ceil(v / d) * 1;
				break;
			}
		}
	}
	printf("%d", time);
	return 0;
}
//fmod为浮点数取模(求余),ceil为向上取整,floor向下取整,针对浮点数进行
//注意当刚好滴完时没有停留时间,因此d * i == v单独算一种情况

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值