首页 > 试题广场 >

编程量** 难度** 性能要求* (1秒)

[问答题]
编程量**   难度**   性能要求* (1秒)


贝贝还在读小学的时候就喜欢上了正弦图。弯弯而又反对称, 挺好玩的 。 于是她开始学着画各种周期和高度(振幅)的正弦图。画着画着,她觉得要使图形严格对称还是颇费周折的,于是她忍不住“哇”的一声哭了出来。

你们在旁边看到了吧, 好可怜的样子, 该是出手帮她的时候了 。 最好的办法就是编个程序,对付各种周期和振幅, 一劳永逸。

输入说明

输入含有不多于100组的数据, 每组数据含有三个以空格隔开的字符, 第一个是数字字符表示周期N,范围在[1,9], N相当于正弦图横向字符数有4N+1个。第二个数字表示振幅 M, 范围在[1,9], M相当于正弦图的高度, 第三个字符表示正弦图的图形字符。

输出说明

输出的结果当然是字符的正弦图形, 0~1π和1π~2π周期中的两个反向图形应该对称。每个图形之间应换行。正弦值应四舍五入。

推荐
//===================================
//正弦字符图
//===================================
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
//-----------------------------------
struct Point{ int x,y; } zero={0,0};
//-----------------------------------
bool operator<(const Point& a, const Point& b){
  return a.y>b.y;
}//----------------------------------
void display(const vector<Point>& p, char ch){
  for(int k=0,i=p[0].y;i>=-p[0].y; --i){
    for(int n=0; k<p.size() && p[k].y==i; n=p[k++].x+1)
      cout<<string(p[k].x-n,' ')<<ch;
    cout<<"\n";
  }
}//----------------------------------
int main() {
  ifstream cin("sin.in");
  char ch;
  for(int period,amplitude; cin>>period>>amplitude>>ch; ){
    vector<Point>p(4*period+1,zero);
    for(int i=1; i<=period*2; ++i){
      p[i].x = i;
      p[i].y = amplitude*sin(i*M_PI/2/period)+0.5;
      p[period*2+i].x = period*2+i;
      p[period*2+i].y = -p[i].y;
    }
    stable_sort(p.begin(), p.end());
    display(p, ch);
  }
}//==================================


发表于 2018-04-18 20:33:30 回复(1)