• 締切済み

どこが違うか分かりません

open OUT, "kekka.dat"; $name1 = "荒木"; $name2 = "井上"; $name3 = "上田"; $name4 = "江口"; $name5 = "小川"; $san = "さん"; $kun = "くん"; %kokugo = (araki =>94, inoue => 73, ueda =>76, eguchi => 69, ogawa =>84); %sugaku = (araki =>81, inoue => 93, ueda =>64, eguchi => 83, ogawa =>74); %eigo = (araki =>89, inoue => 85, ueda =>81, eguchi => 75, ogawa =>87); print %kokugo print %sugaku print %eigo $score[1] = $kokugo{araki} + $sugaku{araki} + $eigo{araki}; $score[2] = $kokugo{inoue} + $sugaku{inoue} + $eigo{inoue}; $score[3] = $kokugo{ueda} + $sugaku{ueda} + $eigo{ueda}; $score[4] = $kokugo{eguchi} + $sugaku{eguchi} + $eigo{eguchi}; $score[5] = $kokugo{eguchi} + $sugaku{eguchi} + $eigo{eguchi}; print $score; print OUT $name1.$kun, $score[1], $score[1]/3; print OUT $name2.$san, $score[2], $score[2]/3; print OUT $name3.$kun, $score[3], $score[3]/3; print OUT $name4.$kun, $score[4], $score[4]/3; print OUT $name5.$san, $score[5], $score[5]/3; close OUT; 教えてください

  • CGI
  • 回答数3
  • ありがとう数1

みんなの回答

  • shinsa14
  • ベストアンサー率0% (0/0)
回答No.3

初心者なんですが、回答していいものか・・・ 下記の個所を修正すれば、とりあえずは動くと思うのですが 1行目 <before> open OUT, "kekka.dat"; <after> open OUT, ">kekka.dat"; 11~13行目 <before> %kokugo = (araki =>94, ..... <after> %kokugo = ("araki" =>94, ..... 15~17行目 <before> print %kokugo <after> print %kokugo; 25行目 <before> print $score; <after> print @score; これでとりあえずは動くとおもうのですが・・・ファイルは更新されないようです。 他に気になった点がいくつか・・・ 15~17行目 print %kokugo; ※ %配列をいきなり出力してしまうのは、とても大胆なような気がするのですが($変数にワンクッションおくとか・・・27~31行目もおなじような気がします。・・・) 23行目 <before> $score[5] = $kokugo{eguchi} .... <after> 江口くん じゃなくて 小川さん ですよね・・・どうでもいいですか・・・ 素人ながら、私もにたようなプログラムで、苦しんでいたもので・・・ ついつい、回答してしまいました。 大変、失礼しました。

回答No.2

まず15から17行目でセミコロンが抜けています. print %kokugo ; print %sugaku ; print %eigo ; 後はファイルオープンできてません. 27~31行目のOUTを取るととりあえず標準出力で表示されるようです。 ※perl for winをインストールしてローカル環境でデバッグしましょう。 以上、仕事中のおじさんでした(^^;)

回答No.1

CGIの文法ことはわからないんですが、多分 $score[]って配列なんですよね。 print $score; この部分で配列扱いされていないようですが・・・・

関連するQ&A

  • ある複数のフィールドに特定の数字が存在する回数を得たい

    複数のフィールドで、指定した数字が入ってる回数を得るSQLの書き方が分かりません。 具体例を書きますと、フィールド名がそれぞれ id,name,kokugo,sugaku,shakai,rika,eigo,created_date となっており、入ってるデータが 1,YamadaTarou,80,100,100,74,100,2009-05-27 となってる場合、このうち「kokugo,sugaku,shakai,rika,eigo」のフィールドに100が入ってる回数を得たいのです(具体例の場合、3を得たい)。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • c言語 構造体

    大学での内容なのですが,『名前,数学の点数,英語の点数,国語の点数を格納できる(メンバに持つ)構造体を宣言し,この構造体の配列を用いて,3人分の情報をキーボードから入力後,各科目の平均点を画面に表示するプログラムを作成せよ.』という問題で,自分なりに作ってみたのですがうまくいきません.どなたか教えていただけませんか? 一応自分で作ったものを下に載せておきます. ================================================================ #include <stdio.h> #include <string.h> struct test { char name[20]; int sugaku; int eigo; int kokugo; }; int main(void) { struct test suzuki; int (suzuki.sugaku), (suzuki.eigo), (suzuki.kokugo); strcpy(suzuki.name, "Suzuki"); printf("氏名:鈴木 一馬\n"); printf("数学:"); scanf("%d", &suzuki.sugaku); printf("英語:"); scanf("%d", &suzuki.eigo); printf("国語:"); scanf("%d", &suzuki.kokugo); struct test tanaka; int tanaka.sugaku, tanaka.eigo, tanaka.kokugo; strcpy(tanaka.name, "Tanaka"); printf("氏名:田中 二郎\n"); printf("数学:"); scanf("%d", &tanaka.sugaku); printf("英語:"); scanf("%d", &tanaka.eigo); printf("国語:"); scanf("%d", &tanaka.kokugo); struct test yamamoto; int yamamoto.sugaku, yamamoto.eigo, yamamoto.kokugo; strcpy(yamamoto.name, "Yamamoto"); printf("氏名:山本 三弘\n"); printf("数学:"); scanf("%d", &yamamoto.sugaku); printf("英語:"); scanf("%d", &yamamoto.eigo); printf("国語:"); scanf("%d", &yamamoto.kokugo); printf("数学の平均点は%dです。\n", ((suzuki.sugaku + tanaka.sugaku + yamamoto.sugaku) / 3.0)); printf("英語の平均点は%dです。\n", ((suzuki.eigo + tanaka.eigo + yamamoto.eigo) / 3.0)); printf("国語の平均点は%dです。\n", ((suzuki.kokugo, + tanaka.kokugo + yamamoto.kokugo) / 3.0)); return (0); } ================================================================

  • fscanfの使い方

     現在C言語の勉強をしているのですが、ファイル入力のfscanfの使い方がいまいちわかりません。  テキストファイル「TEST4K01.txt」には 「A01MATSUMOTO 090075100」が入ってるのですが、それぞれ構造体に直接振り分けて格納したい為fscan関数を使って下のソースを書いたのですがコンパイルするといつも以上終了してしまいます。大変申し訳ないのですが、誰か助言を御願いします。 #include<stdio.h> #include<stdlib.h> struct score { char clas_i; char num_i; char name[10]; int eigo_i; int sugaku_i; int kokugo_i; }; FILE *ifp; int main(void) { struct score dt; if((ifp = fopen("TEST4K01.txt", "r")) == NULL){ printf("ファイルエラー\n"); exit(1); } fscanf(ifp, "%1c%2d%10c%3d%3d%3d\n", &dt.clas_i, &dt.num_i, &dt.name, &dt.eigo_i, &dt.sugaku_i, &dt.kokugo_i); printf("%s", dt.clas_i); printf("%d", dt.num_i); printf("%s", dt.name); printf("%d", dt.eigo_i); printf("%d", dt.sugaku_i); printf("%d", dt.kokugo_i); fclose(ifp); return 0; }

  • チェックボックスの項目をDBにinsertしたい

    チェックボックスの複数項目をDBにインサートしたいのですが、DBのフィールドを見ると、チェックボックスの値だけ空になってしまいます。 プログラミング初心者のため、基本的なところでつまずいている可能性も高いのですが、正しいコードがわかる方がいらっしゃいましたらご教授ください。 よろしくお願いします。 ■DBの構造 以下のようなフィールド構造にしており、一人につき1行でデータを持ちたいと思っています。 フィールド   name/ mail/comment/kokugo/sugaku/rika/syakai/eigo/・・・ ● 実際のデータの持ち方(以下のようにしたいです。) 例 太郎/ taro@/hello/ 国語/数学/ / /   次郎/ jiro@/ nice/ / 数学/ /社会/ 英語 ※太郎は、国語と数学をチェックボックスで選択 ※次郎は、数学と社会と英語をチェックボックスで選択 ■チェックボックス画面html(一部抜粋) ---- <form action="regist.php" method="post"> 名前:<br /> <input type="text" name="name" size="30" value="" /><br /> メールアドレス:<br /> <input type="text" name="mail" size="30" value="" /><br /> コメント:<br /> <textarea name="comment" cols="30" rows="5"></textarea><br /> 科目<br /> <form name="kamoku" method="post" action="regist.php"> 国語<input type="checkbox" name="kokugo" value="国語"> 数学<input type="checkbox" name="sugaku" value="数学"> 理科<input type="checkbox" name="rika" value="理科"> 社会<input type="checkbox" name="syakai" value="社会"> 英語<input type="checkbox" name="eigo" value="英語"> <br /> ----- ■phpのファイル(regist.php) ※該当部分だけ記述させていただきます。 ---- <?php // $checkboxの中身は配列 $checkbox = $_REQUEST["chk"]; ?> <html> <head> <title>DB登録練習</title> </head> <body> // 選んだ科目を画面に表示させる <tr> <td>科目</td><td><?php for($i=0; $i<sizeof($checkbox); $i++){ print "${checkbox[$i]}<br>"; } ?></td> </tr> // DB登録部分 <?php $name = $_REQUEST['name']; $mail = $_REQUEST['mail']; $comment = $_REQUEST['comment']; $kokugo = $_REQUEST['kokugo']; $sugaku = $_REQUEST['sugaku']; $rika = $_REQUEST['rika']; $syakai = $_REQUEST['syakai']; $eigo = $_REQUEST['eigo']; $del_flag = $_REQUEST['del_flag']; $reg_date = $_REQUEST['reg_date']; $result = mysql_query("INSERT INTO DBpractice(name, mail, comment, kokugo,sugaku,rika, syakai, eigo,del_flag,reg_date) VALUES('$name', '$mail', '$comment','$kokugo','$sugaku','$rika','$syakai','$eigo','0', now())", $conn); if (!$result) { exit('データを登録できませんでした。'); } ---- チェックボックスで選択した複数科目をブラウザ上で表示させるところは上手くできるのですが、DBに挿入するときのみ、科目のみがうまく入りません。(他の項目は挿入されています。) よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースへのアクセスエラーについて

    はじめまして!大学でデータベースを学んでいるのですが、以下のプログラムを実行した際、「式の型が一致しません」というエラーが出ます。またアクセスしているテーブルmeiboにはフィールドに,IDと名前shakai,eigoなどのテーブルには,IDと得点(それぞれの科目の名前)がフィールドにあります。 よろしければ、ご回答よろしくお願いいたします。 import java.io.*; import java.sql.*; public class Ex1 { public static void main(String[] args) { Connection conn = null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection("jdbc:odbc:ex1"); Statement stmt = conn.createStatement(); BufferedReader r = new BufferedReader(new InputStreamReader(System.in), 1); System.out.print("学籍番号を入力してください : "); System.out.flush(); String number = r.readLine(); String select = "SELECT * from meibo,kokugo,sansuu,shakai,rika,eigo " + "where meibo.ID=kokugo.ID=sansuu.ID=shakai.ID=rika.ID=eigo.ID"; ResultSet rs = stmt.executeQuery(select); while(rs.getString("ID")!=number) rs.next(); // System.out.printf("%s\t",rs.getString("name")); System.out.printf("%s\t"," 国語 "+rs.getString("kokugo")); System.out.printf("%s\t"," 算数 "+rs.getString("sansuu")); System.out.printf("%s\t"," 社会 "+rs.getString("shakai")); System.out.printf("%s\t"," 理科 "+rs.getString("rika")); System.out.printf("%s\n"," 英語 "+rs.getString("eigo")); stmt.close(); conn.close(); } catch (Exception e) { System.out.println(e); } } }

  • classmate[a].name がうまく出力できません。

    ソースはこれです。途中は省略してますが、これでいいと思っています。 int aで指定した構造体に....[a].nameで文字を表示したいのですが、以下のようではうまくいきません。 宜しくお願いします。 struct classmatedata { char name[15]; int age; char sex[1]; struct seiseki ten; }classmate[member]; inline void classdata::outputseiseki() { int a; printf("成績を表示します。 番号="); scanf("%d",&a); printf("名前=%s\n",classmate[a].name); printf("国語=%d 社会=%d 数学=%d 理科=%d 英語=%d\n",classmate[a].ten.kokugo,classmate[a].ten.syakai,classmate[a].ten.sugaku,classmate[a].ten.rika,classmate[a].ten.eigo); }

  • ハッシュを使った集計結果の出力について

    ハッシュを使った集計結果の出力について testフォルダに以下のファイルがあるとします。  aaa_1、aaa_2、bbb_1、bbb_2、ccc_1、・・・ 各ファイルには○△×がついた行があり、 「aaa」のファイル(aaa_1とaaa_2)の○△×の数、「bbb」のファイルの○△×の数、を集計したいと思っています。 出力イメージは以下です。  ファイル名の一部,○の数,△の数,×の数  aaa,13,59,37 ファイル名の一部をキーとして、 ○△×の回数を値にしたハッシュで集計しようとしましたが、 以下のようになってしまいました。 ,0,0,0 ,0,0,0,0,0,0 aaa,13,59,0 aaa,13,59,0,13,59,37 bbb,20,10,0 bbb,20,10,0,20,10,30 ハッシュが十分に分かっていないので、おかしなことをしてるのだと思うのですが。。 ご教授くださいますよう、お願いします。 opendir(DIR, $dir); while ($file = readdir(DIR)){  $maru =0;  $san =0;  $batu =0;  $file =~/(.*)_(.*)/;  $name = $1;  open(IN, "$dir/$file");   while ( $line = <FIN1> )   {    chomp( $line );    if($line =~/○/){      $maru++;    }elsif($line =~/△/){      $san++;    }elsif($line =~/×/){      $batu++;    }  } push(@{$test{$name}} , $maru,$san,$batu); @gyou = ( $name , join ("," , @{$test{$name}})) ; print OUT join (",", @gyou). "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • 単行リストのソートのプログラムについて

    単行リストのソースでわからなくなったので質問させていただきます。 #include<stdio.h> //---------------------------------------------------------- // InitBanpei // 番兵の初期化 //---------------------------------------------------------- // input: struct pNode* pNode //番兵のアドレス //---------------------------------------------------------- void InitBanpei(struct node* pStartNode,struct node* pEndNode); //---------------------------------------------------------- // IsBanpei // 番兵チェック //---------------------------------------------------------- // input: struct pNode* pNode //番兵のアドレス // out : true //成功 // false //失敗 //---------------------------------------------------------- int IsBanpei(struct node* pNode); //構造体 struct node { char name[30]; int kokugo; int suugaku; int eigo; int goukei; struct node* pNext; }; int main(void) { FILE* fp; struct node useStart,useEnd; struct node *p,*j,*max,*a; int stich=0; char work[256]; InitBanpei(&useStart,&useEnd); IsBanpei(&useStart); IsBanpei(&useEnd); fp=fopen("data.txt","r"); if(fp==NULL) { printf("ファイルを開けません\n"); return 0; } while(feof(fp)==0) { fgets(work,256,fp); stich++; } stich--; printf("%d\n",stich); if(stich==0) { printf("件数は0です\n"); return 0; } fclose(fp); fp=fopen("data.txt","r"); if(fp==NULL) { printf("ファイルを開けません\n"); return 0; } j=NULL; for(int i=0;i<stich;i++) { a=new struct node; if(a==NULL) { printf("メモリが確保できません\n"); return 0; } fscanf(fp,"%s %d %d %d ",&(a->name),&(a->kokugo),&(a->suugaku),&(a->eigo)); a->goukei=a->kokugo+a->suugaku+a->eigo; a->pNext=j; j=a; } useStart.pNext=j; max=&useStart; p=max->pNext; while(max->pNext!=NULL) { j=p; while(j->pNext!=NULL) { if(max->goukei< j->goukei) { max=j->pNext; p=j; } j=j->pNext; } p->pNext=max->pNext; max->pNext=useStart.pNext; max=max->pNext; } a=useStart.pNext; while(a->pNext!=NULL) { printf("%7s %03d %3d %3d %3d点\n ",a->name, a->kokugo,a->suugaku, a->eigo,a->goukei); a=a->pNext; } } //---------------------------------------------------------- // InitBanpei // 番兵の初期化 //---------------------------------------------------------- // input: struct pNode* pNode //番兵のアドレス //---------------------------- //------------------------------ void InitBanpei(struct node* pStartNode,struct node* pEndNode) { pStartNode->pNext=pEndNode; pEndNode->pNext=NULL; } //---------------------------------------------------------- // IsBanpei // 番兵チェック //---------------------------------------------------------- // input: struct pNode* pNode //番兵のアドレス // out : true //成功 // false //失敗 //---------------------------------------------------------- int IsBanpei(struct node* pNode) { if( pNode->pNext!=NULL) { return -1; } return 0; } のソースなのですが、単行リストを使って大きい順に並び替えをしたいのですがうまくできません。どこを直せばいいのでしょうか?分かる方いらしたらソースを書いてくださると助かります。

  • Vectorを用いた問題

    JAVAをはじめたばかりなのですが、以下の問題が分かりません。 Lessonクラス内のaddメソッドにおいてaddした結果が常に学籍番号の小さい順にソートしたいのですが、どうもVectorの使い方がわからず四苦八苦しております。 import java.util.Vector; class main { public static void main(String argv[]){ Lesson l = new Lesson("Kokugo","Tanaka",100); l.add(new Student("00005","Suzuki",100)); l.add(new Student("00002","Sato",64)); l.add(new Student("00003","Ito",43)); l.add(new Student("00007","Endo",92)); l.print(); } } class Lesson { private String name; // 課題名 private String teacher; // 担当者 private int max; // 最大履修者数 private int num; // 登録履修者数 Vector<Student> st; // Student class の配列 public Lesson(String l,String t,int n){ name=l; teacher=t; max=n; num=0; st=new Vector<Student>();// 配列の確保 } public boolean add(Student s){ if(num>=max){ return false;} else { if(num==0){st.insertElementAt(s,num++);} else{ for(int i=0;i<num;i++){ String p=(st.elementAt(i)).id; if(p.compareTo(s.id)>=0){ st.insertElementAt(s,i); } } } return true;} } public void print() { System.out.println("Lesson :"+name); System.out.println("Teacher :"+teacher); System.out.println("students:"+num); for(int i=0;i<num;i++){ st.elementAt(i).print_short(); } System.out.println(); System.out.println("----------"); } } class Student{ public String id; // 学籍番号 private String name; // 名前 private int grade; // 成績 Student(String i,String n, int g){ id=i; name=n; if(g<0)grade=0; else if (g>100) grade=100; else grade=g; } public void print_short() { System.out.println(id+","+name+","+grade); } } 実行結果 Lesson :Kokugo Teacher :Tanaka students:1 00002,Sato,64 ---------- 学籍番号の順にソートしたいのですが、どうやら学籍番号の一番小さいものしか表示されていないようです。どのようにしたらよいのか教えていただけないでしょうか?

    • ベストアンサー
    • Java