C语言循环与分支

一、本文概述

又经过一周多的的学习,已经学习完循环与分支,是时候总结一下了。说到总结,制作思维导图十个好方法。于是我立即打开思维导图软件制作循环分支的维导图,发现这个东西越用越好用,只需要确定主体,生成文本框;然后点分支,生成文本框;在确定分支中的分支,生成文本框······。只需要重复这个内容,思维导图的框架就简简单单的完成了。再重复这个过程中我猛然发现这玩意我自己是不是可以弄个,重复分支这不就是循环与分支。接下来我将以分享我制作简易的思维导图的全过程来总结C语言的循环与分支。

二、整体思路

想要写一个程序,首先要明白它能够实现怎样的功能。所以先说我希望我的程序的功能,在每个分支下能够打印2~3个分支。至于怎么实现,我们先看一下我想要实现的内容。

现阶段用循环分支的知识实现上述内容,只能依靠在屏幕上打印这一操作,而打印是一行一行打印的,所以上述打印顺序因该是,switch语句,分支语句,if语句,C语言循环与分支,for循环,循环语句 && while循环,do while语句。要实现这一操作,我想的是将其分成三个部分。

按每个部分的内容先储存,然后在按上述顺序打印,接下来看具体过程。

三、具体过程

先对第一个部分进行处理,写下如下代码;

void sca(char* bar1)
{
	scanf("%s", bar1);
}


int main()
{
	int a = 0;
	int i,c = 0;
	char bra1[1000] = { 0 };
	int b[100] = {0};
	//输入需要储存多少最小分支
	printf("请输入分支个数:\n");
	scanf("%d", &a);
	//储存分支内容
	for (i = 0; i < a; i++)
	{
		b[i] = c;
		printf("请输入第%i个分支内容\n", i + 1);
		while (1)
		{
			sca(&bra1[c]);
			break;
		}
		c = strlen(bra1);//确定每次在数组bar1中输入的起始坐标
	}

	return 0;
}

这里借用了一点函数与数组的知识,基本思路是,利用创建char类型的数组,将输入的字符串内容以字符的形式储存在数组bra1当中,将每个字符串的起始下标储存在b当中。上述操作就将部分1当中的分支内容存到了数组bra1当中。同样的操作我们可以创建bar2,bar3,分别存入部分2与部分三当中。在这里为了代码的简洁性与可读性,可以将储存部分的代码封装成一个函数。具体操作如下:

void sca(char* bra)
{
	scanf("%s", bra);
}
void store(char* bra,int* x)
{
	int a = 0;
	int i, c = 0;
	//输入需要储存多少最小分支
	printf("请输入分支个数:\n");
	scanf("%d", &a);
	//储存分支内容
	x[0] = 0;
	for (i = 0; i < a; i++)
	{
		printf("请输入第%i个分支内容\n", i + 1);
		while (1)
		{
			sca(&bra[c]);
			break;
		}
		c = (int)strlen(bra);
		x[i + 1] = c;
	}
}


int main()
{
	char bra1[1000],bra2[1000],bra3[1000] = {0};
	int b1[100],b2[100],b3[100] = {0};
	store(bra1, b1);
	store(bra2, b2);
	store(bra3, b3);
	return 0;
}

现在我们就完成了分支内容的储存,接下来就是打印部分,因为是用屏幕打印,目前只会顺序打印,所以大致思路为,根据储存在b1,b2,b3中每个分支的起始坐标,在按照顺序将其打印下来即可。具体实现过程如下:

int main()
{
	char bra1[1000], bra2[1000], bra3[1000] = { 0 };
	int b1[100], b2[100], b3[100] = { 0 };
	store(bra1, b1);
	store(bra2, b2);
	store(bra3, b3);
	int i = 0;
	//打印bra1中的第一个字符串
	for (i = 0; i < b3[1] + ((b2[1] > b2[2] ? b2[1] : b2[2]))/2; i++)
	{
		printf(" ");
	}
	for (i = 0; i < b1[1]; i++)
	{
		printf("%c", bra1[i]);
	}
	printf("\n");
	//打印bra2中的第一个字符串
	for (i = 0; i < b3[1]; i++)
	{
		printf(" ");
	}
	for (i = 0; i < b2[1]; i++)
	{
		printf("%c", bra2[i]);
	}
	printf("\n");
	//打印bra1中的第二个字符串
	for (i = 0; i < b3[1] + ((b2[1] > b2[2] ? b2[1] : b2[2])) / 2; i++)
	{
		printf(" ");
	}
	for (i = b1[1]; i < b1[2]; i++)
	{
		printf("%c", bra1[i]);
	}
	printf("\n");
	//打印bra3中的第一个字符串
	for (i = 0; i < b3[1]; i++)
	{
		printf("%c", bra3[i]);
	}
	printf("\n");
	//打印bra1中的第三个字符串
	for (i = 0; i < b3[1] + ((b2[1] > b2[2] ? b2[1] : b2[2])) / 2; i++)
	{
		printf(" ");
	}
	for (i = b1[2]; i < b1[3]; i++)
	{
		printf("%c", bra1[i]);
	}
	printf("\n");
	//打印bra2中的第二个字符串
	for (i = 0; i < b3[1]; i++)
	{
		printf(" ");
	}
	for (i = b2[1]; i < b2[2]; i++)
	{
		printf("%c", bra2[i]);
	}
	printf("\n");
	//打印bra1中的第四个字符串
	for (i = 0; i < b3[1] + ((b2[1] > b2[2] ? b2[1] : b2[2])) / 2; i++)
	{
		printf(" ");
	}
	for (i = b1[3]; i < b1[4]; i++)
	{
		printf("%c", bra1[i]);
	}
	printf("\n");
	//打印bra1中的第五个字符串
	for (i = 0; i < b3[1] + ((b2[1] > b2[2] ? b2[1] : b2[2])) / 2; i++)
	{
		printf(" ");
	}
	for (i = b1[4]; i < b1[5]; i++)
	{
		printf("%c", bra1[i]);
	}
	printf("\n");
	
	return 0;
}

输入分支信息其结果如下所示:

这里是为了解决问题而解决问题,是一个写死的代码,只能为解决上述问题而存在。还存在极大的优化空间,可进行如下优化。

四、代码优化

再进一步学习了数组,对数组有了更深的理解,现在可以对储存部分进行优化,基本思路如下:

还是一样的思路,我们要储存字符串,可以把它们按字符一个一个的储存在字符类型的数组中,这里我们还需要几个整型数组来记录每个字符串的起始坐标,字符串的输出顺序,以及每个部分的分支个数。代码如下:

void sca(char* bra)
{
	scanf("%s", bra);
}
void store(char* bra, int* x,int* y,int z,int* m)
{
	int d = 0;
	int i= 0;
	//输入需要储存多少最小分支
	printf("请输入分支个数:\n");
	scanf("%d", &d);
	y[z + 1] = d + y[z];
	//储存分支内容
	x[0] = 0;
	for (i = 0; i < d; i++)
	{
		printf("请输入第%i个分支的位置:\n", i + 1);
		scanf("%d", &m[i + y[z]]);
		printf("请输入第%i个分支内容:\n", i + 1);
		while (1)
		{
			sca(&bra[x[y[z]+ i]]);
			break;
		}
		x[i + y[z] + 1] = (int)strlen(bra);
	}
}

int main()
{
	char bra[1000] = { 0 };
	int b[100] = { 0 };
	int a[100] = { 0 };
	int m[100] = { 0 };
	int c = 0;
	int i = 0;
	printf("请输入需要几部分:");
	scanf("%d", &c);
	for (i = 0; i < c; i++)
	{
		store(bra, a,b,i,m);
	}
	return 0;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值