掲示板利用宣言

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

 私は

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

掲示板2

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

No.26010

構造体でsort
投稿者---ぴよ(2006/02/05 20:39:33)


基本情報H8秋試験問7の
void sort_addr( ADDR *base, int nmemb );
void sort_ji( JI *base, int nmemb );部分を自分なりに作成しましたが、
エラー E2141 H8_autumn_7.c 89: 宣言の構文エラー(関数 sort_addr )
エラー E2451 H8_autumn_7.c 98: 未定義のシンボル work(関数 sort_addr )
エラー E2141 H8_autumn_7.c 118: 宣言の構文エラー(関数 sort_ji )
エラー E2451 H8_autumn_7.c 127: 未定義のシンボル work(関数 sort_ji )
となります。
このサイトを参考にしたり、いろいろと調べましたが
わかりませんでしたので、お手数ですが、よろしくお願いします。



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

#define ADSIZE 66
#define LOGMAX 128

typedef struct {
    int cnt;
    char *urlp;
}ADDR;

typedef struct {
    int cnt;
    int hour;
}JI;

typedef struct {
    long yymmdd;
    int hhmm;
    char arec[ADSIZE];
}LOG;

void sort_addr( ADDR *base, int nmemb );
void sort_ji( JI *base, int nmemb );

ADDR loginf[LOGMAX];
char logbuf[LOGMAX*ADSIZE];
JI ji_t[24];

main ()
{
    LOG ibuf;
    char *cp, sbuf[ADSIZE];
    FILE *wfp;
    int rcnt = 0, idx = 0, i;

    for ( i = 0; i < 24; i++ )
    {
        ji_t[i].cnt = 0;
        ji_t[i].hour = i;
    }

    wfp = fopen ( "www.log","r" );
    sbuf[0] = '\0';
    cp = logbuf;

    while ( fscanf ( wfp, "%ld %d %s\n", &ibuf.yymmdd, &ibuf.hhmm, ibuf.arec ) != EOF )
    {
        rcnt++;
        ji_t[ibuf.hhmm/ 100].cnt++;
        printf ( "%ld", ibuf.yymmdd );
        printf ( "\n%d", ibuf.hhmm );
        printf ( "\n%s", ibuf.arec );
        printf ( "\nji_t = %d cnt = %d\n", ibuf.hhmm/100, ji_t[ibuf.hhmm/100].cnt  );

        if ( strcmp ( sbuf, ibuf.arec ) == 0 )
        {
            loginf[idx - 1].cnt++;
        }
        else
        {
            loginf[idx].urlp = cp;
            loginf[idx].cnt = 1;
            strcpy( loginf[idx].urlp, ibuf.arec );
            cp += ( strlen ( ibuf.arec ) + 1);
            strcpy ( sbuf, ibuf.arec );
            idx++;
        } 
    }
    fclose( wfp );
    
    sort_addr ( loginf, idx );
    printf ( "        ***  アクセス回数表 ***\n" );
    printf ( "   順位   アクセス回数   アクセス先\n" );
    for ( i = 0; i < 5; i++, idx-- )
    {
        if ( idx == 0 ) break;
        printf ( "  %d  %6d回 %s\n", i + 1, loginf[i].cnt, loginf[i].urlp );
    }

    sort_ji( ji_t, 24 );
    printf ( "\n     **** アクセス時間帯表    ****\n" );
    printf ( "   順位 時間帯 アクセス比\n" );
    for ( i = 0; i < 5; i++ )
    {                                            
        if ( ji_t[i].cnt == 0 ) break;
        printf ( "  %d  %2d時台  %31d%\n", i + 1, ji_t[i].hour, ji_t[i].cnt*100L/ rcnt );
    }

    return;
}

void sort_addr( ADDR *base, int nmemb )
{
    ADDR *p
    ADDR work;
    int i, j;

    p = base;

    for ( i = 0; i < nmemb; i++ )
    {  
        for ( j = i; j < nmemb; j++ )
        {
            if ( ( p + j )->cnt < ( p + j + 1 )->cnt )
            {
                work = *( p + j );
                *( p + j ) = *( p + j + 1 );
                *( p + j + 1 ) = work;
            }
            if ( ( p + j )->cnt == ( p + j + 1 )->cnt )
            {
                if ( strcmp ( ( p + j )->urlp, ( p + j + 1 )->urlp ) < 0 )
                {
                    work = *( p + j );
                    *( p + j ) = *( p + j + 1 );
                    *( p + j + 1 ) = work;
                }
            }
        }
    }
}

void sort_ji( JI *base, int nmemb )
{
    JI *p
    JI work;
    int i, j;

    p = base;

    for ( i = 0; i < nmemb; i++ )
    {  
        for ( j = i; j < nmemb; j++ )
        {
            if ( ( p + j )->cnt < ( p + j + 1 )->cnt )
            {
                work = *( p + j );
                *( p + j ) = *( p + j + 1 );
                *( p + j + 1 ) = work;
            }
            if ( ( p + j )->cnt == ( p + j + 1 )->cnt )
            {
                if ( ( p + j )->hour == ( p + j + 1 )->hour )
                {
                    work = *( p + j );
                    *( p + j ) = *( p + j + 1 );
                    *( p + j + 1 ) = work;
                }
            }
        }
    }
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体でsort 26011 Hermit 2006/02/05 21:24:16


No.26011

Re:構造体でsort
投稿者---Hermit(2006/02/05 21:24:16)


>このサイトを参考にしたり、いろいろと調べましたが
>わかりませんでしたので、お手数ですが、よろしくお願いします。

まずコンパイラを信用しましょう。
エラーメッセージのあたりに、間違いがあるはずです。

p の後に、';' が必要なはずです。


この投稿にコメントする

削除パスワード

No.26013

Re:構造体でsort
投稿者---RAPT(2006/02/06 00:23:53)


# コピペなんてするから、同じ罠が2つできる。


この投稿にコメントする

削除パスワード

No.26015

Re:構造体でsort
投稿者---ぴよ(2006/02/06 02:13:40)


Hermit さん,RAPT さん ありがとうございます。
時間かけて考えてこんな単純なことも
自分で気がつかないのにはなさけなくなります。
ソートのアルゴリズムも間違っておりました。
下記の通りに変更しましたら、うまくいきました。
また単純なことかもしれませんが、work の中身を
printfで見たかったのですが、どうもうまくいきません。
printf ( "work = %s\n", work );
printf ( "work = %s\n", work[i].urlp );
も試してみましたが、うまくいきませんでした。
どのようにしたらよろしいのでしょうか?

void sort_addr( ADDR *base, int nmemb )
{
    ADDR *p;
    ADDR work;
    int i, j;
    p = base;

    for ( i = 0; i < nmemb; i++ )
    {  
        for ( j = i; j < nmemb ; j++ )
        {
            if ( ( p + i )->cnt < ( p + j )->cnt )
            {
                work = *( p + i );
                *( p + i ) = *( p + j );
                *( p + j ) = work;
            }
            if ( ( p + i )->cnt == ( p + j )->cnt )
            {
                if ( strcmp ( ( p + i )->urlp, ( p + j )->urlp ) > 0 )
                {
                    work = *( p + i );
                    *( p + i ) = *( p + j );
                    *( p + j ) = work;
                }
            }
        }
    }
}

void sort_ji( JI *base, int nmemb )
{
    JI *p;
    JI work;
    int i, j;
    p = base;

    for ( i = 0; i < nmemb; i++ )
    {  
        for ( j = i; j < nmemb; j++ )
        {
            if ( ( p + i )->cnt < ( p + j )->cnt )
            {
                work = *( p + i );
                *( p + i ) = *( p + j );
                *( p + j ) = work;
            }
            if ( ( p + i )->cnt == ( p + j )->cnt )
            {
                if ( ( p + i )->hour > ( p + j )->hour )
                {
                    work = *( p + i );
                    *( p + i ) = *( p + j );
                    *( p + j ) = work;
                }
            }
        }
    }
}




この投稿にコメントする

削除パスワード

No.26022

Re:構造体でsort
投稿者---TJ(2006/02/06 08:58:54)
http://home.f01.itscom.net/toge/programingreport/


>また単純なことかもしれませんが、work の中身を
>printfで見たかったのですが、どうもうまくいきません。
>printf ( "work = %s\n", work );
>printf ( "work = %s\n", work[i].urlp );
>も試してみましたが、うまくいきませんでした。
>どのようにしたらよろしいのでしょうか?
例えば
char *str = "Hello World\n";
だったら
printf("%s\n", str);
としますよね?

構造体でも同じ事で、文字列の先頭アドレスを渡す必要があります。
とすると、
printf ( "work = %s\n", work.urlp );
のようになります。


この投稿にコメントする

削除パスワード

No.26029

Re:構造体でsort
投稿者---ぴよ(2006/02/07 00:39:14)


ありがとうございます。
URLも拝見させて頂きました。
とても参考になりました。

>構造体でも同じ事で、文字列の先頭アドレスを渡す必要があります。
>とすると、
>printf ( "work = %s\n", work.urlp );
>のようになります。

なるほどです。
納得の回答をありがとうございました。



この投稿にコメントする

削除パスワード

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