13.上机例题 2021 六月

//2021.6.24

int JosephusProblem(int n)  //题一
{
	assert(n <=1);
	int* arr = (int*)malloc(sizeof(int));
	assert(arr != nullptr);
	for(int i = 0;i < n;i++)
	{
		arr[i] = 1;
	}
	int count = 0;
	int sum = n;

	while (sum > 1)//存活人数大于一 继续叫号退出
	{
		for (int i = 0;i < n;i++)
		{
			if (arr[i] = 1)  //存活人数叫号 退出者不用叫号
			{
				count++;
				if (count == 3)
				{
					count = 0;  //退出后重新叫号
					sum--;  //存活人数减一
					arr[i] = 0;  //退出
				}
			}
		}
	}
	for (int i = 0;i < n;i++)  //遍历一遍数组 找到唯一存活者的下标
	{
		if (arr[i] == 1)
		{
			free(arr);
			return i;
		}
	}
	free(arr);
	return -1;
}
void StrCut(char* des, const char* src, int m)  //题二
{
	assert(des != nullptr && src != nullptr);
	if (des == nullptr || src == nullptr)
	{
		return;
	}
	int n = strlen(src);
	assert(m > 0 && m < n);
	if (m <= 0 || m >= n)
	{
		*des = '\0';  //若出错第一个字符将改为\0  并非必须加
		return;
	}

	m--;  //m如果传的是5 则从位置下标4的地方开始拷贝
	int i = 0;  //目标字符串des的开始下标
	while (m <= n)
	{
		des[i++] = src[m++];
	}

}
void StrSort(char* arr[10], int len)  //题三
{
	assert( arr != nullptr);
	int min = 0;
	for (int i = 0;i < len-1;i++)  //趟数 = 总体个数 - 1
	{
		min = i;
		for (int j = i + 1;j < len;j++)
		{
			if (strcmp(arr[min], arr[j]) > 0)
			{
				min = j;
			}
		}
		if (min != i)  //如果min不再指向待排序队列的第一个空间
		{
			char* tmp = arr[min];
			arr[min] = arr[i];
			arr[i] = tmp;
		}
	}
}
int GetNumCount(const char* str)//判断字符串中存在几个整数  //题四
{
	int count = 0;
	while (*str != '\0')
	{
		if (isdigit(*str) && !isdigit(*(str + 1)))
		{
			count++;
		}
		str++;
	}
	return count;
}
int* GetNumArrFromStr(const char* str, int* len)
{
	//assert
	*len = GetNumCount(str);//n 已经将str中整数的个数获取了
	int* arr = (int*)malloc(sizeof(int) * (*len));
	//assert

	int sum = 0;
	int i = 0;//数组arr的下标  从0开始
	while (*str != '\0')
	{
		while (isdigit(*str))//判断当前字符是否是一个数字
		{
			sum = sum * 10 + *str - '0';//将数字字符转换成数字并入到sum里
			str++;
		}

		if (sum != 0)//判断sum的值不为0   如果不为0 sum存放的才是有效值
		{
			arr[i] = sum;
			i++;
			sum = 0;
		}

		if (*str != '\0')//排除特殊情况, 最后一个字符是数字字符
		{
			str++;
		}
	}

	return arr;
}
int main()    //题一二三四主函数
{

	printf("幸存人的位置为%d\n", JosephusProblem(41));
	printf("幸存人的位置为%d\n", JosephusProblem(5));

	char str1[100];
	const char* str2 = "abcdefghi";
	StrCut(str1, str2, 3);
	printf("%s\n", str1);


	char* str3[10] = { "China", "Japan", "America",
		"Singapore", "England", "Canada",
		"Russia", "France", "Germany",
		"Egypt" };

	StrSort(str3, 10);

	for (int i = 0; i < 10; i++)
	{
		printf("%s ", str3[i]);
	}
	printf("\n");

	int len = 0;
	const char* str4 = "A123x456 17960? 302tab5876";

	int* brr = GetNumArrFromStr(str4, &len);

	printf("str4有%d个整数", len);

	for (int i = 0; i < len; i++)
	{
		printf("%d ", brr[i]);
	}
	printf("\n");
	return 0;
}

//2021.6.17 (6.6上机题讲解)

void Vowel(char* des, const char* src)  //题一
{
	assert(des != nullptr || src != nullptr);
	if (des == nullptr || src == nullptr)
		return;
	char* vowel = "aeiouAEIOU";
	int j = 0;
	while (*src != '\0')
	{
		for (int i = 0;i < 10;i++)
		{
			if (*src == vowel[i])
			{
				des[j++] = *src;
				break;
			}
		}
		src++;
	}
	des[j] = '\0';
}
char* MaxWords(const char* str)  //题二
{
	assert(str != nullptr);
	int len = strlen(str);
	char* curword = (char*)malloc(sizeof(char) * (len + 1));
	char* maxword = (char*)malloc(sizeof(char) * (len + 1));
	assert(curword != nullptr || maxword != nullptr);
	int cur = 0;
	int max = 0;
	while (*str != '\0')
	{
		if (isalpha(*str))
		{
			curword[cur++] = *str;
		}
		else
		{
			if (cur > max)
			{
				curword[cur] = '\0';
				strcpy_s(maxword, cur + 1, curword);
				max = cur;
				cur = 0;
			}
		}
		str++;
	}
	if (cur > max)
	{
		curword[cur] = '\0';
		strcpy_s(maxword, cur + 1, curword);
	}
	free(curword);
	return maxword;
}
void BubbleSort(int arr[], int len)  //题三(冒泡排序)
{
	assert(arr != nullptr);
	for (int i = 0;i < len - 1;i++)  //循环次数 记住减一次
	{
		for (int j = 0;j + 1 < len - i;j++)  //从头开始 j+1得合法 每次少判断一个
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int Lengeder(int n, int x) //题四
{
	assert(n < 0);
	if (n == 0)
	{
		return 1;
	}
	else if (n == 1)
	{
		return x;
	}
	else
	{
		return ((2 * n - 1) * x - Lengeder(n - 1, x) - (n - 1) * Lengeder(n - 2, x)) / n;
	}
}
void Move(int arr[], int n, int m)  //题五
{
	assert(n != 0);
	int* brr = (int*)malloc(sizeof(int) * m);
	assert(brr != nullptr);
	for (int i = 0;i < m;i++) //把后m个拷贝出来
	{
		brr[i] = arr[n - m + i];
	}
	for (int i = n - m - 1;i >= 0;i--) //把前面的向后挪动,把前面的空间空出来
	{
		arr[i + m] = arr[i];
	}
	for (int i = 0;i < m;i++)  //往空出来的空间里放值
	{
		arr[i] = brr[i];
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值