プログラミングの課題で・・・
Posted: 2017年1月17日(火) 01:17
プログラミングの問題が分かりません
教えてください・・・
C言語です
問題
データ例のように、1行目にデータ数、2行目以降はデータ数分のデータ(名前、背番号、打数、安打数)が並んでいるファイルがある。
[ データ例 carp5.dat ]
5
Seiya 51 466 156
Arai 25 454 136
Maru 9 557 162
Kikuchi 33 574 181
Tanaka 2 581 154
[ データ例 central6.dat ]
6
Yamada 1 481 146
Fukudome 8 453 141
Kikuchi 33 574 181
Tsutsugo 25 469 151
Seiya 51 466 156
Sakamoto 6 488 168
このようなデータファイルに対して以下のような処理を実行するプログラムを作成せよ.
(1).コマンドラインからデータファイル名を指定する
(2).先頭ので0タスを読み込んで、データ数分のデータ領域を動的に確保する
(3).データファイルの2行目以降は、1度読みこむたびに、makePlayerData関数を用いてデータを作成する
(4).printPlayerData関数を用いて、データを逆順に出力する
↓
/* -*-coding: utf-8-*- */
#include <stdio.h>
#include <stdlib.h>
typedef struct player{
char name[50];/*名前を代入するname*/
int number;/*背番号を代入する変数number*/
int at_bat;/*打数を代入する変数at_bat*/
int hit;/*安打数を代入する変数hit*/
double ave;/*打率を代入する変数ave*/
} PLAYER;
PLAYER makePlayerData(char *s)
{
PLAYER x;
sscanf(s, "%s %d %d %d", x.name, &x.number, &x.at_bat, &x.hit);
x.ave = ((double)x.hit / (double)x.at_bat);
return x;
}
int printPlayData(PLAYER p)
{
return printf("%s %d %d %d %f", p.name, p.number, p.at_bat, p.hit, p.ave);
}
int main(int argc, char *argv[])
{
PLAYER *head;/*先頭アドレス用*/
PLAYER *p;/*作業用*/
char buf[256];/*fgets用*/
int player_num;/*データ数(選手数)*/
int i;/*作業用*/
FILE *fp;/*ファイルポインタ*/
/*コマンドラインパラメータの数をチェック*/
if(argc != 2){
printf("Usage: %s file_name\n", argv[0]);
exit(1);
}
/*ファイルを開く*/
char *rfile = argv[1]; fp =fopen(rfile, "r");
if(fp == NULL){
printf("File %s does'nt exits.\n", argv[1]);
exit(1);
}
/*データ数(選手数)を読み込む*/
fgets(buf, sizeof(buf), fp);/*1行目だけ読み込んでくる*/
sscanf(buf, "%s", &buf[0]);/*ここ*/
/*メモリ領域の動的確保*/
head = (PLAYER *)malloc(sizeof(PLAYER)*200);
/*PLAYERデータの生成*/
p = head;
while(fgets(buf, sizeof(buf), fp) != NULL){ /*ここ*/
*p = makePlayerData(buf); /*ここ*/
p++;
}
fclose(fp);/*ファイルを閉じる*/
/*PLAYERデータの出力*/
printf("%-8s %8s %8s %8s %8s\n", "選手名", "背番号", "打数", "安打", "打率");
for(i = 0, p = head; i < player_num; i++, p--) /*ここ*/
printPlayerData(p); /*ここ*/
/*データ領域の開放*/
free(head);
return 0;
}
Execise12.1.c:(.text+0x337): `printPlayerData' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
エラーはこの「定義されてない参照です」のみなのですが関数の部分が出来ておらず逆順に出力出来ませんし/*ここ*/とコメントしている部分は分からなくてとりあえずそれっぽい感じに入れてみただけでおそらくコアダンプや正しく動かないと思います
これらの部分を教えて頂きたいです・・・
大学生で今習ってるのですが、難しく凄く理解に苦しんでいます
お願いします!
教えてください・・・
C言語です
問題
データ例のように、1行目にデータ数、2行目以降はデータ数分のデータ(名前、背番号、打数、安打数)が並んでいるファイルがある。
[ データ例 carp5.dat ]
5
Seiya 51 466 156
Arai 25 454 136
Maru 9 557 162
Kikuchi 33 574 181
Tanaka 2 581 154
[ データ例 central6.dat ]
6
Yamada 1 481 146
Fukudome 8 453 141
Kikuchi 33 574 181
Tsutsugo 25 469 151
Seiya 51 466 156
Sakamoto 6 488 168
このようなデータファイルに対して以下のような処理を実行するプログラムを作成せよ.
(1).コマンドラインからデータファイル名を指定する
(2).先頭ので0タスを読み込んで、データ数分のデータ領域を動的に確保する
(3).データファイルの2行目以降は、1度読みこむたびに、makePlayerData関数を用いてデータを作成する
(4).printPlayerData関数を用いて、データを逆順に出力する
↓
/* -*-coding: utf-8-*- */
#include <stdio.h>
#include <stdlib.h>
typedef struct player{
char name[50];/*名前を代入するname*/
int number;/*背番号を代入する変数number*/
int at_bat;/*打数を代入する変数at_bat*/
int hit;/*安打数を代入する変数hit*/
double ave;/*打率を代入する変数ave*/
} PLAYER;
PLAYER makePlayerData(char *s)
{
PLAYER x;
sscanf(s, "%s %d %d %d", x.name, &x.number, &x.at_bat, &x.hit);
x.ave = ((double)x.hit / (double)x.at_bat);
return x;
}
int printPlayData(PLAYER p)
{
return printf("%s %d %d %d %f", p.name, p.number, p.at_bat, p.hit, p.ave);
}
int main(int argc, char *argv[])
{
PLAYER *head;/*先頭アドレス用*/
PLAYER *p;/*作業用*/
char buf[256];/*fgets用*/
int player_num;/*データ数(選手数)*/
int i;/*作業用*/
FILE *fp;/*ファイルポインタ*/
/*コマンドラインパラメータの数をチェック*/
if(argc != 2){
printf("Usage: %s file_name\n", argv[0]);
exit(1);
}
/*ファイルを開く*/
char *rfile = argv[1]; fp =fopen(rfile, "r");
if(fp == NULL){
printf("File %s does'nt exits.\n", argv[1]);
exit(1);
}
/*データ数(選手数)を読み込む*/
fgets(buf, sizeof(buf), fp);/*1行目だけ読み込んでくる*/
sscanf(buf, "%s", &buf[0]);/*ここ*/
/*メモリ領域の動的確保*/
head = (PLAYER *)malloc(sizeof(PLAYER)*200);
/*PLAYERデータの生成*/
p = head;
while(fgets(buf, sizeof(buf), fp) != NULL){ /*ここ*/
*p = makePlayerData(buf); /*ここ*/
p++;
}
fclose(fp);/*ファイルを閉じる*/
/*PLAYERデータの出力*/
printf("%-8s %8s %8s %8s %8s\n", "選手名", "背番号", "打数", "安打", "打率");
for(i = 0, p = head; i < player_num; i++, p--) /*ここ*/
printPlayerData(p); /*ここ*/
/*データ領域の開放*/
free(head);
return 0;
}
Execise12.1.c:(.text+0x337): `printPlayerData' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
エラーはこの「定義されてない参照です」のみなのですが関数の部分が出来ておらず逆順に出力出来ませんし/*ここ*/とコメントしている部分は分からなくてとりあえずそれっぽい感じに入れてみただけでおそらくコアダンプや正しく動かないと思います
これらの部分を教えて頂きたいです・・・
大学生で今習ってるのですが、難しく凄く理解に苦しんでいます
お願いします!