• 締切済み

コマンドライン引数

コマンドライン引数で以下のようなプログラムを実行したいのですが どうしたらいいのか分かりません!! みなさんの意見を聞かせてください(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 */

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.12

>printf( &"□\0☆\0★"[ (((j % 3) == 1) + ((i % 4) == 1)) * 3 ] ); >の間違いでは?? はい。 良く見たら間違いになってしまいました。 ご指摘!有り難うございます。 『&』文字が足りませんでした。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.11

>Oh-Orangeさん printf( &"□\0☆\0★"[ (((j % 3) == 1) + ((i % 4) == 1)) * 3 ] ); の間違いでは??

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.10

★yaemon_2006 さんへ。 >printf("%.2s", &"□☆★"[(((j % 3) == 1) + ((i % 4) == 1)) * 2]);  の1行にまとめるなら  printf( "□\0☆\0★"[ (((j % 3) == 1) + ((i % 4) == 1)) * 3 ] );  の1行にすることも出来ます。 ・以上。

回答No.9

  #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)
回答No.8

★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( "☆" );  }  です。 ・こんな解説で分かりましたか?違い。 ・以上。

akkakkakk
質問者

お礼

無事にプログラムを作成することができました!! どうもありがとうございます(★′p∀`q)+゜ 大変分りやすい説明、助かりました!

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.7

★訂正。 ・最後の1行 >質問者さんの1箇所を if から else if にするだけで正しく表示されます。  はまだ正しくなかった。  『★』の表示が出ないね。 ・あまり複雑にしないともっと楽にソースを記述してみて下さい。  回答 No.6 を参考にして。 ・以上。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★間違いは。 >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)
回答No.5

#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); }

akkakkakk
質問者

お礼

実に参考になりました!! お陰様で無事に完成させることができました((*´∀`*)) どうもありがとうございました!!

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★追記。 ・コマンドライン引数を 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)
回答No.3

★えっ 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() で表示できるようにしてみて下さい。 ・それでは。また。

akkakkakk
質問者

補足

まだ未完成なのですが・・・・ #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); } どこがダメでしょうか??

関連するQ&A