mallocなどを使わずにすませる方法
Posted: 2008年2月24日(日) 11:21
こんにちは、初めて質問致します黒猫です。
課題を解いているのですが、途中でつまづいてしまいました。
プログラムは完成しているのですが、教科書の見本などを繋ぎ合わせて作ったので、まだ理解出来ないまま使っているものがあります。「malloc」や「free」などです。
どうにかこれらを使わずに書き換えられないものでしょうか。
すみませんが、アドバイスをお願いいたします><
以下、設問と作成したプログラムです。
・名前(char)、身長(double)、体重(double)、視力(視力構造体)これらのデータをメンバとする構造体を定義して、入力された表示を行うプログラムを作成。
入力件数は最大5件で、名前は19文字までの入力。
範囲外だったならばエラーメッセージ(Sorry. Input less than 20 characters.)を表示し再入力。
名前に"END"が入力されたときは入力を終了して表の表示に移るが、もし最初に"END"が入力された場合は、その旨のメッセージ(Input data is nothing!)を出力。
表示は身長で昇順にソートして出力。
身長、体重は、小数第一位までの表示とし、視力は、小数第三位までの表示。
出力の幅は、名前が19文字、その他は5文字で指定。
視力は右(double)、左(double)をメンバとする構造体で扱うこと。
1件分の入力はinput_data()、表示はdisplay_data()、ソートはsort_data()と処理を関数に分けて行う。
名前の入力の所でつまずいています。
使用環境は、Visual C++2005、Win Vistaです。
以上です。
宜しくお願いします。
課題を解いているのですが、途中でつまづいてしまいました。
プログラムは完成しているのですが、教科書の見本などを繋ぎ合わせて作ったので、まだ理解出来ないまま使っているものがあります。「malloc」や「free」などです。
どうにかこれらを使わずに書き換えられないものでしょうか。
すみませんが、アドバイスをお願いいたします><
以下、設問と作成したプログラムです。
・名前(char)、身長(double)、体重(double)、視力(視力構造体)これらのデータをメンバとする構造体を定義して、入力された表示を行うプログラムを作成。
入力件数は最大5件で、名前は19文字までの入力。
範囲外だったならばエラーメッセージ(Sorry. Input less than 20 characters.)を表示し再入力。
名前に"END"が入力されたときは入力を終了して表の表示に移るが、もし最初に"END"が入力された場合は、その旨のメッセージ(Input data is nothing!)を出力。
表示は身長で昇順にソートして出力。
身長、体重は、小数第一位までの表示とし、視力は、小数第三位までの表示。
出力の幅は、名前が19文字、その他は5文字で指定。
視力は右(double)、左(double)をメンバとする構造体で扱うこと。
1件分の入力はinput_data()、表示はdisplay_data()、ソートはsort_data()と処理を関数に分けて行う。
名前の入力の所でつまずいています。
使用環境は、Visual C++2005、Win Vistaです。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUF 256
#define NAME_MAX 19
#define DATA_MAX 5
typedef struct eye
{
double l_eye; /*左視力*/
double r_eye; /*右視力*/
}Eye;
typedef struct
{
char name[NAME_MAX + 1]; /*名前*/
double height; /*身長*/
double weight; /*体重*/
Eye eye; /*視力*/
}Person;
int input_data(Person *mem);
void sort_data(Person *pmem,int max_cnt);
void display_data(const Person *pmem,int max_cnt);
int main(void)
{
int cnt;
Person data[DATA_MAX];
cnt = input_data(data);
sort_data(data,cnt);
display_data(data,cnt);
return 0;
}
int input_data(Person *mem)
{
int i = 0,cnt = 0;
char *buf;
while( i < DATA_MAX )
{
buf = (char *)malloc( BUF * sizeof( char ) );
if( buf )
{
printf("\n");
printf("Name : ");
scanf("%255s", buf);
}
if( !strcmp(buf,"END") && cnt == 0 )
{
printf("\n Input data is nothing! \n");
exit(0);
}
if( !strcmp(buf,"END") )
{
return cnt;
}
if ( strlen(buf) > NAME_MAX )
{
printf("\n Sorry. Input less than %d characters. \n",NAME_MAX + 1);
continue;
}
else
{
strcpy( (mem+i)->name , buf );
free(buf);
}
printf("Height : ");
scanf("%lf", &((mem+i)->height));
printf("Weight : ");
scanf("%lf", &((mem+i)->weight));
printf("Eye(L) : ");
scanf("%lf", &((mem+i)->eye.l_eye));
printf(" (R) : ");
scanf("%lf", &((mem+i)->eye.r_eye));
i++;
cnt++;
}
return cnt;
}
void sort_data(Person *pmem,int max_cnt)
{
int cnt1;
int cnt2;
Person temp; /* 一時格納領域 */
for(cnt1 = 0 ; cnt1 < max_cnt-1 ; cnt1++) /* ソート処理 */
{
for(cnt2 = cnt1+1 ; cnt2 < max_cnt ; cnt2++)
{
if( (pmem+cnt1)->height > (pmem+cnt2)->height)
{
temp = *(pmem+cnt1);
*(pmem+cnt1) = *(pmem+cnt2);
*(pmem+cnt2) = temp;
}
}
}
}
void display_data(const Person *pmem,int max_cnt)
{
int cnt; /* 個人情報件数カウンタ */
printf("\n********Name***********Hi*****We***(L) Eye (R)**\n");
for(cnt = 0 ; cnt < max_cnt ; cnt++)
{
printf("%-*s %6.1f %6.1f %6.3f %6.3f\n", NAME_MAX, /* データ表示 */
&(pmem+cnt)->name[0],(pmem+cnt)->height,(pmem+cnt)->weight,
(pmem+cnt)->eye.l_eye, (pmem+cnt)->eye.r_eye);
}
return;
}
以上です。
宜しくお願いします。