一、模拟问题特征
描述一个场景——>转变为代码
东西 ——>数据结构(数组,二维数组)
交互
二、图形打印问题
- 输出梯形
题目描述:输入一个高度为h,输出一个高度为h,上底边长度为h的梯形
输入:一个整数h(1<=h<=1000)
输出:h对应的梯形
样例:
输入:4
输出:
****
******
********
**********
代码一:
#include<cstdio>
int main() {
int h;
scanf("%d", &h);
for (int i = 0; i < h; i++) {
int m = 2 * h - 2 - 2 * i ;//h+2*(h-1)-(h+2*i)
for (int j = 0; j < m; j++) {
printf(" ");
}
for (int k = 0; k < h + 2 * i; k++) {
printf("*");
}
printf("\n");
}
}
代码二:
不确定数量的输入
使用while循环
#include<cstdio>
int main() {
int h;
while (scanf("%d", &h) != EOF) {
//1.define EOF(-1)
//2.统计有多少个百分号读取成功了
//3.scanf的返回值是一个int,返回读取内容的个数/ctrl+d=文件终止符
for (int i = 0; i < h; i++) {
int m = 2 * h - 2 - 2 * i;
for (int j = 0; j < m; j++) {
printf(" ");
}
for (int k = 0; k < h + 2 * i; k++) {
printf("*");
}
printf("\n");
}
}
}
三、使用二维数组解决图形打印问题
输入:4
输出:
****
******
********
**********
思路
上述图形宽4长10——>4*10=二维数组——>定义一个char arr[4][10]
1.h——>范围
下底边长是h+2*(h-1)——>3h-2
高是h
arr[0][0]——>arr[h-1][3h-3]
2.先全填上空格
从下往上填*
代码
#include<cstdio>
char arr[1000][3000];//定义一个全局数组
int main() {
int h;
while (scanf("%d", &h) != EOF) {
//将区域全部填上空格
for (int i = 0; i < h; i++) {
for (int j = 0; j < 3 * h - 2; j++) {
arr[i][j] = ' ';
}
arr[i][3*h-2]='\0';//'\0'用来指示每一行字符的结束
}
//填充梯形区域
int beg = 0;
for (int i = h - 1; i >= 0; i++) {
//从下往上填充
for (int j = beg; j < 3 * h - 2; j++) {
arr[i][j] = '*';
}
beg += 2;
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < 3 * h - 2; j++) {//1
printf("%c", arr[i][j]);//2
}
printf("\n");//3
//1 2 3可写成printf("%s\n",arr[i]);
}
}
}
四、C风格的字符串设计
字符串是用字符数组处理的
找到’\0’是字符串的结束
读取一个字符串
- char str[10];//定义
- scanf(“%s”,arr);//字符数组可以省略取地址符号
输出一个字符串
- printf(“%s”,str);
五、图形打印问题的一般思路
- 申请二维数组(固定大小,太大放在全局变量的位置)
- 根据条件,从任意方向开始,蛇者二维数组
- 把图案的每一行的边界的后一个位置使用’\0’赋值
- 使用printf "%s"配合循环,打印每一行
题目
1.叠筐
描述
需要的时候,就把一个个大小差一圈的叠筐叠上去,使得从上往下看时,边筐花色交错。这个工作需要计算机来完成
输入
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,外筐花色字符,后二者都为ASCII可见字符
输出
输入叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔
样例
外筐是3时:
BBB B
BAB——>BAB
BBB B
代码
#include<cstdio>
int main() {
int n;//外筐的长度
char inner;
char outer;//内外花色
bool flag = true;//flag用来判断是否是第一个结果
while (scanf_s("%d %c %c", &n,&inner,1,&outer) != EOF) {
//scanf %d %f %o可以忽略空白字符
//scanf %c 可以读取空白字符(空格或换行)
//scanf %c如果前面有空格,则忽略空白字符
//1、使用scanf,scanf("%d %c %c",&n,&inner,&outer)
//2、如果使用scanf_s,就要加上输入长度,如上
if (flag == true) {
flag = false;
}
else {
printf("\n");
}
char patter[80][80] = { 0 };//二维数组的长度垚写固定
//在定义二维数组时,可以初始化,每一个元素都是'\0'
int length = 1;//外筐的长度
int x, y;
char curChar = inner;
for (length = 1,x=n/2,y=n/2; length <= n; length += 2,x--,y--) {
//x,y是起点的下标
//填满一个长度为length的正方形
for (int i = x, j = y; i < x + length; i++) {
//j不变,i从x到x+length-1
patter[i][j] = curChar;
}
for (int i = x, j = y; j < y + length; j++) {
//i不变,j从y到y+length-1
patter[i][j] = curChar;
}
for (int i = x + length-1, j = y; j < y + length; j++) {
patter[i][j] = curChar;
}
for (int i = x , j = y + length-1; i < x + length; i++) {
patter[i][j] = curChar;
}
//更换花色
if (curChar == inner) {
curChar = outer;
}
else {
curChar = inner;
}
}
//磨掉四个角
if (n != 1) {
patter[0][0] = ' ';
patter[0][n-1] = ' ';
patter[n-1][0] = ' ';
patter[n-1][n-1] = ' ';
}
for (int i = 0; i < n; i++) {
printf("%s\n", patter[i]);
}
}
}