ショッピングモール  その他コーヒー・ココア  ウイスキー(スコッチ・ウイスキー)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5270

下記関数における問題点について
投稿者---新入社員(2006/01/16 16:18:10)


下記はファイルに氏名と点数を書き込みそれらを構造体に代入し,
その値で色々と操作を行う。成績管理システムプログラムの関数の1部なのですが、ループが滅茶苦茶になったことと、半角スペースを読むために
scanfではなくgetsを使いたいがそうするとうまく動かない。
という2つの問題点があるのですが対処法、改善法などについてアドバイスお願いいたします。/**/で挟んでいる箇所がコンパイルすると上手く動かない箇所です。


void fp1(){

                int r;

                fp = fopen( "seiseki3.txt" , "a+" );

                if(fp == NULL){
                printf("seiseki3.txt使用不可\n");
                }

                while( 1 ){

                         /* k = 0;

                         while( fgets( buf, sizeof(buf), fp ) != NULL ){
                                for( i = 0; i < sizeof(buf); i++ ){
                                 if( strncmp( &buf[i] , "\t" , 1 )==0 ){
                                     strncpy( data[k].name , buf , i );
                                     data[k].score = atoi( &buf[i+1] );
                                     k = k + 1;
                                 }
                                }
                         } */

                        printf( "氏名を入力=> " );
                        gets(name);
                        /* scanf( "%s" , name ); */
                        if( strcmp( name , "end" ) == 0 )
                        break;

                                 /* for( r = 0; r <= k; r++ ){
                                     if(strcmp( name , data[r].name ) == 0){
                                printf( "%sは既に登録されています\n" , name );
                                printf( "今回の入力で更新しますか?(y/n)=> " );
                                scanf( "%s" , judge );
                                if( strcmp( judge , "y" ) == 0 ){
                                   printf( "点数を入力=> " );
                                   scanf( "%d" , &data[r].score );
                                   fprintf( fp, "%d\n" , data[r].score );
                                   break;
                                }
                                else{
                                    break;
                                }
                                     }
                                 } */

                        fprintf( fp , "%s\t" , name );

                        printf( "点数を入力=> " );
                        scanf( "%s" , buf );
                        if( strcmp( buf , "end" ) == 0 )
                        break;
                        score = atoi( buf );

                if( score == 0 ){
                        if( strcmp( buf , "0" ) != 0 ){
                        printf( "点数誤り。0〜100までの整数値を入力=> " );
                        scanf( "%s" , buf );
                        if( strcmp( buf , "end" ) == 0 )
                        break;
                        score = atoi( buf );
                        fprintf( fp, "%d\n" , score );
                        }
                }
                else{
                    fprintf( fp, "%d\n" , score );
                }

                }

                fclose(fp);
          }



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:下記関数における問題点について 5271 shu 2006/01/16 17:13:52
<子記事> Re:下記関数における問題点について 5272 Blue 2006/01/16 17:22:21
<子記事> Re:下記関数における問題点について 5273 nop 2006/01/16 17:45:27
<子記事> Re:下記関数における問題点について 5274 nop 2006/01/16 17:55:34
<子記事> Re:下記関数における問題点について 5275 επιστημη 2006/01/17 07:34:21


No.5271

Re:下記関数における問題点について
投稿者---shu(2006/01/16 17:13:52)


>という2つの問題点があるのですが対処法、改善法などについてアドバイスお願いいたします。

関数の名前が悪い。
関数の目的がわからない。
関数が大きすぎる。

などにより、問題そのものより、結果的に問題点が解かりにくくなっています。

参考に
ソフトウェア開発をシンプルにする考え方のコツ


この投稿にコメントする

削除パスワード

No.5280

Re:下記関数における問題点について
投稿者---shu(2006/01/17 13:12:46)


//
//  問題点以外のごちゃごちゃをすっきりさせてみたプログラム
//

//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//
#define DATA_N  512

//
struct student
{
    char name[32];
    int score;
};

//
//
int main( void )
{
    FILE *fp;
    struct student data[DATA_N];
    char buf[BUF_SIZ];
    int data_n, i;
    
    //
    fp = fopen( "seiseki3.txt", "r+" );
    if (fp == NULL) {
        puts( "seiseki3.txt使用不可" );
        exit( 1 );
    }
    
    //  ファイルからの入力
    for (i = 0; i < DATA_N && fgets( buf, sizeof(buf), fp ); i++)
    {
        sscanf( buf, "%s%d", data[i].name, &data[i].score );
    }
    
    //  新規の入力など
    for (; i < DATA_N; i++)
    {
        //  名前入力
        //  点数入力
        //  重複時の処理など
    }
    
    //  ファイルへの書きこみ
    //  student data[]につくられたデータをまとめて出力
    data_n = i;
    rewind( fp );
    
    for (i = 0; i < data_n; i++)
    {
        fprintf( fp, "%s%c%d\n", data[i].name, '\t', data[i].score );
    }
    
    //
    fclose( fp );
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.5283

Re:下記関数における問題点について
投稿者---新入社員(2006/01/17 16:07:06)


><pre><font color="#33cc33">//</font>
<font color="#33cc33">// 問題点以外のごちゃごちゃをすっきりさせてみたプログラム</font>
<font color="#33cc33">//</font>

<font color="#33cc33">//</font>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

<font color="#33cc33">//</font>
#define DATA_N 512

<font color="#33cc33">//</font>
struct student
{
char name[32];
int score;
};

<font color="#33cc33">//</font>
<font color="#33cc33">//</font>
int main( void )
{
FILE *fp;
struct student data[DATA_N];
char buf[BUF_SIZ];
int data_n, i;

<font color="#33cc33">//</font>
fp = fopen(<font color="#3333ff"> "seiseki3.txt"</font>,<font color="#3333ff"> "r+"</font> );
if (fp == NULL) {
puts(<font color="#3333ff"> "seiseki3.txt使用不可"</font> );
exit( 1 );
}

<font color="#33cc33">// ファイルからの入力</font>
for (i = 0; i < DATA_N && fgets( buf, sizeof(buf), fp ); i++)
{
sscanf( buf,<font color="#3333ff"> "%s%d"</font>, data[i].name, &data[i].score );
}

<font color="#33cc33">// 新規の入力など</font>
for (; i < DATA_N; i++)
{
<font color="#33cc33">// 名前入力</font>
<font color="#33cc33">// 点数入力</font>
<font color="#33cc33">// 重複時の処理など</font>
}

<font color="#33cc33">// ファイルへの書きこみ</font>
<font color="#33cc33">// student data[]につくられたデータをまとめて出力</font>
data_n = i;
rewind( fp );

for (i = 0; i < data_n; i++)
{
fprintf( fp,<font color="#3333ff"> "%s%c%d\n"</font>, data[i].name, '\t', data[i].score );
}

<font color="#33cc33">//</font>
fclose( fp );

return 0;
}</pre>

ありがとうございます。
上のプログラムや皆さんの意見を参考に後は自力で解決します。
また、分からない点があれば質問しに来ます。
どうもありがとうございました。





この投稿にコメントする

削除パスワード

No.5272

Re:下記関数における問題点について
投稿者---Blue(2006/01/16 17:22:21)


とりあえず、最初の /* 〜 */ だけ気になったところ。

>     for ( i = 0; i < sizeof( buf ); i++ )

文字列として扱いたいので、上限を sizeof( buf ) でなく、終端文字'\0' をみてループするようにしましょう。

     for ( i = 0; i < buf[ i ] != '\0'; i++ )


>         if ( strncmp( &buf[ i ] , "\t" , 1 ) == 0 )

一文字比較するならば、strncmpを使うより

        if ( buf[ i ] == '\t' )

としたほうが良いでしょう。


>             strncpy( data[ k ].name , buf , i );

ですが、strncpy は 指定文字数分 コピーしたあと、 終端文字を入れないので、明に入れてあげるようにしたほうが良いです。

             strncpy( data[ k ].name , buf , i );
             data[ k ].name[ i ] = '\0';



> コンパイルすると上手く動かない
がイマイチよくわからないので、もう少し現象を詳しく説明してください。

全体的に情報が少ないと思います。
このソースで使われている変数の情報や構造体の情報等も載せたほうがよいです。


この投稿にコメントする

削除パスワード

No.5276

Re:下記関数における問題点について
投稿者---新入社員(2006/01/17 09:49:26)


>> コンパイルすると上手く動かない
>がイマイチよくわからないので、もう少し現象を詳しく説明してください。
>
>全体的に情報が少ないと思います。
>このソースで使われている変数の情報や構造体の情報等も載せたほうがよいです。

ご回答ありがとうございます。
上記の意見を参考にとりあえず修正してみます。
尚、変数、関数、構造体ですが、

struct student{
char name[30];
int score;
};

struct student data[500] = {
};

int i,j,k,score;
char name[256],buf[256],name2[256];
FILE *fp;
char judge[5];

を宣言し使用しています。
コンパイルすると上手く行かない点はループが私の
意図通りに動かず困っています。
例えば氏名を入力した際、既にファイルに書き込まれている
氏名を入力すると登録済みをprintfし、更新するかどうかを
yかその他のキー入力で判断し更新する場合は新点数をファイルに
書き込みたいループを作ったのですが、どうも上手く動かなくて・・・


この投稿にコメントする

削除パスワード

No.5273

Re:下記関数における問題点について
投稿者---nop(2006/01/16 17:45:27)


まず、投稿文の改行位置が、不自然で読みにくいです。

>うまく動かない。
>対処法、改善法などについてアドバイスお願いいたします。

1.どの様に動作する事が正しいのか?
2.現在、どの様な動作をするのか?
3.自分でどこまで調査したのか?
4.疑問点はどこか?

これらの情報が不足しています。
新入社員であっても、これらの点を整理する事は可能なはずです。
質問内容を整理し、回答者に正しく伝わるか、
ご自分の投稿内容をよく確認して投稿してから下さい。


この投稿にコメントする

削除パスワード

No.5274

Re:下記関数における問題点について
投稿者---nop(2006/01/16 17:55:34)


[追記]
変数宣言が「r」以外、見あたりません。
推測可能なものもなきにしもあらずですが、
変数宣言くらいはきちんと載せましょう。

また、ソースのインデントが不自然で読みにくいです。

そして、コーディングを行う前に、
処理内容を母国語で考えてみましたか?
母国語で内容を説明出来ない曖昧な処理を、
コンピュータに行わせるなど出来るわけがありません。
まずは、処理内容を母国語で細かく考えて見ましょう。


この投稿にコメントする

削除パスワード

No.5275

Re:下記関数における問題点について
投稿者---επιστημη(2006/01/17 07:34:21)


>scanfではなくgetsを使いたいがそうするとうまく動かない。

なにがどう「うまく動かない」か説明を求む。

# 「具合が悪い」の一言で治療できる医者はいない。
# …"お約束"のフレーズになってきたな (^^



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity