-
1 # 碼中尋樂
-
2 # 特別行動科
畫圖畫圖(不畫圖難以會意)。下面是一個草圖(找了個線上白板畫的,漂亮吧~^(* ̄(oo) ̄)^)。
如圖所示,假設要畫一個規格為2a*2b的◇。a,b分別為對應方向的中心位置。不難看出,程式一共需要列印2b+1行,2a+1列(因為第0行0列也是需要列印的,但是程式是從0開始計數的,因此最後的行列下標就是2a和2b,2a+1和2b+1是數量)。
程式列印通常會使用空格和*作為列印菱形的字元,由於基本的輸出單位是字元(相當於菱形內的所有角的大小是固定的,不論多麼大的菱形都是相似的),所以2a和2b會相互制約。我想列印一個10*50的菱形時,當列印到第5行是就已經從橫向偏移量為0的位置開始列印了,第6行將會從-1列開始列印,這樣打印出的圖案將會是一個不完成的菱形,如下圖,虛線部分將不會被列印。
程式以行為輸出,因此我們不在控制y軸,只通過控制x軸方向的a來控制菱形的大小。我們不妨來歸納一下列印的規則:
第0行需要列印a個空格、列印一個*、換行。
第1行需要列印a-1個空格、列印1個*、列印1個空格、列印1個*、換行。
第2行需要列印a-2個空格、列印1個*、列印3個空格、列印1個*、換行。
第3行需要列印a-3個空格、列印1個*、列印5個空格、列印1個*、換行。
第n行需要列印a-n個空格、列印1個*、列印2n-1個空格、列印1個*、換行。
一直需要列印到n==a。列印0個空格、列印1個*、列印2a-1個空格、列印1個*、換行。
之後開始往回畫。
第a+1行需要列印1個空格、列印1個*、列印2a-3個空格、列印1個*、換行。
第a+2行需要列印2個空格、列印1個*、列印2a-5個空格、列印1個*、換行。
第a+m行需要列印m個空格、列印1個*、列印2a-(2m+1)個空格、列印1個*、換行。
當列印到2a-(2m+1)<0[2a-2m<1=>m==a]時,則只直接列印換行,結束程式。
不難計算得出,一共需要列印2a+1行(和上面的2b+1相對應)。
示例如下圖,網格里的大點點就是我們需要列印的點:
這樣,虛擬碼基本就出來了:
引數:a 橫向的中心點
// 列印上半截
for(n = 0; i <= a; n ++){
// 列印一行內容
for(i = 0; i < a-n; i ++){
print(" ");//列印a-n個空格
}
print("*");//列印1個*
if((2n - 1) < 0){
print("\n");// 未列印空格直接換行
continue;
}
for(i = 0; i < (2n - 1); i ++){
print(" ");//列印2n - 1個空格
}
print("*");// 列印1個*
print("\n");// 換行
}
// 列印下半截
for(m = 1; m <=a; m ++){
for(i = 0; i < m; i ++){
print(" ");// 列印m個空格
}
print("*");// 列印1個*
if(2a-(2m+1) < 0){
print("\n");// 換行
break;// 終止程式
}
for(i = 0; i < 2a-(2m+1); i ++){
print(" ");// 列印2a-(2m+1)個空格
}
print("*");// 列印1個*
print("\n");// 換行
}
以上就思路啦,趕緊去試一試吧~
以上內容只是說明了思路,大家還有什麼好方法呢?一起來聊聊吧~
我是一名程式設計師,更多精彩請關注:空心小窩頭 -
3 # elverys
我們在學習語言過程中,其實每種語言都有它自身的特點,用C語言可以實現for迴圈打出一個空心菱形,其實用Python,java,C++,Shell等都可以打印出一個空心菱形。
用Python語言for迴圈打出一個空心菱形程式碼如下:
n=input("請輸入菱形每邊星星個數,n= ")
n=int(n)
m=t=2*n-1 #雙重賦值
while m=1:
if(m==t or m==1):#列印第一行和最後一行
print(" "*n + "*" + " "*4*(n-1))
elif(m=n):#列印下半部分
print(" "*(m-n+1)+"*"+" "*(2*(t-m)-1)+" *")
else:#列印上半部分
print(" "*(n-m+1)+"*"+" "*(2*m-3)+" *")
m-=1
用c語言for迴圈打出一個空心菱形程式碼如下:
//菱形
#include stdio.h
void main()
{
int i,j;
//菱形的上半部分的三角形
for(i=0;i4;i++)
{
for(j=3;ji;j--)
{
printf(" ");
}
for(j=0;j2*i+1;j++)
{
printf("*");
}
printf("\n");
}
//下半部分的倒三角形
for(i=0;i3;i++)
{
for(j=0;ji+1;j++)
{
printf(" ");
}
for(j=6;j2*i+1;j--)
{
printf("*");
}
printf("\n");
}
printf("\n");
//空心菱形
//空心菱形的上半部分
for(i=0;i4;i++)
{
for(j=0;j4-i;j++)
{
printf(" ");
}
for(j=0;j2*i+1;j++)
{
//判斷在需要列印的地方的第一位和最後一位列印*號,中間位置空格
if((j==0)||(j+1==2*i+1))
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
for(i=0;i3;i++)
{
for(j=0;ji+2;j++)
{
printf(" ");
}
for(j=6;j2*i+1;j--)
{
//判斷在需要列印的地方的第一位和最後一位列印*號,中間位置空格
if((j==6)||(j-1==2*i+1))
{
printf("*");
}
else{
printf(" ");
}
}
printf("\n");
}
printf("\n");
//數字的排列
for(i=1;i6;i++)
{
for(j=1;ji+1;j++)
{
printf("%d",j);
}
for(j=1;ji;j++)
{
printf("%d",i-j);
}
printf("\n");
}
for(i=5;i1;i--)
{
for(j=1;ji;j++)
{
printf("%d",j);
}
for(j=2;ji;j++)
{
printf("%d",i-j);
}
printf("\n");
}
printf("\n");
}
用Java語言for迴圈打出一個空心菱形程式碼如下:
public static void main(String[] args) {
int line = 99;//列印行數
int blank2 = (line-1)/2;//最大空格數
for(int i=0;iline;i++){
int blank = (blank2-i)0?blank2-i:-(blank2-i);//每次空格數
for(int j=0;jline;j++){
// if(j=blankjline-blank){//列印實心菱形方法
// System.err.print("*");
// }else{
// System.err.print(" ");
// }
if(j==blank||j==(line-blank)-1){//列印空心菱形方法
System.err.print("*");
}else{
System.err.print(" ");
}
}
System.err.println();
}
}
用C++語言for迴圈打出一個空心菱形程式碼如下:
#include iostream
using namespace std;
int main(int argc, char** argv) {
int n;
cout "input a numer n: ";
cin n;
for (int i = 1; i = n; i++) {
for (int j = n - i - 1; j = 0; j--) {
cout " ";
}
cout i;
for (int j = 4 * (i - 1) - 2; j = 0; j--) {
cout " ";
}
if (i == 1) {
cout endl;
} else {
cout i endl;
}
}
for (int i = 1; i n; i++) {
for (int j = 1; j i + 1; j++) {
cout " ";
}
cout n - i;
for (int j = 4 * (n - i - 1) - 2; j = 0; j--) {
cout " ";
}
if (i == n - 1) {
cout endl;
} else {
cout n - i endl;
}
}
system("pause");
return 0;
}
用Shell語言for迴圈打出一個空心菱形程式碼如下:
#!/bin/bash
read -p "輸入菱形半徑:" r
for((y=0; y=2*r; y++))
do
for((x=0; x=2*r; x++))
do
#if ((y==-x+r || y==-x+3*r || y==x+r || y==x-r)) 空心
if ((y=-x+r y=-x+3*r y=x+r y=x-r)) #實心
then
echo -n "*"
else
echo -n " "
fi
done
echo ""
done
回覆列表
程式碼截圖:
執行效果截圖:
程式碼:
void print_polygon(int rows)
{
if (rows % 2 == 0)
rows++;
int dir = 1;
int cx = rows / 2;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows; j++) {
int offset = i;
if (i > rows / 2)
offset = rows - i - 1;
if (j == cx - offset || j == cx + offset)
printf("*");
else
printf(" ");
}
printf("\n");
}
}