- 締切済み
コマンドライン引数
コマンドライン引数で以下のようなプログラムを実行したいのですが どうしたらいいのか分かりません!! みなさんの意見を聞かせてください(lll´Д`lll) □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ プログラムは途中まで作ったのですが、肝心なとこは 全く分りませんっっ #include <stdio.h> int main(int argc, char *argv[]) { int yoko, tate, i, j; if( argc < 3 ) return(1); sscanf( argv[1], "%d", &yoko ); sscanf( argv[2], "%d", &tate ); for( j = 0; j < tate; j++ ) { printf("\n"); } return(0); } /* end of pat2.c */
- みんなの回答 (12)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
>printf( &"□\0☆\0★"[ (((j % 3) == 1) + ((i % 4) == 1)) * 3 ] ); >の間違いでは?? はい。 良く見たら間違いになってしまいました。 ご指摘!有り難うございます。 『&』文字が足りませんでした。
- aris-wiz
- ベストアンサー率38% (96/252)
>Oh-Orangeさん printf( &"□\0☆\0★"[ (((j % 3) == 1) + ((i % 4) == 1)) * 3 ] ); の間違いでは??
- Oh-Orange
- ベストアンサー率63% (854/1345)
★yaemon_2006 さんへ。 >printf("%.2s", &"□☆★"[(((j % 3) == 1) + ((i % 4) == 1)) * 2]); の1行にまとめるなら printf( "□\0☆\0★"[ (((j % 3) == 1) + ((i % 4) == 1)) * 3 ] ); の1行にすることも出来ます。 ・以上。
- yaemon_2006
- ベストアンサー率22% (50/220)
#include <stdio.h> int main(int argc, char *argv[]) { int yoko, tate, i, j; if( argc < 3 ) return 1; sscanf( argv[1], "%d", &yoko ); sscanf( argv[2], "%d", &tate ); for( j = 0; j < tate; j++ ){ for(i = 0; i < yoko; i ++){ printf("%.2s", &"□☆★"[(((j % 3) == 1) + ((i % 4) == 1)) * 2]); } printf("\n"); } return 0; }
- Oh-Orange
- ベストアンサー率63% (854/1345)
★if()文が2つの理由が分かりました。 ・サンプル3を元に解説します。 >if ( (y % 3) == 1 ){ > printf( ((x % 4) == 1) ? "★" : "☆" ); >} >else{ > printf( ((x % 4) == 1) ? "☆" : "□" ); >} これを言葉で説明すると 『★』は (y % 3) == 1 かつ ((x % 4) == 1) の条件で表示 『☆』は (y % 3) == 1 かつ ((x % 4) != 1) の条件で表示 『☆』は (y % 3) != 1 かつ ((x % 4) == 1) の条件で表示 『□』は (y % 3) != 1 かつ ((x % 4) != 1) の条件で表示 となる。 ・ここで『☆』の条件が2行になっているので先に『★』と『□』を表示して残りを 『☆』が表示されるようにすれば良い。 もう少し分かりやすく書けば if ( (y % 3) == 1 かつ ((x % 4) == 1) ){ 『★』 } else if ( (y % 3) != 1 かつ ((x % 4) != 1) ){ 『□』 } else{ 『☆』 } となります。 ・質問者さんのは >if ( (y%3 == 1) || (x%4 == 1) ){ > printf( "☆" ); >} >else if ( (y%3 == 1) && (x%4 == 1) ){ > printf( "★" ); >} >else{ > printf( "□" ); >} これですがいくつか違いますね。 ・正しくは if ( ((y % 3) == 1) && ((x % 4) == 1) ){ printf( "★" ); } else if ( ((y % 3) != 1) && ((x % 4) != 1) ){ printf( "□" ); } else{ printf( "☆" ); } です。 ・こんな解説で分かりましたか?違い。 ・以上。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★訂正。 ・最後の1行 >質問者さんの1箇所を if から else if にするだけで正しく表示されます。 はまだ正しくなかった。 『★』の表示が出ないね。 ・あまり複雑にしないともっと楽にソースを記述してみて下さい。 回答 No.6 を参考にして。 ・以上。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★間違いは。 >if(j%3 == 1 || i%4 == 1) > printf("☆"); >if(j%3 == 1 && i%4 == 1) > printf("★"); >else > printf("□"); 2つ目の if を else if にしていないからです。 ここさえ直せば正しく表示されます。 でもちょっと複雑ですね。 もうほとんど出来ているので私の回答を3つ載せます。 参考にして下さい。 サンプル1: for ( y = 0 ; y < tate ; y++ ){ if ( (y % 3) == 1 ){ for ( x = 0 ; x < yoko ; x++ ){ if ( (x % 4) == 1 ){ printf( "★" ); } else{ printf( "☆" ); } } } else{ for ( x = 0 ; x < yoko ; x++ ){ if ( (x % 4) == 1 ){ printf( "☆" ); } else{ printf( "□" ); } } } printf( "\n" ); } サンプル2: for ( y = 0 ; y < tate ; y++ ){ if ( (y % 3) == 1 ){ for ( x = 0 ; x < yoko ; x++ ){ printf( ((x % 4) == 1) ? "★" : "☆" ); } } else{ for ( x = 0 ; x < yoko ; x++ ){ printf( ((x % 4) == 1) ? "☆" : "□" ); } } printf( "\n" ); } サンプル3: for ( y = 0 ; y < tate ; y++ ){ for ( x = 0 ; x < yoko ; x++ ){ if ( (y % 3) == 1 ){ printf( ((x % 4) == 1) ? "★" : "☆" ); } else{ printf( ((x % 4) == 1) ? "☆" : "□" ); } } printf( "\n" ); } どれも同じ表示になります。 質問者さんの1箇所を if から else if にするだけで正しく表示されます。 修正してみて下さい。 以上。
- zwi
- ベストアンサー率56% (730/1282)
#1です。 すごく惜しいところまで来ていたので、元のコードの生かして修正してみました。 問題点は1ポイントだけです。 #include <stdio.h> int main(int argc, char *argv[]) { int yoko, tate, i, j; if( argc < 3 ) return(1); sscanf( argv[1], "%d", &yoko ); sscanf( argv[2], "%d", &tate ); for( j = 0; j < tate; j++ ) { for( i = 0; i < yoko; i++ ) { if(j%3 == 1 && i%4 == 1) // こっちが先ですね。 printf("★"); else // ★じゃ無い場合で分ける必要があります。 if(j%3 == 1 || i%4 == 1) printf("☆"); else printf("□"); } printf("\n"); } return(0); }
お礼
実に参考になりました!! お陰様で無事に完成させることができました((*´∀`*)) どうもありがとうございました!!
- Oh-Orange
- ベストアンサー率63% (854/1345)
★追記。 ・コマンドライン引数を sscanf() で整数にしなくても atoi() 関数でも整数として tate、yoko 変数にセットできます。 つまり下のようになります。 サンプル: #include <stdio.h> #include <stdlib.h> ←atoi()のため // メイン関数 int main( int argc, char *argv[] ) { int x, y, tate, yoko; ←i, j より x, y の方が分かりやすいと思う(私は) if ( argc < 3 ){ printf( "USAGE: pat2.exe <yoko> <tate>\n" ); return 1; } yoko = atoi( argv[1] ); tate = atoi( argv[2] ); for ( y = 0 ; y < tate ; y++ ){ if ( (y % 3) == 1 ){ ←ここで『□行』と『☆行』の処理を分ける : } else{ : } printf( "\n" ); } return 0; } 以上。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★えっ if() 文が2つですか。 >if文を2つ作ればいいってことですよね?? ・私は for() 文を3つ、if() 文を3つ使うバージョンと for() 文を3つ、if() 文を1つ使うバージョンとのソースを頭に浮かべましたが。 if() 文が2つですか? if() 文を1つ使うバージョンでは4で割ったときの『★』『☆』などの表示は 条件演算子(a ? b : c)を使うことを想定しています。 無理やり if() 文を2つ使うようにも出来ますがちと中途半端な気がします。 ・ソースを見せてくれますか? そしたら分かります。 それに for() 文を2段使って縦と横の表示の雛形を作ってから改良した方が 分かりやすいかもしれない。まずは tate、yoko 変数より長方形の図形を printf() で表示できるようにしてみて下さい。 ・それでは。また。
補足
まだ未完成なのですが・・・・ #include <stdio.h> int main(int argc, char *argv[]) { int yoko, tate, i, j; if( argc < 3 ) return(1); sscanf( argv[1], "%d", &yoko ); sscanf( argv[2], "%d", &tate ); for( j = 0; j < tate; j++ ) { for( i = 0; i < yoko; i++ ) { if(j%3 == 1 || i%4 == 1) printf("☆"); if(j%3 == 1 && i%4 == 1) printf("★"); else printf("□"); } printf("\n"); } return(0); } どこがダメでしょうか??
- 1
- 2
お礼
無事にプログラムを作成することができました!! どうもありがとうございます(★′p∀`q)+゜ 大変分りやすい説明、助かりました!