1.2C/C++模拟问题一

一、模拟问题特征

描述一个场景——>转变为代码
东西 ——>数据结构(数组,二维数组)
交互

二、图形打印问题

  1. 输出梯形
    题目描述:输入一个高度为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);

五、图形打印问题的一般思路

  1. 申请二维数组(固定大小,太大放在全局变量的位置)
  2. 根据条件,从任意方向开始,蛇者二维数组
  3. 把图案的每一行的边界的后一个位置使用’\0’赋值
  4. 使用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]);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值