【掲示板ご利用上の注意】

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

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


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

No.22969

同じもの同士の値を足し算し結果を表示。
投稿者---一人(2005/09/07 02:16:34)


ファイルからレコードを読み込み、Noが同じもの同士のsize
の値を足し算し、その和を求めています。
一応、動くものはできたのですが、スマートというか見栄えの良いも
のではないです。
少し、良くしたいのです。
お願いします。

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

main()
{
    FILE *fp;
    char buff[256] ;
    char read_data[3][64];
    char *p;
    char no[6];
    char name[64];
    char s_size[9];
    char dummy_no[6];
    char dummy_name[64];
    long size;
    int  i;

    fp = fopen("file.txt","r");
    if (fp == NULL) {
        printf("file open error\n") ;
        exit(1) ;
    }

    memset(dummy_no,'\0',sizeof dummy_no) ;
    memset(dummy_name,'\0',sizeof dummy_name) ;

    while(fgets(buff,sizeof buff,fp)) {
        i = 0;
        p=strtok(buff,",");
        strcpy(no,p);
        p=strtok(NULL,",");
        strcpy(name,p);
        p=strtok(NULL,",");
        strcpy(s_size,p);

        if (strcmp(dummy_no,no) == 0) {
            size = size + atol(s_size) ;
        } else {
            if (dummy_no[0] != '\0') {
                printf("No[%s] Name[%s] size[%ld]\n",dummy_no,dummy_name,size);
                size = 0;
            }
            size = atoi(s_size);
            strcpy(dummy_name,name);
            strcpy(dummy_no,no);
        }

        memset(read_data,'\0',sizeof read_data) ;
    }
    printf("No[%s] Name[%s] size[%ld]\n",dummy_no,dummy_name,size);
    fclose(fp);
}



読み込むファイルは、以下の様にすでにソート済みです。
ファイルのフォーマットは、左から順に、No、Name、Sizeです。
000001,yamada.taro,100
000001,yamada.taro,100
000001,yamada.taro,100
000001,yamada.taro,100
000001,yamada.taro,100
000002,satou.jiro,1000
000003,yamamoto.koutaro,123
000003,yamamoto.koutaro,100
000003,yamamoto.koutaro,10
000004,ito.hanako,250



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:同じもの同士の値を足し算し結果を表示。 22970 επιστημη 2005/09/07 05:16:13
<子記事> Re:同じもの同士の値を足し算し結果を表示。 22972 かずま 2005/09/07 09:35:26
<子記事> Re:同じもの同士の値を足し算し結果を表示。 22974 一人 2005/09/07 19:04:23


No.22970

Re:同じもの同士の値を足し算し結果を表示。
投稿者---επιστημη(2005/09/07 05:16:13)


>一応、動くものはできたのですが、スマートというか見栄えの良いも
>のではないです。
>少し、良くしたいのです。

構造体を使う。



この投稿にコメントする

削除パスワード

No.22973

Re:同じもの同士の値を足し算し結果を表示。
投稿者---まきじ(2005/09/07 11:47:46)


>構造体を使う。

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

typedef struct data{
    char no[64];
    char name[128];
    int size;
}DATA;

int main(void){

    DATA rec = {{'\0'},{'\0'},0};
    DATA old = {{'\0'},{'\0'},0};
    FILE *fp;
    char buf[256];
    int total = 0;
    
    if((fp = fopen("file","r")) == NULL) return 1;
    
    do{
        old.no[0] = '\0';
        total = 0;
        while(!strcmp(old.no,rec.no) || old.no[0] == '\0'){
            old = rec;
            total += rec.size;
            fgets(buf,256,fp);
            if(feof(fp)) break;
            sscanf(buf,"%[^,],%[^,],%d",rec.no,rec.name,&rec.size);
        }
        printf("%s,%s,%d\n",old.no,old.name,total);
    }while(!feof(fp));
    
    fclose(fp);
    
    return 0;
}





この投稿にコメントする

削除パスワード

No.22972

Re:同じもの同士の値を足し算し結果を表示。
投稿者---かずま(2005/09/07 09:35:26)


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

int main(void)
{
    char buff[256], name[64], prev_name[64];
    int no, prev_no = -1;
    long size, total_size;

    FILE *fp = fopen("file.txt","r");
    if (fp == NULL) printf("file open error\n"), exit(1);

    while (fgets(buff, sizeof buff, fp)) {
        if (sscanf(buff, "%d,%[^,],%ld", &no, name, &size) != 3) continue;
        if (no != prev_no) {
            if (prev_no > 0)
                printf("No[%06d] Name[%s] size[%ld]\n", prev_no, prev_name, total_size);
            prev_no = no;
            strcpy(prev_name, name);
            total_size = size;
        } else
            total_size += size;
    }
    printf("No[%06d] Name[%s] size[%ld]\n", prev_no, prev_name, total_size);
    fclose(fp);
    return 0;
}



この投稿にコメントする

削除パスワード

No.22974

Re:同じもの同士の値を足し算し結果を表示。
投稿者---一人(2005/09/07 19:04:23)


ありがとうございます。

ループが違っても同じ処理が実現できるのですね。
人の考え方がありますが、同じwhle文のループでも
こうも違うものかと。
考え方があまいと思い直しました。



この投稿にコメントする

削除パスワード

No.22983

Re:同じもの同士の値を足し算し結果を表示。
投稿者---かずま(2005/09/08 10:16:03)


> ループが違っても同じ処理が実現できるのですね。
> 人の考え方がありますが、同じwhle文のループでも
> こうも違うものかと。

sizeof(DATA) は、処理系にもよりますが、196バイト程度です。
構造体を使うと、old = rec; のようにデータのコピーが見た目はスマートに
行えますが、そのプログラムでは、与えられた 10行の入力ファイルに対して
コピーを 11回行います。no や name には合わせて 20バイト程度しかデータ
が入っていないのに、196バイトのデータを 11回コピーします。

prev_no = no; strcpy(prev_name, name), total_size = size; のほうは、
20バイト程度のデータを 4回コピーするだけで済んでいます。4回というのは
異なるデータの個数ということです。

コンピュータは処理速度が速いから、そんな違いは人間にはわからない。
だから、無駄な処理をしたっていいじゃないかという考え方もあります。
皆さんもそう思いますか?


この投稿にコメントする

削除パスワード

No.22985

Re:同じもの同士の値を足し算し結果を表示。
投稿者---たいちう(2005/09/08 10:48:12)


> コンピュータは処理速度が速いから、そんな違いは人間にはわからない。
> だから、無駄な処理をしたっていいじゃないかという考え方もあります。
> 皆さんもそう思いますか?

私はそう思います。
少しでもプログラムの可読性が良くなるならば、処理時間が100倍になろうと、
メモリを100倍使おうと構わない。人間の都合が第一です。

補足1 スピードが優先される、メモリが制限されるという、いわばユーザーの都合は
    プログラマの都合よりも優先順位が高い。
補足2 これも言うまでもないことですが、悪いプログラムは可読性も処理時間も
    メモリ使用量も全て悪い場合が多い。

おまけ かずまさん、いつも美しいサンプルに感嘆しています。


この投稿にコメントする

削除パスワード

No.23010

Re:同じもの同士の値を足し算し結果を表示。
投稿者---一人(2005/09/08 22:35:21)


>コンピュータは処理速度が速いから、そんな違いは人間にはわからない。
>だから、無駄な処理をしたっていいじゃないかという考え方もあります。
>皆さんもそう思いますか?
私はそう思いません。
無駄な処理を省けるのならば省き、メモリを低く、早い方が良いと思い
ます。
プログラムの可読性も良くしたいです。

>補足2 これも言うまでもないことですが、悪いプログラムは可読性も
>    処理時間もメモリ使用量も全て悪い場合が多い。
言えてます。
未だに、この状況から抜け切れていないです。


この投稿にコメントする

削除パスワード

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