2016-06-22 72 views
-2

我要打印的字*甚至*僅即使不包括第一和第二線(最終沒有最後兩行)線,但它的印刷15線,然後隨機在整個它打印一個*偶*。寬度爲6,高度爲15,我需要15行的總數,不多也不少。打印偶/奇對各行

#include <stdio.h> 

int main() 
{ 
int heightCounter, height, width, widthCounter, patternCounter; 

patternCounter=0; 

printf("enter a number\n"); 
    scanf("%d", &width); 

printf("enter a number\n"); 
    scanf("%d", &height); 

for (heightCounter=1; heightCounter<=height; heightCounter++) 
{ 
    patternCounter++; 

    while (patternCounter>2 && patternCounter%2==0) 
    { 
     printf("*even*\n"); 
     break; 
    } 


    for (widthCounter=1; widthCounter<=width; widthCounter++) 
    { 
     printf("*"); 

    } 

printf("\n"); 
} 

return 0; 
} 
+2

是什麼問題?如果你的代碼有問題,它是什麼?如果無條件地斷開''while循環,爲什麼還要麻煩? –

+0

我不老實地知道,我不知道如何使用不同的循環來格式化它。 –

+0

使用'if'而不是'while while' – HubertL

回答

0

如果不是使用while而是使用括號來定義優先級。

If ((patternCounter>2) &&  (patternCounter%2==0)) 
    { 
     printf("*even*\n"); 
     break; 
    } 
0

你的問題有點不清楚你正在嘗試做的事情,比「使用6寬度等,和15的高度,我需要15行共,不能多也不能少。 「從我所收集,糾正我,如果我錯了,但你要取值widthheight併爲前兩個最後兩行在你的射程高度你想打印什麼。對於它們之間的每一行,如果索引爲,甚至如果行索引爲奇數,則要打印"even",則要爲該行打印width'*'s

有許多不同的方式來理清邏輯。但是,一些筆記。首先,始終(總是)驗證用戶輸入。在使用scanf系列功能時,請至少檢查return以確保成功實現預期的轉換次數。例如:

printf ("enter a number: "); 
    if (scanf (" %d", &width) != 1) { 
     fprintf (stderr, "error: invalid input (width).\n"); 
     return 1; 
    } 

雖然你可以自由在需要時採取用戶輸入,在實踐中,需要的值一般爲參數通過。這就是int argcchar **argv適用於int main (int argc, char **argv)。在需要時進行用戶輸入,儘可能將值作爲參數傳遞給函數。

在到邏輯。如果我理解正確的目標,那麼無論邏輯將歸結爲迭代高度的範圍,並採取基於對每個高度索引中採取適當的行動。在你的例子中,你可以迭代for (x = 1; x <= height; ...),但通常在C中,你會看到迭代for (x = 0; x < height; ...)。兩者都是100%正確的,你可以自由地從任意值迭代到任意值,但是要知道所有的數組都是等爲零使0 < x < height爲一個範圍的自然迭代)

當您遍歷每一行索引時,有三個基本條件要檢查。第一個是「am我是前兩行還是最後兩行?」。如果是這樣,你想要做什麼和continue下一heither指數(下面的例子只是說明指數和產出<noprint>該行。下一步選擇將是檢查索引是否甚至。如果是這樣,您只需打印"even"continue到下一個索引。

注:最簡單的檢查是index & 1 - 該位01數爲odd,與1相與爲2考慮二進制(10)的結果是0,並且311)結果爲1,所以你即使測試簡直是if ((index & 1) == 0)index甚至

你將採取(如果你還沒有CON的最後一個動作在的下一個索引)只是輸出width'*'s之前去下一個索引。

注意:單獨ouputting單個字符的時候,不叫當所有需要的是輸出一個字符一個可變printf功能類似於使用大錘作爲一個蒼蠅拍只需使用putchar或者fputc代替)。

因此,您可以執行類似於以下的操作。

#include <stdio.h> 
#include <stdlib.h> 

enum { MAXW = 6, MAXH = 15 };  /* constants for width/height */ 

int main (int argc, char **argv) { 

    int w = argc > 1 ? atoi (argv[1]) : MAXW, /* take values from arguments */ 
     h = argc > 2 ? atoi (argv[2]) : MAXH, /* use MAXW/MAXH for defaults */ 
     i, j; 

    if (w < 0) w = -w;    /* prevent negative values */ 
    if (h < 0) h = -h; 

    for (i = 0; i < h; i++)   /* for each line */ 
    { 
     printf ("%2d : ", i);  /* line index (adjust by 1 if desired */ 

     if (i < 2 || i > h - 3) { /* skip 2 on either end of range */ 
      printf ("<noprint>\n"); 
      continue; 
     } 

     if ((i & 1) == 0) {   /* if even (LSB = 0) */ 
      printf ("even\n"); 
      continue; 
     } 

     for (j = 0; j < w; j++)  /* otherwise 1 '*' per-width */ 
      putchar ('*'); 
     putchar ('\n'); 
    } 

    return 0; 
} 

實施例使用/輸出

對於在0 - 4的範圍的高度,<noprint>是所有輸出(顯示在的範圍任一端省略第一和最後兩行)

$ ./bin/evenstar 6 4 
0 : <noprint> 
1 : <noprint> 
2 : <noprint> 
3 : <noprint> 

對於任何範圍> 4如果行索引是even打印even,否則打印寬度'*'s,如

$ ./bin/evenstar 6 7 
0 : <noprint> 
1 : <noprint> 
2 : even 
3 : ****** 
4 : even 
5 : <noprint> 
6 : <noprint> 

爲了您的w = 6h = 15例如:

$ ./bin/evenstar 
0 : <noprint> 
1 : <noprint> 
2 : even 
3 : ****** 
4 : even 
5 : ****** 
6 : even 
7 : ****** 
8 : even 
9 : ****** 
10 : even 
11 : ****** 
12 : even 
13 : <noprint> 
14 : <noprint> 

除了上述if陳述邏輯,你也可以使用一個switch聲明採取適當行動的每個值身高指數。儘管在這裏,簡單的if可能是你最好的選擇。看看它,讓我知道你是否有任何問題,或者如果我理解你正在努力完成的事情。如果沒有,請讓我知道,我很樂意進一步提供幫助。