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; }
总结:图形的题目大多都是利用循环解题,题目不难,但很考察想象能力;
同样,不同的人写的代码复杂程度也会不一样(就比如那个空心正方形),要善于找到图形的特点,简化代码,提高效率;在学会一种方法后,要积极利用,不断锤炼自己的思维。
共勉!