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