1.在屏幕上打印如下图所示的图形
题目解析:这个图形我们可以看成总共有13行,第七行的“*”最多,有13个,以第七行为中心的上下每一行都比原来的“*”少2个,以此类推,直至剩下一个“*”为止;也可以将它看成两部分,上半部分是七行的一个“*”逐渐增多的正三角,假设在第i行,它的“*”有2*i+1个,下半部分是一个有六行“*”的倒三角,在第i行时,它的“*”有(行数-i)*2-1个,这里需要定义一个变量表示行数。
方法一:写13行的printf,将这13行在屏幕上打印出来,此方法相对来说不是明智的方法,如果说在屏幕上要求打印的太多,比如一万行,这个方法的局限性太大,而且程序运行速度会很慢。
方法二:将要打印的图形分为两部分,如下图
将这个图形分解以后,最大的难点就在于控制每一行的空格数量和“*”的个数,可以再定义一个变量j,通过循环变量中的j来控制,具体的程序代码如下:
#include<stdio.h>
int main()
{
int line = 0;//行数
scanf("%d", &line);
int i = 0;//第一行从0开始
int j = 0;//控制空格数
for (i = 0; i < line; i++)//上半部分
{
for (j = 0; j < line - 1 - i; j++)//上半部分空格从6-0
{
printf(" ");
}
for (j = 0; j < (2 * i + 1); j++)//上半部分星星的个数奇数增长
{
printf("*");
}
printf("\n");
}
for (i = 0; i < line - 1; i++)//下半部分
{
for (j = 0; j < i + 1; j++)//下半部分空格从一到六
{
printf(" ");
}
for (j = 0; j < (line - 2 - i) * 2 + 1; j++)//下半部分星星的个数根据我们所定义的变量来找其中的规律
{
printf("*");
}
printf("\n");
}
return 0;
}
2.编写一个程序,验证所有花括号都正确成对出现。
问题分析:要判断括号是否匹配,可以设计一个计数器,当遇到左括号时,计数器加一,遇到右花括号时,计数器减一,计数器为0时,匹配成功,当然,这只是一般情况。除此之外,还要验证一些特殊情况,可能出现的一些情况如下图。这里我们可以使用getchar( )函数来进行输入内容的读取。
程序代码如下:
#include<stdio.h>
int main()
{
int ch = 0;
int count = 0;
while ((ch = getchar()) != EOF)
{
if ((count == 0) && (ch == '}'))
{
printf("不匹配!\n");
return;
}
if (ch == '{')
count++;
if (ch == '}')
count--;
}
if (count == 0)
{
printf("匹配成功!\n");
}
else
{
printf("不匹配!\n");
}
return 0;
}