• ベストアンサー

最大値を出力するプログラム(@ARGV)

Wernerの回答

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

> それが次の数字より小さいなら$maxにその次の数字を > 代入していき、それを繰り返すのだと思うのですが その通りです。 > その繰り返し方はwhileを使うと思うのですが 繰り返しができる構文(whileなど)を使って 配列の全要素を調べればいいです。 以下にいくつか例を挙げておきます。 --------例1-------- $max = shift(@ARGV); while( ($temp=shift(@ARGV)) != undef ){   if ($max<$temp){     $max=$temp;   } } print "$max\n"; --------例2-------- $max = shift(@ARGV); $i=0; while($i<=$#ARGV){   if ($max<@ARGV[$i]){     $max=@ARGV[$i];   }   $i++; } print "$max\n"; --------例3-------- $max = shift(@ARGV); for($i=0; $i<=$#ARGV; $i++){   if ($max<@ARGV[$i]){     $max=@ARGV[$i];   } } print "$max\n"; --------例4-------- $max = shift(@ARGV); foreach $temp (@ARGV){   if ($max<$temp){     $max=$temp;   } } print "$max\n";

akka99ei8cm
質問者

お礼

さまざまな例を挙げてくださりありがとうございます。 いくつか方法があるのですね。 おかげで理解することができました。 本当に助かりました。

関連するQ&A

  • $argv[1]) && $argv[1]・同じ

     以下のプログラムですが! <html> <head> <meta "charset=utf-8" /> <title>論理演算子</title> </head> <body> <?php if(isset($argv[1]) && $argv[1]) { echo '与えられた引数は真です',PHP_EOL; } else{ echo '引く数が与えられていないか、与えられた引数が真ではありません' ,PHP_EOL; } ?> </body> </html> 以上のプログラムの実行結果は以下となりました。    引く数が与えられていないか、与えられた引数が真ではありません 以上の実行結果は”真でありません”と出ています。    $argv[1]) && $argv[1]・・・&&は理論積の、両辺は同じなのでtrueならばtrueの真だから、  "与えられた引数は真です"と出るのではないんでしょうか!?  以上よろしくお願いします。

    • ベストアンサー
    • PHP
  • = $argv[1];はどんな働きがありますか!?

    <?php // stringcast.php if (!isset($argv[1])) { exit; } $num = $argv[1]; if ($num == 100) {  ←(1) echo "num is 100", PHP_EOL; } else { echo "num is not 100",PHP_EOL; } このプログラムを %php stringcast.php100 のように実行する、引数の100はPHP文字列型として渡されます。  したがって、(1)の比較では、文字列"100"の入って変数$numと、整数100が比較されるため、 文字列"100"は整列100へとキャストされまた後、比較演算が実行されます。  今回は、動作の結果に違いはありませんが、ここで整数同士を比較しているつもりでも実際には 文字列を整数の比較が行われ、キャストが発生している、という挙動を把握しているか、していない かではなく大きな違いがあります。引数とし期待している値の型が決まっている場合、明示的にキャ ストを行い、厳密な比較演算子(===など)を用いるほうが安全です。 -------------------------------------------------------- 以上、参考書をまるごと入力しました。  そこで $num = $argv[1];で!$argv[1]とはこのプログラムではどんな働きがあるのでしょうか!?  ($argv[1];を$numに代入だと思います。間違っていたなら御免なさい。)  宜しくお願いします。  なお・批判的なご回答はお控えくださいませ。  

    • ベストアンサー
    • PHP
  • printf、最大値の出し方

    3つの整数を入力し、どれが最大値かを判別するプログラムを作りたいです。 #include<stdio.h> main() { int i, x, max; max = 0; i = 1; while(i <= 3) { printf("整数:"); scanf("%d",&x); if (x > max) { max = x; } i++; } printf("最も大きい整数は%d\n", max); } とすると 整数:と3回表示されますが、これを一つ目の整数:、二つ目の整数:3つ目の整数:と表示されるようなプログラムにするにはどうしたらよいでしょうか。

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • C言語 最大値と最小値を求めて表示するプログラム

    はじめまして。 C言語を学習中です。 下記の問題演習の解答として記載されているプログラムがどうしても理解できません。 特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。 while (array[i] != -1) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; 具体的に教えてください。 よろしくお願い致します。 ●問題 0~100の範囲で入力された複数の数値の中から、 最大値と最小値を求めて表示するプログラムを作成せよ。 -1が入力された場合は入力の終わりと判定する。 ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。 また、入力された数値を記憶する配列の要素数は10とし、 それ以上入力された場合はエラーが起きても仕方ないこととする。 ヒント:配列の中に -1 があればデータの終わりだと判断できる。 ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。 ●解答 #include <stdio.h> void maxmin(int array[],int *max,int *min); int main(void) { int i = 0,array[10],max,min; do { printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++; } while (array[i - 1] != -1); maxmin(array,&max,&min); printf("最大値 %d : 最小値 %d\n",max,min); return 0; } void maxmin(int array[],int *max,int *min) { int i = 0; *max = 0; *min = 100; while (array[i] != -1) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; } }

  • $argv[1] の真偽判定

    PHPの勉強を始めた初心者です。 次のようなスクリプトを書いてみたのですが、false と入力しても、真と判定されてしまいます。 何故こうなるのか、お教えいただければ幸いです。 <?php // p075_a.php if( isset($argv[1]) && $argv[1] ) { echo "与えられた引数は真です\n"; } elseif ( isset($argv[1]) && !$argv[1] ) { echo "与えられた引数は偽です\n"; } else { echo "引数が与えられていません\n"; } [study_php@localhost ch03]$ php p075_a.php '' 与えられた引数は偽です [study_php@localhost ch03]$ php p075_a.php "" 与えられた引数は偽です [study_php@localhost ch03]$ php p075_a.php 0 与えられた引数は偽です [study_php@localhost ch03]$ php p075_a.php 0.0 与えられた引数は真です [study_php@localhost ch03]$ php p075_a.php false 与えられた引数は真です [study_php@localhost ch03]$

    • ベストアンサー
    • PHP
  • 全組み合わせの出力プログラム

    $kana1[0][0] = "a"; $kana1[0][1] = "u"; $kana1[1][0] = "n"; $kana1[1][1] = "m"; という二次元配列があったときに an am un um と出力するようなプログラムのアルゴリズム(?)を教えてほしいです。 簡単なようでforループでやるとうまくいかずwhileを使ってフラグ変数とか作ってやってみましたがどうも駄目です。 ヒントでも何でもいいのでよろしくお願いします! むしろ二次元配列を使うのがダメなら言って下さるとありがたいです。 よろしくお願いします。 最終的には二次元配列の縦も横も任意の数のときにすべての組み合わせを出力できるようにならなければなりません。

    • ベストアンサー
    • Perl
  • perlでcsvファイルから複数行を抽出したい

    プログラミング初心者です。 お知恵をお貸しください。 perlでcsvファイルから任意の複数行を、コマンドライン引数を使って抜き出したいです。 1行だけだとうまくいきますが、以下ではすべてのcsvデータが出力されてしまいます。 ----------------------getcsv.pl ここから---------------------- #!/usr/bin/perl -- use strict; use warnings; open(IN, "<adata.csv"); open (OUT, ">$bdata.csv"); while(<IN>){ if($. == $ARGV[0] || $ARGV[1] || $ARGV[2] || $ARGV[3]) { print OUT $_; } } close(IN); close (OUT); ----------------------getcsv.pl ここまで---------------------- ----------------------コマンド ここから---------------------- perl getcsv.pl 1 3 8 10 ----------------------コマンド ここまで---------------------- よろしくお願いします。

    • ベストアンサー
    • Perl
  • cプログラム

    次の10人の身長を入れ、最大と最小を配列を使って求めるプログラムなんですが、この場合だと一人の身長データしか入力できません どのように直せばいいでしょうか? #include <stdio.h> main () { float h[10],max,min; int i; max=-999; min=999; for(i=0;i<=9;i=i+1){ printf("%d番目の身長を入力してください\n",i+1); scanf("%5.1f",&h[i]); if(h[i]>max){ max=h[i]; } if(h[i]<min){ min=h[i]; } } printf("最大の身長は%5.1f,最小の身長は%5.1fです。\n",max,min); return(0); }

  • 入力されたテキストの行の中から最も文字数の多い行を表示するプログラム

    学校の課題なのですが、どうにも正しくプログラムできません もしお分かりになる方がいらっしゃったらご回答よろしくお願いします 条件、注意書きはほとんど書いた通りです 申し訳ありませんが早めのご回答お願いいたします #include <stdio.h> #define MAXLINE 1000 int getl(char s[], int lim){           不明箇所 } void copy(char to[], char from[]) { int i;  i=0;  while ((to[i] = from[i]) != '/0') ++i; } int main() { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max=0; while((len = getl(line,MAXLINE)) > 0) if(len > max){            不明箇所 } if(max > 0) printf("%d: %s", max, longest); return(0); } getl  標準入力から1文字ずつ読み込み、配列の先頭から順に格納する     読み込んだ文字が改行(/n)なら行末。/nを格納した次の要素に/0を格納     読み込んだ文字数(改行コード含む)を関数の値(戻り値にする) char s[]  読み込んだ文字を格納する文字配列       行末に達したら直後に/0 int lim  仮引数s[]の要素数。読み込む行の文字数がlimの値を超えるとそこで行の入力を打ち切る len  getlで読み込んだ行の文字数 line  getlで読み込んだ行を格納 longest  一番長かった行を保持 max  一番長かった行の文字数を保持 while  作成する関数の戻り値がEOFでない限り繰り返す      今読み込んだ行がこれまで一番長かった行より長い場合にはmaxを更新し、読み込んだ行をcopyでlongest[]にコピーしておく mainの最後でmax>0ならば(有効な行を読み込んでいたら)最も長い行を%sで表示 例 入力 123      12345      12   出力 12345