ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

用c/c++进行图形的输出

2021-09-20 21:34:10  阅读:202  来源: 互联网

标签:输出 ch cout int c++ 图形 main 输入


用c/c++进行图形的输出

一.字符串型

【1】实心图形(1-5,12)

1.输入 n 值,输出如图所示矩形

*****
*****
*****
*****
*****
#include <iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	for(int i=0 ; i<n ; i++) {
		for(int j=0 ; j<n ; j++)
				cout<<"*";
		cout<<endl;
	}
	return 0;
}

2.输入 n 值,输出如图所示平行四边形

        * * * * *
      * * * * *
    * * * * *
  * * * * *
* * * * *
#include <stdio.h>
int main() {
	int n;
	scanf("%d",&n);
	for(int i=0 ; i<n ; i++) {
		for(int j=n-i-1; j>0 ; j--)
			printf("%2c",'\0');
		for(int j=0 ; j<n ; j++)
			printf("%-2c",'*');
		printf("\n");
	}
	return 0;
}

3.输入 n 值,输出如图所示高为 n 的等腰三角形

   		*
      * * *
    * * * * *
  * * * * * * *
* * * * * * * * *
#include <iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	for(int i=1 ; i<=n ; i++) {
		for(int j=0 ; j<n-i ; j++)
			printf("%2c",' ');
		for(int j=0 ;j<2*i-1 ; j++)
			printf("%-2c",'*');
		cout<<endl;
	}
	return 0;
}

4.输入 n 值,输出如图所示高为 n 的倒等腰三角形

* * * * * * * * *
  * * * * * * *
    * * * * *
      * * *
        *
#include <iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	for(int i=n ; i>0 ; i--) {
		for(int j=0 ; j<n-i ; j++)
			printf("%2c",'\0');
		for(int j=0 ;j<2*i-1 ; j++)
			printf("%-2c",'*');
		cout<<endl;
	}
	return 0;
}

5.输入 n 值,输出如图所示高和上底均为 n 的等腰梯形

		* * * * *
      * * * * * * *
    * * * * * * * * *
  * * * * * * * * * * *
* * * * * * * * * * * * *
#include <iostream>
using namespace std;
int main() {
	/*int n; 
	cin>>n;
	for(int i=3; i<=n+2 ; i++) {
		for(int j=0 ; j<n-i+2; j++)
			cout<<"  ";
		for(int j=0 ;j<2*i-1 ; j++)
			cout<<"* ";
		cout<<endl;
	}*/ //  错误,第一行*的个数随n的变化而变化会变化,并不是一个常量,不能直接从i=3算起
	int n;
	cin>>n;
	for(int i=1 ; i<=n; i++) {
		for(int j=1 ; j<=n-i ; j++)
			cout<<"  ";
		for(int j=1 ; j<=2*i-1+(n-1); j++) {
			if(j == 1)
				cout<<"*";
			else
				cout<<" *";
		}
		cout<<endl;
	}
	return 0;
}

注:这种体型最容易只看样例输出图形,如果题目要求n是一个常数可以这样做,否则就极容易出错, 往往会忽略掉随着n变化时图形发生的变化。行与行之间的距离相当与一个空格,故每行*之间的距离是一个空行

12.输入 n 值,输出菱形

 	*
  * * *
* * * * *
  * * *
    *
#include <iostream>
using namespace std;
int main() {
	void f(int n , int i);
	int n;
	cin>>n;
	for(int i=1 ; i<=n ; i++ )
		f(n,i);
	for(int i=n-1; i>0 ; i-- )
		f(n,i);
	return 0;
}
void f(int n , int i) {
	for(int j=1 ; j<=n-i ; j++)
		cout<<"  ";
	for(int j=1 ; j<=2*i-1 ; j++) {
		if(j == 1)
			cout<<"*";
		else
			cout<<" *";
	}
	cout<<endl;
}

【2】空心图形(6-11,13)[字符串型]

6.输入 n 值,输出如图所示高和上底均为 n 的等腰空心梯形

 		  * * * * * *
        *             *
      *                 *
    *                     *
  *                         *
* * * * * * * * * * * * * * * *
#include <iostream>
using namespace std;
int main() {
	int n; 
	cin>>n;
	for(int i=1; i<=n ; i++) {
		for(int j=0; j<n-i; j++)
			cout<<"  ";
		for(int j=1 ;j<=2*i-1+(n-1) ; j++) {
			if(i==1 || i==n) {
				if(j == 1)
					cout<<"*";
				else
					cout<<" *";  
			}
			else {
				if(j==1)
					cout<<"* ";
				else if(j == 2*i-1+(n-1) )
					cout<<"*";
				else
					cout<<"  ";
			}
		}
		cout<<endl;
	}
	return 0;
}

7.输入 n 值,输出如图所示边长为 n 的空心正六边型

  	 * * * * * *
    *           *
   *             *
  *               *
 *                 *
*                   *
 *                 *
  *               *
   *             *
    *           *
     * * * * * *
#include <iostream>
using namespace std;
int main() {
	void f(int n,int i);
	int n;
	cin>>n;
	for(int i=1; i<n; i++)
		f(n,i);
	f(n,n);
	for(int i=n-1; i>0; i--)
		f(n,i);
	return 0;
}
void f(int n,int i) {
	for(int j=0; j<n-i; j++)
			cout<<" ";
	for(int j=1 ;j<=2*i-1+(n-1) ; j++) {
		if(i==1) {
			if(j==1)
				cout<<"*";
			else
				cout<<" *";
		}
		else {
			if(j==1 || j==2*i-1+(n-1))
				cout<<"*";
			else {
				if(j<=i || j>i+n-1 )
					cout<<" ";
				else
					cout<<"  ";
			}
		}
	}
	cout<<endl;
}
	return 0;
}

8.输入 n 值,输出X图形

*         *
 *       *
  *     *
   *   *
    * *
     *
    * *
   *   *
  *     *
 *       *
*         *
#include <iostream>
using namespace std;
int main() {
	void f(int n ,int i);
	int n;  
	cin>>n;
	for(int i=n ; i>1 ; i--)
		f(n,i);
	for(int i=1 ; i<=n ; i++)
		f(n,i);
	return 0;
}
void f(int n ,int i) {
	for(int j=1 ; j<=n-i; j++)
		cout<<" ";
	for(int j=1 ; j<=2*i-1 ; j++) {
		if(j == 1 || j ==2*i-1 )
			cout<<"*";
		else
			cout<<" ";
	}
	cout<<endl;
}
	return 0;
}

注:针对上下对称的图形,一般的做法是将其分成上半部分,中间部分,下半部分。对于上下部分,由于其对称性这样会产生很多重复代码,这个时候可以自定义函数来处理重复代码。对于中间部分,有时可以写在上半部分(下半部分),有时要单独分析,这时一定要看样例分析。

9.输入 n 值,输出Z图形

* * * * *
      *
    *
  *
* * * * *
//数组
#include <iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	char s[n][2*n-1];
	for(int i=0 ; i<n ; i++) {
		for(int j=0 ; j<2*n-1 ; j++) {
			if(i == 0 || i == n-1) {
				if(j%2 == 0) {
					s[i][j]='*';
					cout<<s[i][j];
				}
				else {
					s[i][j]=' ';
					cout<<s[i][j];
				}
			}
			else {
				if(j == 2*(n-1-i)) {
					s[i][j]='*';
					cout<<s[i][j];
				}
				else {
					s[i][j]=' ';
					cout<<s[i][j];
				}
			}
		}
		cout<<endl;
	}
	return 0;
}
//非数组
#include <iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	for(int i=1 ; i<=n ; i++) {
		for(int j=1 ; j<=n ; j++) {
			if(i == 1 || i == n) {
				if(j == 1)
					cout<<"*";
				else
					cout<<" *";
			}
			else {
				if(j == n-i+1)
					cout<<"*";
				else
					cout<<"  ";
			}
		}
		cout<<endl;
	}
	return 0;
}

注:图形的输出还可以用数组来处理,有时处理会简单,有时处理会很繁杂,具体要看题目要求。

10.输入 n 值,输出K图形

*     *
*   *
* *
*
* *
*   *
*     *
#include <iostream>
using namespace std;
int main() {
	void f(int n, int i);
	int n;
	cin>>n;
	for(int i=n ; i>1 ;i--)
		f(n,i);
	for(int i=1 ; i<=n ;i++)
		f(n,i);
	return 0;
}
void f(int n, int i) {
	for(int j=1 ; j<=i ; j++) {
		if(j == 1)
			cout<<"* ";
		else if(j == i)
			cout<<"*";
		else
			cout<<"  ";
	}
	cout<<endl;
}

11.输入 n 值,输出N图形

*    *
**   *
* *  *
*  * *
*   **
*    *
#include <iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	char s[n][n];
	for(int i=0 ; i<n ; i++) {
		for(int j=0 ; j<n ; j++) {
			if(j == 0 || j == n-1 || j == i) {
				s[i][j]='*';
				cout<<s[i][j];
			}
			else {
				s[i][j]=' ';
				cout<<s[i][j];
			}
		}
		cout<<endl;
	}
	return 0;
}

13.输入 n 值,输出倒V图形

    *
   * *
  *   *
 *     *
*       *
#include <iostream>
using namespace std;
int main() {
	int n; 
	cin>>n;
	for(int i=1 ; i<=n ; i++) {
		for(int j=1 ; j<=n-i; j++)
			cout<<" ";
		for(int j=1 ; j<=2*i-1 ; j++) {
			if(j == 1 || j ==2*i-1 )
				cout<<"*";
			else
				cout<<" ";
		}
		cout<<endl;
	}
	return 0;
}

【3】较难题

二. 数字型的图案

【1】实心图案

17.输出数字形成一个矩形(每行从左到右连加,每行结束不置0)的图形

 1   2   3   4   5   6
 7   8   9  10  11  12
13  14  15  16  17  18
19  20  21  22  23  24
25  26  27  28  29  30
31  32  33  34  35  36

#include <iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	int k=0;
	for(int i=0; i<n ; i++ ) {
		for(int j=0 ; j<n ; j++) {
			k++;  //不置0
			printf("%4d",k);
		}
		cout<<endl;
	return 0;
}

18.输出数字倒三角的图形

  1  3  6 10 15 21
  2  5  9 14 20
  4  8 13 19
  7 12 18
 11 17
 16

#include <iostream>
using namespace std;
int main() {
    int n;
    cin>>n;
    int k=1;
	for(int i=1 ; i<=n ; i++) {
		int m=k; //k是第i行中第一个元素的值
		for(int j=1 ; j<=n-i+1 ; j++) {
			printf("%3d",m);
			m+=i+j; //计算同行下一个元素的值
		}
		k+=i;  //计算下一行中的一个元素
		cout<<endl;
	}
	return 0;
}

分析:此题的关键是找到输出数字和行、列数的关系。审查图形中每行中数字的关系发现:
(1)右边数字和前面数字之差逐次增 1 ;
(2) 同列数字依然是这样的关系,编程的关键转换为找到每一行左方的第一个数字,然后利用行和列的循环变量进行运算就可得到每个位置的数字。用
a i j a_{ij} aij​表示第 i i i行第 j j j 列的数字,则 a 11 = 1 a_{11}=1 a11​=1;由第 i i i行第 1 1 1列的数字推出第
i + 1 i+1 i+1行第 1 1 1列的数字是 a i + 1 , a i = 1 , 1 + i a_i+1 ,a_i=1 ,1+i ai​+1,ai​=1,1+i;同样由第 j j j列推出第 j + 1 j+1 j+1 列的数字是 a i , j + 1 = a i , j + i + j a_i,j+1 = a_i,j+i+j ai​,j+1=ai​,j+i+j。另外只有当 j < i j<i j<i时才输出数字。

19.输入 n 值,输出特殊的数字矩形

  1  2  3  4  5
  1  1  2  3  4
  1  1  1  2  3
  1  1  1  1  2
  1  1  1  1  1
#include <iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	int k=1;
	for(int i=0; i<n ; i++) {
		int m=k; //代表每行第一个元素
		for(int j=0 ; j<n ; j++) {
			if(j<=i)
				printf("%3d",k);
			else {
				m++;
				printf("%3d",m);
			}
		}
		cout<<endl;
	}
	return 0;
}

22.输出如图所示的数字金字塔

                 1
               1 2 1
             1 2 3 2 1
           1 2 3 4 3 2 1
         1 2 3 4 5 4 3 2 1
       1 2 3 4 5 6 5 4 3 2 1
     1 2 3 4 5 6 7 6 5 4 3 2 1
   1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
#include <iostream>
using namespace std;
int main() {
	int k=1;
	for(int i=1 ; i<=9 ; i++) {
		int m=k;
		for(int j=1 ; j<=9-i ; j++)
			cout<<"  ";
		for(int j=1 ; j<=2*i-1 ; j++) {
			if(j<i)
				printf("%-2d",m++);
			/*等效代码:if(j<i) {
							printf("%-2d",m);
					   		m++;
					   }
			*/
			//故就j == i 时进入下一条语句时不加1,故if(j<i)而不是if(j<=i)
			else
				printf("%-2d",m--);
		}
		cout<<endl;
	}
	return 0;
}

27.输出如图所示上三角形式的乘法九九表

 1  2  3  4  5  6  7  8  9
 ----------------------------
  1  2  3  4  5  6  7  8  9
     4  6  8 10 12 14 16 18
        9 12 15 18 21 24 27
          16 20 24 28 32 36
             25 30 35 40 45
                36 42 48 54
                   49 56 63
                      64 72
                         81

#include <iostream>
using namespace std;

int main() {
	for(int i=1; i<10 ; i++)
		printf("%3d",i);
	cout<<endl;
	cout<<" ----------------------------\n";
	for(int i=1 ; i<=9 ; i++) {
		for(int j=1 ; j<=9 ; j++) {
			if(i<=j)
				printf("%3d",i*j);
			else
				printf("%3c",'\0');
		}
		cout<<endl;
	}
	return 0;
}

28.输出如图所示下三角乘法九九表

  1  2  3  4  5  6  7  8  9
 ----------------------------
                         81
                      64 72
                   49 56 63
                36 42 48 54
             25 30 35 40 45
          16 20 24 28 32 36
        9 12 15 18 21 24 27
     4  6  8 10 12 14 16 18
  1  2  3  4  5  6  7  8  9
#include <iostream>
using namespace std;

int main() {
	for(int i=1; i<10 ; i++)
		printf("%3d",i);
	cout<<endl;
	cout<<" ----------------------------\n";
	for(int i=9 ; i>0 ; i--) {
		for(int j=1 ; j<=9 ; j++) {
			if(i<=j)
				printf("%3d",i*j);
			else
				printf("%3c",'\0');
		}
		cout<<endl;
	}  
	return 0;
}
关于printf("%mc",‘字符’);的分析:

处理空格问题时,我们可以使用一个空字符(’\0’)来代替空格,这是一种新做法;使用%mc时,可以减少不必要的空格输入,比如输出" *"可以用%-2c代替,可以减少每行第一的字符前的空格,能减少不必要的输入

【2】空心图案

24.输入顶行字符和图形的高,输出菱形

  		A                       A
	  B	  B					   B B
	C		C				  C   C
  D           D				 D     D
E        1      E			E   2   E
  D           D				 D     D
    C       C				  C   C
	 B   B					   B B
	   A					    A  
                   
#include <iostream>
using namespace std;

int main() {
	void f(int n,int i,char ch);
	int n;
	char ch;
	do {
		cin>>ch>>n;
	}while(!isalpha(ch)); //当且仅当ch为字母时跳出循环(1)
	for(int i=0 ; i<n ; i++) {
		if(!isalpha(ch)) {     //当ch不是字母时
			if(islower(ch-1))  //当ch-1为Z时,ch=A,形成一个闭合的循环(2)
				ch='a';
			else
				ch='A';
		}
		f(n,i,ch);
		ch++;
	}
 	ch--;
	for(int i=n-2; i>=0; i--) {
		ch--;
		if(!isalpha(ch)) {  
			if(islower(ch-1))  //当ch-1为A时,ch=Z,形成一个闭合的循环(3)
				ch='z';
			else
				ch='Z';
		}
		f(n,i,ch);
	}
	return 0;
}
void f(int n,int i,char ch) { //1          
	for(int j=0 ; j<n-i-1; j++ )
		cout<<"  ";
	for(int j=0 ; j<2*i+1 ; j++ ) {
		if(j == 0)
			cout<<ch<<" ";
		else if(j == 2*i)
			cout<<ch;
		else
			cout<<"  ";
	}
	cout<<endl;
}
/*
void f(int n,int i,char ch) {  //2
	for(int j=0 ; j<n-i-1; j++ )
		cout<<" ";
	for(int j=0 ; j<2*i+1 ; j++ ) {
		if(j == 0 ||j == 2*i)
			cout<<ch;
		else
			cout<<" ";
	}
	cout<<endl;
}  */
	return 0;
}

分析:注意代码的三个注解:
(1)输入是在人手上输入的,如果一开始输入的不是字母,由于其是形成一个闭合的循环,所以如果你一开始输入非字母的字符,结果始终是从A开始,与题意(输入顶行字符和图形的高,输出菱形)不符;所以一旦不注意就会漏写。
(2)(3)题目的意思是最终结果都是由字母组成的,如果你不写这两段代码,结果会有非字母的形成。所以它要形成一个闭合的循环
(4)调用自定义函数时,如果不是用指针来做,就不能直接在自定义函数中改变参数的值,因为函数只是起调用作用

【3】较难题

标签:输出,ch,cout,int,c++,图形,main,输入
来源: https://blog.csdn.net/weixin_52963747/article/details/120340167

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有