提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
PAT L1-002
一、题目
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
二、设计步骤
1.测试组成沙漏所需符号个数
代码如下(示例):
//Sand_test.c
//测试组成完整沙漏所需字符个数
#include <stdio.h>
int main(void) {
int x ;//定义x为沙漏编号(即上半部分的层数,2x-1为沙漏实际层数)
int i, j = 0;
scanf("%d", &x);
printf("x = %d\n", x);
for (i = 0; i <= x; i++) {
j = (2 * i * i) - 1;//沙漏字符数满足该关系式
printf("i = %d j = %d\n", i, j);
}
i--;
printf("\ni = %d j = %d\n", i, j);//i为输入的层数,j为对应的符号总数
return 0;
}
数学模型构建测试:
//PrintSandGlass.c
#include <stdio.h>
int main(void) {
char ch;
int x;
int remainder;
scanf("%d %c", &x, &ch);
int i, j = x - 1, j1;
for (i = 1; j <= x; i++) {
j1 = j;
j = (2 * i * i) - 1;//沙漏字符数满足该关系式
if (x < j)
break;
printf("%d: %d\n", i, j);
}
printf("%d %d", i - 1, x - j1);
}
2.打印函数测试
代码如下(示例):
//Print_SandGlass_test.c
#include <stdio.h>
int main() {
int count = 5;
int i, j;
char sgn = '*';
for (i = 1; i <= count; i++) {
for (j = 1; j <= i - 1; j++) {
printf(" ");
}
for (j = 1; j <= (2 * (count + 1 - i) - 1); j++) {
printf("%c", sgn);
}
printf("\n");
}
for (i = 1; i <= count - 1; i++) {
for (j = 1; j <= count - i - 1; j++) {
printf(" ");
}
for (j = 1; j <= 2 * i + 1; j++) {
printf("%c", sgn);
}
printf("\n");
}
}
3.最终结果
代码如下(示例):
//PrintSandGlass.c
#include <stdio.h>
#define _CRT_SECURE_NO_WORNINGS 1
void GlassPrint(int, char);
int main(void) {
char ch;
int x;
int remainder;//剩余的符号数
scanf("%d %c", &x, &ch);
int count, total = x - 1, j;
for (count = 1; total <= x; count++) {
j = total;
total = (2 * count * count) - 1;//沙漏字符数满足该关系式
if (x < total)
break;
}
count -= 1;
remainder = x - j;
GlassPrint(count, ch);
printf("%d", remainder);
return 0;
}
//打印函数
void GlassPrint(int count, char sgn) {
int i, j;
for (i = 1; i <= count; i++) {
for (j = 1; j <= i - 1; j++) {
printf(" ");
}
for (j = 1; j <= (2 * (count + 1 - i) - 1); j++) {
printf("%c", sgn);
}
printf("\n");
}
for (i = 1; i <= count - 1; i++) {
for (j = 1; j <= count - i - 1; j++) {
printf(" ");
}
for (j = 1; j <= 2 * i + 1; j++) {
printf("%c", sgn);
}
printf("\n");
}
}
总结
了解循环每一步的目的很重要