- 特定图型描述:
问题描述
编写一个程序,首先输入一个整数,例如 5,然后在屏幕上显示如下的图形(5 表
示行数):
$ $ $ $ $
$ $ $ $
$ $ $
$ $
$
#include<iostream>
using namespace std;
int main()
{
int i,j,n;
cin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n-i;j++)
cout<<"*"<<" ";
cout<<endl;
}
return 0;
}
- 输出C字母图形:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int x,m;
double y;
for(y=10;y>=-10;y--)
{
m=2.9*sqrt(100-y*y);
for(x=1;x<30-m;x++)
cout<<" ";
cout<<"*"<<endl;
}
return 0;
}
- 巴斯卡三角形:
#include<iostream>
#include<cstdio>
#define N 12//会输出13行,更改会输出相应的N+1行
using namespace std;
long blaise(int n,int r)
{
int i;
long p=1;
for(i=1;i<=r;i++)
p=p*(n-i+1)/i;//p=p*(n-i+1)/i和p*=(n-i+1)/i是不一样的比如1000*2/4=500和1000*(2/4)=0结果完全不一样!
return p;
}
void print()
{
int n,r,t;
for(n=0;n<=N;n++)
{
for(r=0;r<=n;r++)
{
int i;
if(r==0)
{
for(i=0;i<=(N-n);i++)
cout<<" ";
}
else
{
cout<<" ";
}
printf("%3d",blaise(n,r));//经典C语言的某些语句在特定情况下是难以被替代的!
}
cout<<endl;
}
}
int main()
{
print();
return 0;
}
- 十字图:
几个说明:
1 . 整个图形: n = 1的时候是9行,2的时候是13行,3的时候是17行,列相同,所以为边长4 * n + 5的正方形 .
2 . 设输入的值为n,设置基准点(0,0),从外往里先输出最外圈。然后基准点依次往下往右移动2位,重复输出外圈,直到输完n圈。(这里要多循环一次,即 n+1次循环,来输出中间的十字)
3 .下面代码注释是基于当n = 3 时的图 :
#include<iostream>
using namespace std;
char s[150][150];
int main(){
int n, x, y;
cin>>n;
x = 0; y = 0; //基准点(0,0)
for (int i = 0; i < 4 * n + 5; i++){
for (int j = 0; j < 4 * n + 5; j++){
s[i][j] = '.'; //用'.'表示整个图形,是边长为4 * n + 5的正方形
}
}
for (int i = 0; i < n + 1; i++){
for (int j = y + 2; j < y + 4 * (n - i) + 2; j++){
s[x][j] = '$'; //最外圈第一行的'$',(0,2)->(0,14)
}
for (int j = x; j <= x + 2; j++){
s[j][y + 2] = '$'; // 第三列三行的'$',(0、2)、(1、2)、(2、2)
}
for (int j = x; j <= x + 2; j++){ //对称的另一边的'$',列是从4 * (n - i) + 2开始
s[j][y + 4 * (n - i) + 2] = '$';
}
for (int j = y; j <= y + 2; j++){
s[x + 2][j] = '$'; //第三行前三个'$'
}
for (int j = y + 4 *(n - i) + 2; j <= y + 4 * (n - i) + 4; j++){
s[x + 2][j] ='$'; //第三行对称的'$'
}
for (int j = x + 2; j <= x + 4 * (n - i) + 2; j++){
s[j][y] = '$'; //从第三行到第十五行第一列的'$'
}
for (int j = x + 2; j <= x + 4 * (n - i) + 2; j++){
s[j][y + 4 * (n - i) + 4] = '$'; //对称的,第十七列
}
for (int j = y; j <= y + 2; j++){
s[x + 4 * (n - i) + 2][j] = '$';
}
for (int j = y + 4 * (n - i) + 2; j <= y + 4 * (n - i) + 4; j++){
s[x + 4 * (n - i) + 2][j] = '$';
}
for (int j = x + 4 * (n - i) + 2; j <= x + 4 * (n - i) + 4; j++){
s[j][y + 2] = '$';
}
for (int j = x + 4 * (n - i) + 2; j <= x + 4 * (n - i) + 4; j++){
s[j][y + 4 * (n - i) + 2] = '$';
}
for (int j = y + 2; j <= y + 4 * (n - i) + 2; j++){
s[x + 4 * (n - i) + 4][j] = '$';
}
x += 2; y += 2; //基准点为(2,2)、(4、4)...... (n,n)
}
for (int i = 0; i < 4 * n + 5; i++){
cout<<s[i]<<endl; //输出'$'
}
return 0;
}
总结:图像显示类的题非常考验一个人的逻辑思考和推理能力,有些还涉及不常见的数学公式,较为复杂的图像处理题处理起来还是比较麻烦的。