C
1#include "wakabalite.h" 2#include "gpa1.h" 3 4// gpa算出関数(単位数, MARK構造体ポインタ, 科目数) 5double get_gpa(int units, Mark *marks, int n){ 6 double gpSum = 0.0; 7 int i; 8 9 for(i=0;i<n;i++){ 10 gpSum += (double)(marks[i].score-54.5)*marks[i].unit/10; 11 } 12 return (double)gpSum/units; 13} 14 15int gpa1(pthread_t selfId, PGconn *con, int soc, char *recvBuf, char *sendBuf){ 16 PGresult *res, *resStd, *resSub, *resMrk, *resMrk2; // SQL実行結果 17 int resultRows, resultRows2, sendLen, i, n; 18 int stNum, units=0; 19 double gpa; 20 char *subCode; 21 char comm[BUFSIZE]; 22 char sql[BUFSIZE]; 23 char *sqlBegin="BEGIN", *sqlCommit="COMMIT", *sqlRollback="ROLLBACK"; 24 char userid[10]; 25 char year[10]; 26 char term[10]; 27 28 WakabaUser account; 29 Student student; 30 Mark marks[100]; 31 32 /* コマンド引数取得 */ 33 n = sscanf(recvBuf, "%s %s %s %s", comm, userid, year, term[0]); 34 if(n!=4){ 35 sprintf("%s %d%s", ER_STAT, E_CODE_2, ENTER); 36 return -1; 37 } 38 39 /*入力された学期を格納*/ 40 marks->term[0] = term[0]; 41 42 /* 学籍番号・科目コード・点数をとりだす*/ 43 sprintf(sql,"SELECT user_id,subject_code,score,year FROM marks WHERE user_id='%s' AND year='%s'", userid, year); 44 printf("[%s]\n",sql); 45 resStd = PQexec(con, sql); 46 if(PQresultStatus(resStd) != PGRES_TUPLES_OK){ 47 printf("%s\n", PQresultErrorMessage(resStd)); 48 sprintf("%s %d%s", ER_STAT, E_CODE_4, ENTER); 49 return -1; 50 } 51 resultRows = PQntuples(resStd); 52 if(resultRows != 1){ 53 sprintf("%s %d%s", ER_STAT, E_CODE_1, ENTER); 54 return -1; 55 } 56 57 // 学生・成績オブジェクトに各値を代入 58 for(i=0; i<resultRows; i++){ 59 strcpy(student.userId,PQgetvalue(resStd, i, 0)); 60 strcpy(marks[i].subCode,PQgetvalue(resStd, i, 1)); 61 marks[i].score = atoi(PQgetvalue(res, i, 2)); 62 strcpy(marks[i].year,PQgetvalue(resStd, i, 3)); 63 } 64 65 // 単位数を取得(科目コードから) 66 sprintf(sql, "SELECT subject_code,unit_number,term FROM subject_t WHERE subject_code = 'marks->subCode' term = 'marks->term[0]'"); 67 68 printf("[%s]\n",sql); 69 resMrk = PQexec(con, sql); 70 if(PQresultStatus(resMrk) != PGRES_TUPLES_OK){ 71 printf("%s\n", PQresultErrorMessage(resMrk)); 72 sprintf("%s %d%s", ER_STAT, E_CODE_4, ENTER); 73 return -1; 74 } 75 resultRows = PQntuples(resMrk); 76 77 for(i=0;i<resultRows;i++){ 78 marks[i].unit = atoi(PQgetvalue(res, i, 1)); 79 80 // 単位数カウント 81 units += marks[i].unit; 82 } 83 84 // GPA算出 85 gpa = get_gpa(units,marks,resultRows); 86 87 // レスポンス送信 88 sendLen = sprintf(sendBuf,"units:%d GPA:%f%s", units, gpa, ENTER); 89 send(soc, sendBuf, sendLen, 0); 90 printf("[C_THREAD %ld] SEND=> %s", selfId, sendBuf); 91 92 return 0; 93}
データベースから情報を取ってきて、GPAを計算するプログラムを書いています。
概要は
1、成績DB(marks)から科目コードと点数を取ってくる。
2、科目DB(subject_t)から科目コードと一致する科目の単位するを取ってくる
3、GPAを計算
欲しい挙動としてはプロトコルコマンド
GPA 66660320 前期
3.50
のような感じで出力してほしいのですが、エラーコード300しか出ません。
しかし、プログラム中にエラーコード300は使っていません。
エラーコードはそれぞれ
E_CODE 1 100
E_CODE 2 200
E_CODE 3 300
E_CODE 4 400
です。
どうして、300がでるのか教えてくださいませんか?
また、GPAの計算プログラムはあっているでしょうか?
回答1件
あなたの回答
tips
プレビュー