1.线段图案到 箭形图案
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//线段图案
int main()
{
int num;
int i;
while(scanf("%d",&num) == 1)
{
for(i=0;i<num;i++)
{
printf("*");
}
printf("\n");
}
return 0;
}
打印正方形
int main()
{
int num;
int i;
while (scanf("%d", &num) == 1)
{
int j;
for (i = 0; i < num; i++)
{
for (j = 0; j < num; j++)
{
printf("* ");
}
if (i / num == 0)
printf("\n");
}
}
return 0;
}
直三角形 沉下心来
int main()
{
int n;//定义三角形的边长
while (scanf("%d", &n) == 1)//实现多组输入
{
//*的个数和行数一样
int i, j;
for (i = 0; i < n ; i++)
{
for (j = 0; j < i+1; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
//反转三角形
int main()
{
int n;//定义三角形的边长
while (scanf("%d", &n) == 1)//实现多组输入
{
//*的个数和行数一样
int i, j;
for (i = n; i > 0; i--)
{
for (j = i; j > 0; j--)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
//字符圣诞树
int main()
{
int n;
int i, j;
int b;//空格
//功能实现
while (scanf("%d", &n) == 1)
{
for (i = 1; i < n + 1; i++)
{
//先输出空格
for (b = 0; b <n-i; b++)
{
printf(" ");//本质上还是一个正方形,只不过用空格代替
//第一行 n-1个空格,第二行n-2个空格,最后一行没有空格
}
//输出空格后,在打印*号
for (j = 0; j < i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
//三角形
int main()
{
int n;
int i, j;
int b;//空格
//功能实现
while (scanf("%d", &n) == 1)
{
for (i = 1; i < n + 1; i++)
{
//先输出空格
for (b = 0; b < n - i; b++)
{
printf(" ");//注意这里有两个空格,只有这样,才能把字符挤到最后面
//本质上还是一个正方形,只不过用空格代替
//第一行 n-1个空格,第二行n-2个空格,最后一行没有空格
}
//输出空格后,在打印*号
for (j = 0; j < i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
求字符串长度的三种方法 库函数 自定义 函数递归
int main()
{
char arr[] = "abc";
int len = strlen(arr);
printf("%d", len);
return 0;
}
int my_strlen(char* p)
{
int count =0;
while (*p != '\0')
{
count++;
p++;
}
return count;
}
函数递归
求一个字符串长度是一件大事,要大事化小,获取第一个字符,只要不是\0就可以
获取一个,就取观察下一个
int my_strlen(char* p)
{
if (*p == '\0')//p指向的是数组的首地址,那*p就是数组的第一个元素,若第一个元素为\0,则字符串长度为0
return 0;
else //如果第一个元素不为\0,那么字符串长度至少为1,所以就砍掉了第一个字符,再去递归观察其余字符
return 1 + my_strlen(p+1);//注意不要写成return 1 + my_strlen(p++);会先遇到p,再++
}
int main()
{
char arr[] = "abc";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
更通用一些
int main()
{
printf("请输入字符串:");
char arr[100];
scanf("%s", arr);
int len = my_strlen(arr);
printf("字符串长度=%d\n", len);
return 0;
}
#include <stdio.h>
//菱形
int main()
{
int n;
int i, j;
int b;//空格
//功能实现
while (scanf("%d", &n) == 1)
{
for (i = 1; i < n + 2; i++)
{
//先输出空格
for (b = 0; b < n - i + 1; b++)
{
printf(" ");//本质上还是一个正方形,只不过用空格代替
//第一行 n-1个空格,第二行n-2个空格,最后一行没有空格
}
//输出空格后,在打印*号
for (j = 0; j < i; j++)
{
printf("* ");
}
printf("\n");
}
for (i = n; i > 0; i--)
{
//先输出空格
for (b = 0; b < n - i; b++)
{
printf(" ");//本质上还是一个正方形,只不过用空格代替
//第一行 n-1个空格,第二行n-2个空格,最后一行没有空格
}
//输出空格后,在打印*号
for (j = 0; j < i; j++)
{
printf(" *");
}
printf("\n");
}
}
return 0;
}
int main()
{
//k型图案
//定义长度
int n;
scanf("%d", &n);
//循环实现
int i = 0;
int j = 0;
for (i = 0; i <n+1; i++)
{
for (j = 0; j < n + 1 - i; j++)
{
printf("* ");
}
printf("\n");
}
for (i = 1; i < n + 1; i++)
{
for (j = 0; j < i+1; j++)
{
printf("* ");
}
printf("\n");
}
return 0;
}
4.28收尾 箭图案
int main()
{
int n;
scanf("%d", &n);
循环实现部分
int i = 0;
int j = 0;
int b;//空格
分为正序逆序两部分即可
for (i = 0; i < n+1; i++)
{
for (b = 0; b < n-i; b++)//想不通时取个简单的数验证下
{
printf(" ");
}
for (j = 0; j < i + 1; j++)
{
printf("*");
}
printf("\n");
}
逆序输出
for (i = 1; i < n + 1; i++)
{
for (b = 0; b <i; b++)
{
printf(" ");
}
for (j = 0; j <n+1-i; j++)//数量由多变少(会随着i的增大而增大)
{
printf("*");
}
printf("\n");
}
return 0;
}
2.反斜线及其之后
//命运负责洗牌和发牌,而我们只能出牌。-叔本华
//4.29 lvzi
//反斜线
//int main()
//{
//定义行数
int n;
while (scanf("%d", &n) == 1)
{
//实现过程
int i;
int b;
for (i = 1; i < n+1; i++)//i从1开始容易想,把它当作行数
{
//先打印空格
for (b = 0; b < i - 1; b++)
printf(" ");
//每行只有一个*
printf("*");
printf("\n");
}
}
// return 0;
//}
正斜线
int main()
{
//定义行数
int n;
while (scanf("%d", &n) == 1)
{
//实现过程
int i;
int b;
for (i = 1; i < n + 1; i++)
{
//先打印空格
for (b = 0; b <n-i ; b++)
printf(" ");
//每行只有一个*
printf("*");
printf("\n");
}
}
return 0;
}
//x型图案
int main()
{
//定义输入数字
int n;
while (scanf("%d", &n) == 1)
{
//看作正斜线和反斜线,从上往下打印
int i, j;//定义行和列
for (i = 1; i < n+1; i++)
{
for (j = 1; j < n+1 ; j++)
{
//有两种情况需要打印星号,正对角线和逆对角线
if (i == j || i + j == n + 1)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
//空心正方形
int main()
{
int n;
while (scanf("%d", &n) == 1)
{
//第一行和最后一行=n,i=1&&i=n
//其余只有两个 j=1&&j=n
int i, j;//i是列数,j是行数
//一行一行遍历
for (i = 1; i < n + 1; i++)
{
if (1 == i || n == i)//第一行和最后一行需要输出的*的个数等于n
{
for (j = 0; j < n; j++)
printf("* ");
printf("\n");
}
else if (2 <= i && i <= n - 1)//除了第一行和最后一行之外,其余行形式一致,只有两个*,其余为空格
{
for (j = 1; j < n+1; j++)//注意输出的*后面还有一个空格,算上空格的长度,列数一共有n+n-1;
{
if (j == 1 ||j == n)
{
printf("* ");
}
else
printf(" ");
}
printf("\n");
}
}
}
return 0;
}
另一个比较nb的写法 空心正方形
会发现,中间大量出现空格,其实也有规律,排除第一行,最后一行和第一列和最后一列,其余部分全是*,这之间的是空格
int main()
{
int n;
int i, j;
while (scanf("%d", &n) == 1)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (0 < i&& n-1>i &&0<j && n-1>j)
printf(" ");//注意这有两个空格,加一个空格不就好了吗
else
printf("* ");
}
printf("\n");
}
}
return 0;
}
4.29收尾
极其难受的一天,鼻塞加感冒,要死的啦
空心三角形
int main()
{
//和上题差不多吗,第一行一个,最后一行等于n
//其余行只有两个
int n;int i, j;
while (scanf("%d", &n) == 1)
{
printf("*");//先输出前两行,格式相同
printf("\n");
printf("* *");
printf("\n");
for (i = 3; i < n; i++)//中间部分
{
for (j = 0; j < n; j++)
{
if (j == 0 || j == i-1)//只有在第一列和i-1列才会有*
printf("* ");
else
printf(" ");//其余位置全是空格
}
printf("\n");
}
for (i = 0; i < n; i++)
{
printf("* ");//输出最后一行
}
printf("\n");//多组输入,记得在最后添加一个\n
}
return 0;
}
总结:图形的题目大多都是利用循环解题,题目不难,但很考察想象能力;
同样,不同的人写的代码复杂程度也会不一样(就比如那个空心正方形),要善于找到图形的特点,简化代码,提高效率;在学会一种方法后,要积极利用,不断锤炼自己的思维。
共勉!