赞
踩
练习时间
2023年1月30日15:28 广东省深圳市
题目描述
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印:
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例
19 *
输出样例
*****
***
*
***
*****
2
错误代码(一)
#include <iostream> #include <cmath> using namespace std; #define N 1000 int main() { int input_n; int remain_n; char input_c; cin >> input_n; cin >> input_c; int i; int i_range; i_range = ceil(sqrt((N + 1) / 2)); int row_count; int row_num; for (i = 0; i < i_range; i ++) { int i_num = (i * i) * 2 - 1; if (input_n > i_num) { continue; } else { row_count = i; row_num = 2 * row_count - 1; remain_n = input_n - (2 * (row_count * row_count) - 1); break; } } for (int j = 0; j < row_num; j ++) { if (j <= ((row_num - 1) / 2)) { for (int k1 = 0; k1 < j; k1 ++) { cout << ' '; } for (int k2 = 0; k2 < (row_num - 2 * j); k2 ++) { cout << input_c; } for (int k3 = 0; k3 < j; k3 ++) { cout << ' '; } } else { for (int k1 = 0; k1 < (row_num - j - 1); k1 ++) { cout << ' '; } for (int k2 = 0; k2 < (2 * j + 2 - row_num); k2 ++) { cout << input_c; } for (int k3 = 0; k3 < (row_num - j - 1); k3 ++) { cout << ' '; } } } }
原因分析:该代码在输入输出流时,没有断行(应当在cout末尾加入endl或/n)。同时,输入19时,顶行、底行,应为5个字符,而上图显示是7个字符,对应的数列超出了一项,说明计算也存在一定问题,该问题定位至第一个for循环,要重点检查row_count、row_num。另外,该代码没有输出最后的剩余字符数量,应予以补上。
错误代码(二)
#include <iostream> #include <cmath> using namespace std; #define N 1000 int main() { int input_n; int remain_n; char input_c; cin >> input_n; cin >> input_c; int i; int i_range; i_range = ceil(sqrt((N + 1) / 2)); int row_count; int row_num; for (i = 0; i < i_range; i ++) { int i_num = (i * i) * 2 - 1; if (input_n > i_num) { continue; } else { row_count = i - 1; row_num = 2 * row_count - 1; remain_n = input_n - (2 * (row_count * row_count) - 1); break; } } for (int j = 0; j < row_num; j ++) { if (j <= ((row_num - 1) / 2)) { for (int k1 = 0; k1 < j; k1 ++) { cout << ' '; } for (int k2 = 0; k2 < (row_num - 2 * j); k2 ++) { cout << input_c; } for (int k3 = 0; k3 < j; k3 ++) { cout << ' '; } cout << endl; } else { for (int k1 = 0; k1 < (row_num - j - 1); k1 ++) { cout << ' '; } for (int k2 = 0; k2 < (2 * j + 2 - row_num); k2 ++) { cout << input_c; } for (int k3 = 0; k3 < (row_num - j - 1); k3 ++) { cout << ' '; } cout << endl; } } cout << remain_n << endl; cout << endl; cout << "input_n is " << input_n << endl; cout << "row_count is " << row_count << endl; cout << "row_num is " << row_num << endl; }
原因分析:当输入为1时,出现了错误,说明极端值取值存在问题,需要对输入为1、999、1000、1001等边界情况,进行重新检查。因此,以后要注意cin输入的边界值,判断程序在极端情况下是否有可能出错。
修改后代码
#include <iostream> #include <cmath> using namespace std; #define N 1000 int main() { int input_n; int remain_n; char input_c; cin >> input_n; cin >> input_c; int i; int row_count; int row_num; for (i = 0; i < 1000; i ++) { int i_num = (i * i) * 2 - 1; if (input_n == 1) { row_count = 1; row_num = 1; remain_n = 0; break; } if (input_n > i_num) { continue; } else { row_count = i - 1; row_num = 2 * row_count - 1; remain_n = input_n - (2 * (row_count * row_count) - 1); break; } } for (int j = 0; j < row_num; j ++) { if (j <= ((row_num - 1) / 2)) { for (int k1 = 0; k1 < j; k1 ++) { cout << ' '; } for (int k2 = 0; k2 < (row_num - 2 * j); k2 ++) { cout << input_c; } for (int k3 = 0; k3 < j; k3 ++) { cout << ' '; } cout << endl; } else { for (int k1 = 0; k1 < (row_num - j - 1); k1 ++) { cout << ' '; } for (int k2 = 0; k2 < (2 * j + 2 - row_num); k2 ++) { cout << input_c; } for (int k3 = 0; k3 < (row_num - j - 1); k3 ++) { cout << ' '; } cout << endl; } } cout << remain_n << endl; cout << endl; cout << "input_n is " << input_n << endl; cout << "row_count is " << row_count << endl; cout << "row_num is " << row_num << endl; }
运行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。