- 締切済み
教えてください!!
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+の+は何を意味しているのでしょうか??? 分かりやすく教えていただけると嬉しいです。
- みんなの回答 (4)
- 専門家の回答
関連する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])にきたときは隣を参照しないようにするにはどうすればよいのでしょう?
- ベストアンサー
- C・C++・C#
- 多次元配列について質問
以下は、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の順番になり決して昇順にならないと思います。 なぜこのプログラムで昇順になるのか内部的な説明が欲しいです。 お願いします。
- ベストアンサー
- C・C++・C#
- 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 ・・・ 回避方法もしくはうまい計算方法などありませんでしょうか
- ベストアンサー
- Visual Basic
- 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は初期化しなくても大丈夫だったのでしょうか。 初心者にもわかるように教えていただけると幸いです。
- ベストアンサー
- Windows 8
- 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が後期成績を格納する部分です。
- ベストアンサー
- C・C++・C#