你的問題有點不清楚你正在嘗試做的事情,比「使用6寬度等,和15的高度,我需要15行共,不能多也不能少。 「從我所收集,糾正我,如果我錯了,但你要取值width
和height
併爲前兩個和最後兩行在你的射程高度你想打印什麼。對於它們之間的每一行,如果索引爲,甚至如果行索引爲奇數,則要打印"even"
,則要爲該行打印width
'*'s
。
有許多不同的方式來理清邏輯。但是,一些筆記。首先,始終(總是)驗證用戶輸入。在使用scanf
系列功能時,請至少檢查return
以確保成功實現預期的轉換次數。例如:
printf ("enter a number: ");
if (scanf (" %d", &width) != 1) {
fprintf (stderr, "error: invalid input (width).\n");
return 1;
}
雖然你可以自由在需要時採取用戶輸入,在實踐中,需要的值一般爲參數通過。這就是int argc
和char **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
- 該位0
是1
數爲odd
,與1
相與爲2
考慮二進制(10
)的結果是0
,並且3
(11
)結果爲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 = 6
和h = 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
可能是你最好的選擇。看看它,讓我知道你是否有任何問題,或者如果我理解你正在努力完成的事情。如果沒有,請讓我知道,我很樂意進一步提供幫助。
是什麼問題?如果你的代碼有問題,它是什麼?如果無條件地斷開''while循環,爲什麼還要麻煩? –
我不老實地知道,我不知道如何使用不同的循環來格式化它。 –
使用'if'而不是'while while' – HubertL