*
我在特定的行和列中使用 V 列印。我有很多if
陳述。我在下面分享我的代碼。
是否有任何優化的方法可以在 10X10 行列中列印 V 圖案?(沒有很多if
條件)?
#include <stdio.h>
int main() {
int row, column;
for (row = 1; row <= 10; row ) {
for (column = 1; column <= 10; column ) {
if (row == 1 && (column == 1 || column == 10)
|| row == 3 && (column == 2 || column == 9)
|| row == 5 && (column == 3 || column == 8)
|| row == 7 && (column == 4 || column == 7)
|| row == 10 && column == 5)
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
uj5u.com熱心網友回復:
這段代碼考慮了行和*位置之間的關系,如果你在第一行,那么我們要第0列和第9列列印*,然后第二行,我們要第1列和第8列等等. 因此,我對行使用迭代器,對列使用迭代器,以在具體行中知道我正在列印哪一列。
#include <stdio.h>
int main()
{
int matrix_size = 10; //Assuming is squared matrix 10x10
int counter = 0;
int i,j;
for(i=0;i<(int)(matrix_size/2);i ) {
for(j=0;j<matrix_size;j ) {
if(j==i || j==(matrix_size-1-i)) {
printf("*");
}else{
printf(" ");
}
}
printf("\n");
}
return 0;
}
編輯:與 tshiono 解決方案相比,我僅將 V 寫入 5 行,他將其列印為 10 行,但假設每行之間有一個空格線。這兩種解決方案都可以,具體取決于您想要什么。
uj5u.com熱心網友回復:
我不認為這是經過優化的,但會更簡單且可通過 SIZE 進行擴展。
#include <stdio.h>
#define SIZE 10
#define MID ((SIZE-1)/2) // midst position of SIZE
#define ABS(x) ((x)<0?-(x):(x)) // absolute value of x
int main()
{
int i, j;
for (i = 0; i < SIZE; i ) {
for (j = 0; j < SIZE; j ) {
if (i % 2 == 0 && ABS(j - MID) == MID - i / 2) putchar('*');
else putchar(' ');
}
putchar('\n');
}
return 0;
}
uj5u.com熱心網友回復:
為了使 V 形對稱,行數和列數應該是奇數。這是一個更簡單的方法:
#include <stdio.h>
#include <stdlib.h>
int main() {
for (int n = 11, row = 0; row < n; row ) {
for (int column = 0; column < n; column )
putchar(" *"[2 * abs(column - n / 2) == n - 1 - row]);
printf("\n");
}
return 0;
}
輸出:
* *
* *
* *
* *
* *
*
對于較厚的 V 形:
#include <stdio.h>
#include <stdlib.h>
int main() {
for (int n = 11, row = 0; row < n; row ) {
for (int column = 0; column < n; column )
putchar(" *"[abs(2 * abs(column - n / 2) - (n - 1 - row)) <= 1]);
printf("\n");
}
return 0;
}
輸出:
* *
** **
* *
** **
* *
** **
* *
** **
* *
***
*
uj5u.com熱心網友回復:
其他答案考慮了 V 的特定形狀并圍繞它進行優化。
我建議任何形狀的優化解決方案。
這涉及到一個查找表,其中包含*
構成該形狀的字符的所有位置。
struct { int row,col; } shape[] = {
{1,1}, {1,10}, {3,2}, {3,9}, {5,3}, {5,8}, {7,4}, {7,7}, {10,5},
{-1,-1}
};
最后一個位置 ( ) 與終止字串{-1,-1}
的目的相同。'\0'
uj5u.com熱心網友回復:
當您需要輸出任意數量的空格時,一個合理的選擇是使用printf
字串寬度說明符左填充空格:
printf("%*s*", spaces, "");
上面將輸出空字串,填充到整數 value 的寬度spaces
,然后輸出 a *
。請注意,格式字串%*s
意味著您同時指定寬度和字串作為額外引數。在那個部分與實際*
無關。我們將其添加到格式字串的末尾。 *
因此,對于 V 形,每一行都有兩個*
字符,除了最后一行(如果寬度是奇數)。直觀地做到這一點的一種方法是跟蹤每行 V 的左右部分的位置,然后計算確定要添加多少填充。
例子:
void v(int width)
{
int l = 0, r = width;
for (; l < r; l , r--)
{
printf("%*s*%*s\n", l, "", r-l, "*");
}
if (l == r)
printf("%*s*\n", l, "");
}
如果您真的想要更精簡的代碼,您可以選擇將最后一行滾動到回圈中。在這種情況下,當l == r
您只想輸出一個星號時。否則你想要兩個。所以你可以輸出字串&"*"[l==r]
——這意味著當l==r
它為真時,你會跳過星號,它看起來像一個空字串(因為你落在 NUL 終止符上)。
請注意,這不是很好的風格。它為了緊湊而犧牲了可讀性。
void v(int width)
{
for (int l = 0, r = width; l <= r; l , r--)
{
printf("%*s*%*s\n", l, "", r-l, &"*"[l==r]);
}
}
因此,就緊湊的代碼和不多的函式呼叫而言,這是“高效的”。如果您擔心的是格式決議,printf
那么您可以完全避免它。下面,我們使用相同的左/右邊界,并使用回圈遍歷每一行。這基本上完成了我們printf
在內部所做的事情,只是發生了什么更明顯:
void v(int width)
{
int l = 0, r = width-1;
for (; l <= r; l , r--)
{
int x = 0;
for (; x < l; x ) putchar(' ');
putchar('*');
if (x < r)
{
for (x ; x < r; x ) putchar(' ');
putchar('*');
}
putchar('\n');
}
}
現在找點樂子...
作為練習,這是一種printf
方法,但沒有回圈(使用遞回):
void vv(int width, int row) {
if(width >= 0) {
printf("%*s*%*s\n", row, "", width, &"*"[width==0]);
vv(width-2, row 1);
}
}
void v(int width) {
vv(width, 0);
}
這就是這個想法變成了一個看起來很酷的故意可怕的混亂。;)
#include <stdio.h>
#define VV int
#define vV "*\0%*s%*s\n"
VV Vv( VV v ,VV
vv){if(v -->0){
printf (vV 2,
vv ,vV,v
,vV !v);
Vv(-- v,vv
);}} VV V
(VV v){
Vv(v,
1);
}
int main() {
for (int v = 1; v < 12; v ) {
printf("size %d\n", v);
V(v);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/491232.html
下一篇:有條件地從資料框中洗掉行