***** ***** ***** ***** *****
#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; }
* * * * * * * * * * * * * * * * * * * * * * * * *
#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; }
* * * * * * * * * * * * * * * * * * * * * * * * *
#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; }
* * * * * * * * * * * * * * * * * * * * * * * * *
#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; }
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#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变化时图形发生的变化。行与行之间的距离相当与一个空格,故每行*之间的距离是一个空行
* * * * * * * * * * * * *
#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; }
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#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; }
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#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; }
* * * * * * * * * * * * * * * * * * * * *
#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; }
注:
针对上下对称的图形,一般的做法是将其分成上半部分,中间部分,下半部分。对于上下部分,由于其对称性这样会产生很多重复代码,这个时候可以自定义函数来处理重复代码。对于中间部分,有时可以写在上半部分(下半部分),有时要单独分析,这时一定要看样例分析。
* * * * * * * * * * * * *
//数组 #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; }
注:
图形的输出还可以用数组来处理,有时处理会简单,有时处理会很繁杂,具体要看题目要求。
* * * * * * * * * * * * *
#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; }
* * ** * * * * * * * * ** * *
#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; }
* * * * * * * * *
#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; }
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; }
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时才输出数字。
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; }
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; }
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; }
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; }
处理空格问题时,我们可以使用一个空字符(’\0’)来代替空格,这是一种新做法;使用%mc时,可以减少不必要的空格输入,比如输出" *"可以用%-2c代替,可以减少每行第一的字符前的空格,能减少不必要的输入
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)
调用自定义函数时,如果不是用指针来做
,就不能直接在自定义函数中改变参数的值,因为函数只是起调用作用