• 締切済み

教えてください!!

perlに関するサイトで 合計を求めるプログラムは @dat(1,2,3,4,5,6,7,8,9,10); $sum = 0; for($i = 0;$i <10; $i++){ $sum+ = $dat[$i]; print "sum = $sum "; } というのを見つけました。 いくつか質問があります。 (1)これは1234・・・と続いているから$i++で1の次は2とあらわされているのか、それとも@datの配列の1番目の次が2番目というのを表しているのか。 もしたまたま続いているからならば、列の1番目の次の処理が2番目というふうにするにはどうすればよいか。 (2)$dat[$i]の[]は何を表しているのか (3)$sum+ = $dat[$i]は合計を求めるものだと思うのですが、$sumが合計のことですよね。$dat[$i]についてなのですが、for文なので順番に$iから足しているということなのでしょうか??いまいちピンと来ません。それに$sum+の+は何を意味しているのでしょうか??? 分かりやすく教えていただけると嬉しいです。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

>@dat(1,2,3,4,5,6,7,8,9,10); は >@dat=(1,2,3,4,5,6,7,8,9,10); の間違いだとして。 例題としては、ちょっとどうかな、って思いますね ・配列の最初の添字は$[で変えられるので、0とは限らない(通常は0ですが) ・配列@datの大きさを10と決め付けている ・配列@datが1から10の並んだ数なので、(少なくとも、質問者さんは)添字と混乱してしまう

全文を見る
すると、全ての回答が全文表示されます。
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

Perlの変数で、「配列」について調べてみて下さい。 @datの中には1~10の数字が代入されていて、@datに入っている2番目の変数を$dat[1]という風に表現します。 (配列の数え方は0からなので、一番目は$dat[0]です) @datの数字が連続してるとかは関係なく、もし@dat = (8,2,6,w,7)としたら、  $dat[0]は8  $dat[1]は2  $dat[2]は6  $dat[3]はw  $dat[4]は7 となります。 $sum += $dat[$i]は、$sum = $sum + $dat[$i]の省略形です。 $i++も同様に、$i = $i + 1です(1を足す場合は「++」で表現され、$i+=1と同義です)。 ご質問のプログラムの内容は、@datの中身の0~9番目(何番目というのは$iで表現)を$sumに足していって、都度表示するというものです。 printがforの中なので、一つ一つ足していった結果を出していますね。 forの外側にかけば途中経過はパスして、最終的な合計だけが表示されます。

全文を見る
すると、全ての回答が全文表示されます。
  • 0x131cc6e
  • ベストアンサー率36% (42/115)
回答No.2

(1) うーん…、質問の意味がいまひとつ…。 for($i=0; $i<10; $i++){ } という文の意味は、 「$iという変数の値が10になるまで{}の中の処理を繰り返す。  その繰り返しを開始する前に一度だけ$iにゼロをセットする。  また、繰り返し処理が終わる度に$iの値を1ずつ増加する」です。 ここでの$iは配列@datの各要素を取り出すために使われるので、繰り返しの度に0,1,2,3,4,5,6,7,8,9と増加させています。 (2) 配列の中にセットされている要素を取り出すのに[]を使います。 つまり、$dat[0] と書くとそれは配列datの最初の要素を意味します。 ※チョー基本ですが、Perlの配列は0番目から始まります。 (3) >for文なので順番に$iから足しているということなのでしょうか? いえ、$iは配列の各要素を取り出すために使われています。 要するに配列datの$i番目の要素を取り出して 変数$sumに足し込んでいるわけですね。 >$sum+の+は何を意味しているのでしょうか??? 「$sum+」ではなく「+=」です。 「$sum」「+=」「$dat[$i]」と書いているのです。 += は その左側に置かれた変数に対し、その右側の値を足し込むためのものです。 $sum += 1; と書くと、それは $sumに1を足す を意味します。 こんな感じでわかりますかね?

全文を見る
すると、全ての回答が全文表示されます。
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

 プログラム言語の、関数やその扱い方について、ここで聞くのは無理ですよ。Perlのらくだ本なんて、枕になるくらい厚い。 O'Reilly Japan - プログラミングPerl 第3版 VOLUME 1 ( http://www.oreilly.co.jp/books/4873110963/ ) O'Reilly Japan - プログラミングPerl 第3版 VOLUME 2 ( http://www.oreilly.co.jp/books/4873110971/ ) 「多くの面で単純である反面、Perlが豊かな言語であるのもまた事実であり、学ぶべきことは山ほどある」  プログラム集ではなく、リファレンスを一冊購入すべきです。上が大きくて高価なら、 CGI&Perlポケットリファレンス ( http://www.amazon.co.jp/CGI-Perl%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-Pocket-reference-%E8%97%A4%E7%94%B0/dp/4774107557 )  でもよい。  ここで得られる情報とは、比較にならないほどよく理解できます。 スカラー変数とは何か、 配列はどのように扱うか ハッシュは?  いきなりプログラム集では、決して身につきません。  

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • サブルーチンからサブルーチンを呼び出す

    #平均を求める,サブルーチンを使用 @dat=(1,2,3,4,5,6,7,8,9,10); $mean=&mean(@dat); print "mean="; print $mean; sub mean{ $sum=&sum(@dat); $n=@dat; $mean=$sum/$n; return($mean); } sub sum{ for($i=0;$i<$n;$i++){ $sum+=$dat[$i]; } return($sum); } Perlを勉強し始めたのですがサブルーチンの所で分からない所があるので教えていただけませんか? mean関数(Perlではmeanルーチンなどと呼ぶべきでしょうか?)の中でsum関数を呼び出してデータの合計を$sumに代入したいのですが,この場合だとうまく代入されていないようなのですが,何がよろしくないのでしょうか?

    • ベストアンサー
    • Perl
  • 複数の配列からfor構文の中で任意の要素を表示させる

    @dat1=(12,11,16,17); @dat2=(21,26,23,20); ・・・ @dat17=(22,34,31,18); for($i=1;$i<=$17;$i++){ print @{"dat$i"};print "\n"; } といったように,@dat1から@dat17まで配列が用意されているときに上の例では当然ながら@dat1全ての要素が表示されます。これを任意の要素のみを表示させたい場合にはどのようにすればよいでしょうか? 例えば@dat1から@dat17までの0番目の要素($dat1~17[0])と1番目の要素($dat1~17[1])のみを表示させたいのですが...

    • ベストアンサー
    • Perl
  • 配列 隣の要素を参照するのですが

    最初に 8つの要素を持つint型の配列(配列名dat)があるとして、最初全要素に「0」が代入されています。scanf関数でn番の要素に「1」が代入されたとします。n番なのでどこに「1」が代入されたかはわからないです。 問題 for文を使用して何番目に「1」が入力されたかを調べますが、以下のルールに従がわなくてなならいです。 ルール ・現在の要素から隣の要素を参照しなくてはいけない。 ・参照する範囲は要素の数「0~7」番 #include<stdio.h> void main() { int i, dat[8]; for(i=0;i<8;i++){ dat[i]=0; } i=0; scanf("%d",&i); dat[i] = 1; for(i=0;i<8;i++){ if(dat[i+1] == 1){print("%d列目に「1」がありました", i+1); } } でも…こうすると0番目の要素が参照されないですそれを回避するには?そして… 最大の要素(dat[7])にきたときは隣を参照しないようにするにはどうすればよいのでしょう?

  • 多次元配列について質問

    以下は、Javaの参考書に掲載されていたある問題です。 その問題文と解答ソースコードを記載しますので、以下の疑問点に答えていただければ幸いです。 また、僭越ながらお願いがあるのですが、このソースコードを一度実行してから私の質問を見たほうが、より私の疑問点が回答者様にわかると思うので、実行してくだされば幸いです。 問題文:次のA~Cの手順に従ってプログラムを作成しなさい。 A:5×4の2次元配列のint型配列pを作成します。つまり、pは5個の要素を持ち、各要素が「4つの要素を持つintの配列」であるような配列です。 B:次にpの全要素にMath.random()で得られる乱数値を代入しなさい。乱数値は0から10の範囲になるように10倍し、さらにintにキャストして配列の要素に代入しなさい。 C:pの全ての要素を例示のように表示しなさい。(※ここでいう「例示」とは、私がこの質問板にupした画像のこと)ただし、pの各要素を5×4の表と見た時、各列の(縦方向の並び)の合計を、その5×4の表と見た時、各列(縦方向の並び)の合計も例示のように表示しなさい。 ---解答ソースコード(クラス宣言は除きます)--- public static void main(String[]arg){ //A int[][]p=new int[5][4]; //B for(int i=0;i<p.length;i++){ for(int j=0;j<p[i].length;j++){ p[i][j]=(int)(Math.random()*10); } } for(int[]n:p){ for(int m:n){ System.out.print(m+"\t"); } System.out.println();//改行 } //C int[]sum=new int[p[0].length]; for(int[]n:p){ for(int j=0;j<n.length;j++){ sum[j]+=n[j]; } } System.out.println(); for(int m:sum){ System.out.print(m+"\t"); } } 疑問点:Cの手順の解答について疑問なのですが、以下のソースコードで何故各列の合計を求められるかわかりません。何故ですか?凄く頭が引きちぎれるほど考えたのですがわかりませんでした。 int[]sum=new int[p[0].length]; for(int[]n:p){ for(int j=0;j<n.length;j++){ sum[j]+=n[j]; } } だって、例えば拡張for文でpの0番目の要素を取り出して、さらにfor文でその0番目の要素の0番目、1番目、2番目、3番目をsumに累計するといったように、縦方向でなく「横方向」に合計するソースコードに僕は思えるんですよ。何故縦方向に合計できるんですか?たしかに実行すると縦方向に合計されてるので、縦方向に合計するものには間違いなのだけれど、、

    • ベストアンサー
    • Java
  • 昇順に整列するプログラムについて教ええください。

     int dat[10]; int i,j,wk,sum; /*データ入力*/  printf("10個の数値を入力してください."); for(i=0,sum=0,i<10;i++){ scanf("%d,&dat[i]); sum += dat[i]; } /*整列*/ for (i=0,i<9;i++){ for (j=i+1,j<10;j++){ if(dat[i]>dat[j]){ wk=dat[i]; dat[i]=dat[j]; dat[j]=wk; } } }  すいませんが、この整列の中でなぜ昇順になるのかわからないのです。  ex)scanfで8 7 9 6と入力したとき、  dat[i]=dat[0]=8で  dat[j]=dat[1]=7となり  プログラム上ではwk=8と格納され、次にdat[i]=dat[j]なので7の値がdat[i]に格納される。そしてdat[j]=wkからdat[j]に8が格納される。  つまりdat[0]=7になり、dat[1]=8になりそのつぎにdat[2]=9は処理せずそのままでdat[2]=3となりますがdat[3]=6のときくらべるのが if(dat[i]>dat[j])よりdat[2]>dat[3]より処理をしたら  全体的に7 8 6 9の順番になり決して昇順にならないと思います。  なぜこのプログラムで昇順になるのか内部的な説明が欲しいです。  お願いします。

  • java のfor文について質問です。

    問題7-1:次の配列データの合計と平均を求めるプログラムを作成してください。 double [] x = { 12.3, 45.4, 45.9, 3.56, 6.6, 8.9, 2.3, 0.5, 4.3, 1.2, }; (自分が書いたもの) public class Sample8_4 { public static void main(String[] args) { double[] x = { 12.3, 45.4, 45.9, 3.56, 6.6, 8.9, 2.3, 0.5, 4.3, 1.2, }; double sum = 0.0; for (int i = 0; i < x.length; i++) { ; sum += x[i]; double average = sum / x.length; System.out.println("平均:" + average + ",合計:" + sum); } } } (実行結果) 平均:1.23,合計:12.3 平均:5.7700000000000005,合計:57.7 平均:10.36,合計:103.6 平均:10.716,合計:107.16 平均:11.376,合計:113.75999999999999 平均:12.266,合計:122.66 平均:12.495999999999999,合計:124.96 平均:12.546,合計:125.46 平均:12.975999999999999,合計:129.76 平均:13.095999999999998,合計:130.95999999999998 (答え) 総計:130.95999999999998, 平均:13.095999999999998 for文についていまいち理解できていません(拡張for文も) 回答よろしくお願いします。

    • ベストアンサー
    • Java
  • VBA 配列計算について 配列の入力に配列の使用

    配列に複数のセル値の合計値を設定したいと思っています。 求める合計値は複数あるため、出力も配列となります。 そこで下記のようにプログラムを考えたのですが、全て同じ値の配列として出力されてしまいます。 VBAではC言語のように配列の古い値に足していくことはできないのでしょうか? (sum()は0で初期化) (10個飛ばしのデータの合計値を算出) For i = 0 To 10 For j = 0 To 5 sum(i)= sum(i) + Worksheets(sheetname).Cells(10, 3).Offset(j * 10, 0).Value Next i Next j 出力配列例 全て同じ値になってしまいます・・・ 1.254 1.254 1.254 ・・・ 回避方法もしくはうまい計算方法などありませんでしょうか

  • 2つ質問があり、まず1つ目なのですが・・

    次のプログラム1行ずつみていったところ、何をしているか分からないところがけっこうありまして。。。 まだPerl初心者で困惑しております(><)以下の文でコメントがないところ分かりません。 コメントあるところも怪しいかもしれません。 for($i=1; $i<80; $i++) { printf("a2006%03d",$i); #a20061から200680まで 出力。  for($k=0; $k<20; $k++) { #0から20までの間のとき{}内を実行。 $pnt=int(rand(100)); #100までの乱数pntを定義する。 print ",";      #,を出力。 if( $pnt >=20 ) {#pntが20以上ならpntを出力。 print $pnt; } } print "\n"; #改行を出力。 } while( $a = <> ) { $a =~ s/\n$//; #改行と/をaと定義する。 @b = $a =~ /^([^,]*)(,*.*)$/; # $name = $b[0]; $seq =0; $isum = 0; $icnt =0; while( $b[1] ne "" ) { @b = $b[1] =~ /^,([^,]*)(,*.*)$/; if( $b[0] ne "" ) { $isum += $b[0]; $sum[$seq] += $b[0]; $icnt++; intの数をカウントしていく。 $cnt[$seq]++; } $seq++; seqの数をカウントしていく。 } printf("%s:%.2f\n", $name, $isum/$icnt); }   #文字列$nameと$isum/$icntを出力。 for($i=0; $i<=$#sum; $i++) { #iが0sum以下のとき                {}内を実行 printf(" %.2f", $sum[$i]/$cnt[$i]); } print "\n"; #改行

    • ベストアンサー
    • Perl
  • 宣言時に初期化した場合としない場合の違いは?

    C言語を初めて2週間の初心者です。 現在配列の勉強をしていてちょっと疑問に思いました。 配列に点数を読み込んで合計点と平均点を表示するプログラムを書いたのですが、 #include<stdio.h> int main() { int i; int sum = 0; int vc[5] = {0}; //vc[5]と配列の両方に0を格納している。(初期化してる。) puts("点数を入力してください。"); for(i = 0 ; i < 5 ; i++){ printf("%d番:",i+1); scanf("%d",&vc[i]); sum+=vc[i]; } printf("合計点:%d\n平均点:%.1f\n",sum,(double)sum/5); return 0; } 宣言時に、配列vcと合計sumの両方を0で初期化してます。 この時sumを初期化しないと、コンパイルエラーは起きないのですが、正しい値が出力されません。 桁数がすごいことになります。 しかしvcは初期化しなくても大丈夫でした。 sumを初期化しなければいけないのはなぜですか。 加えて、なぜvcは初期化しなくても大丈夫だったのでしょうか。 初心者にもわかるように教えていただけると幸いです。

  • C言語で3次元配列の課題をしています。

    C言語で3次元配列の課題をしています。 5人の学生の3科目(国数英)の点数を前期と後期の2回分について三次元配列に入力し、各学生の前期と後期の合計と前・後期の合計を求めるプログラムです。 配列に数値を格納するあたりまでは分かったものの、そこから先がよくわからなくなってしまいました。どなたか解説とともに、成績の出力の仕方を教えていただけないでしょうか。for文を使えばいいというのはわかりますが・・・。 以下に出来た部分までのソースを載せておきます。まだ未熟な上、変なミスがあるかもしれません。 #include <stdio.h> main() { /*配列を宣言*/ int score[0][3][5],i,j,k; int total,sum[2][5]; /*配列に成績を入力*/ for(i=0;i<2;i++){ for(j=0;j<3;j++){ for(k=0;k<5;k++){ printf("score[%d][%d][%d] = ",i,j,k); scanf("%d", &score[i][j][k]); } } } /*合計を計算する*/ for(i=0;i<5;i++){ for(j=0;j<2;j++){ total=0; for(k=0;k<3;k++){ total = total + score[i][j][k]; } sum[i][k]=total; } sum[2][k]=sum[0][k]+sum[1][k]; } /*出力する*/ /*??*/ } ※三次元配列のscoreの始めの[]は、0が前期成績、1が後期成績を格納する部分です。