#PTA数据结构自测第一题:打印沙漏
因为太菜了,所以实现的手段很白痴
虽然过了pta的测试点但这个做法真的很低级(卑微.jpg)
1.处理一般都会出现的中间一行一个的字符;
2.每一行只有行首有空格,行末无空格;
3.输出的问题:是可以直接在主函数中用循环实现的,但因为我还没琢磨出来所以用了两个函数;
//代码里穿插了很多cout语句用来运行查看:
1)求得第一行最长字符的个数是否正确;
2)沙漏上部分打印是否正确;
3)下部分:
1>对齐的问题(就是下部分的起始空格个数)
2>下半部分第一行是三个开始;
3>N最大的时候为1000,一开始设置下部分的空格起始值是用i去计数的,提交之后发现pta会有两个测试点无法通过,
转回本地DEV运行,输入1000;
下半部分是介个亚子的,所以后来把下半部分的空格输出起始值改为s去记录;
一般来说,“函数一般是用来处理输入数据的,最好不要在函数中输出,”所以等我想出来不用函数的办法会更新。
PS:希望有路过的大佬来指点卑微小弟(微笑.jpg):)
#include<bits/stdc++.h>
using namespace std;
void space(int x);//输出空格
void ch(int y,char a); //输出字符a
int main()
{
int n;//
char a;
int i;
cin >> n >> a;//接收输入的n和字符;
n=n-1;//把中间一行独立一个分出来 0;
// cout << n << endl;
for(i=3;n>=2*i;)
{
n=n-2*i;//此时n为减去最大沙漏规模余下的字符个数;
// cout << n << " " << i << endl;//最后一次i为第一行输出字符个数(max);
i += 2;
//解决行数问题??? 似乎max就是行数 得到max进行了max-2次循环
}
//解决得到第一行输出的最大字符个数
i = i-2;//繁琐1;
// cout << i << endl;
int max=i;
//int t=0;
int s;
for(s=0;i>=1;s++)//正逆序输出循环要进行 (max-1)/2次 记录该次循环应输出几个空格和几个字符;
{
space(s);
ch(i,a);
i -= 2;
// cout << endl;//正序循环之后i=1;
}
// cout << i << endl;
i+=2;//繁琐2;
for(s=s-2;i<max;s--)//正逆序输出循环要进行 (max-1)/2次 记录该次循环应输出几个空格和几个字符;
{
space(s);
ch(i+2,a);
i += 2;
//cout << endl;
}
cout << n;
return 0;
}
void space(int x)//解决空格输出 空格个数x
{
for(int j=0;j<x;j++)
cout << " ";
}
void ch(int y,char a)//解决字符输出 传入 那一行要输出的字符个数y
{
for(int k=1;k<=y;k++)
{
cout << a;//换行的问题在主函数还是在函数中解决;
}
cout <<endl;
}
##能看到我有好几句是在循环的最后一句运行之后跳出循环又逆处理了一次,为了得到我最后一次循环结束但是还没有运行最后一句所得到的值,或者可以设置一个变量在循环里更新记录所得的max就无须去处理i跳出循环和我们想得到的那个数不一样的问题8…
还有待继续更新改善。