構造体

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
天和

構造体

#1

投稿記事 by 天和 » 15年前

C言語の課題で
コマンドラインから入力した文章を単語単位で切り出します。
但し、文章の最後にピリオドは付けません。
次に、英単語をアルファベット順の辞書式順序 (lexicographic ordering) に並び替えます。
並び替えた後、すべての英単語とその文字数を画面に表示して下さい。

並び替えのために多少の制限が必要になります。
まず簡単のため、英単語は 'a' ~ 'z' の小文字26字からなる単語に限定します。
ハイフンやピリオドといった特殊記号は一切含まないと仮定します。
単語数の上限は 30,一単語の最大文字数は 20 と仮定します。


以下のようになれば、正解です。
> gcc -o exlexico exlexico.c
> exlexico this is an advanced programming class
advanced, 8
an, 2
class, 5
is, 2
programming, 11
this, 4
>
ただしつぎのmain関数は変更せずに使用すること(括弧のついてるコメントは自分がついてないコメントは先生が書きました)
#include<stdio.h>   /*標準入出力用*/
#include<string.h>  /* 文字列処理用*/

#define MAX_WORD 30   /*単語数の上限*/
#define MAX_CHAR 20  /*一単語の最大文字数*/

typedef struct word {
char letter[MAX_CHA[/url];
int lenght;
} WORD;
int main(int, char **);/*(何のためにある?)*/
int set_word(int, char **, WORD *);
void lexicosort(WORD *, int);/*(バブルソートなどの関数を書く?)*/

int main(int argc, char **argv)
{
    WORD word[MAX_WORD]; /*コマンドラインから取得した単語を格納する構造体配列*/
    int num;      /*配列wordに格納された要素数*/
    int i;
    num = set_word(argc, argv, word);/*構造体配列のメンバ値をセット(これの意味がよくわかりません)*/
        lexicosort(word, num);                             /*単語を辞書式順序で整列*/
    for(i = 0; i < num; i++){
        printf("%s, %d\n", word.letter, word.lenght); /*結果表示*/
    }
    return 0;
}

今回のコンパイラはMacのGCCです。(ただしたまにVISUAL C++でC言語書く場合あり(ウィンドウズでレポートを書くため)
自分のレベルは教科書読みながらなら構造体が少しわかる程度でしょうか。
よろしくお願いします。

たいちう

Re:構造体

#2

投稿記事 by たいちう » 15年前

質問は?

天和

Re:構造体

#3

投稿記事 by 天和 » 15年前

失礼しました上の課題
C言語の課題で
コマンドラインから入力した文章を単語単位で切り出します。
但し、文章の最後にピリオドは付けません。
次に、英単語をアルファベット順の辞書式順序 (lexicographic ordering) に並び替えます。
並び替えた後、すべての英単語とその文字数を画面に表示して下さい。

並び替えのために多少の制限が必要になります。
まず簡単のため、英単語は 'a' ~ 'z' の小文字26字からなる単語に限定します。
ハイフンやピリオドといった特殊記号は一切含まないと仮定します。
単語数の上限は 30,一単語の最大文字数は 20 と仮定します。


以下のようになれば、正解です。
> gcc -o exlexico exlexico.c
> exlexico this is an advanced programming class
advanced, 8
an, 2
class, 5
is, 2
programming, 11
this, 4
>
のとき方を教えてほしいというのが質問です。
わからない部分はnum = set_word(argc, argv, word);/*構造体配列のメンバ値をセット*/の部分
になります。

たいちう

Re:構造体

#4

投稿記事 by たいちう » 15年前

よく見たらコメント部分に質問があったのね。
気づき難かったとはいえ失礼しました。

> /*(何のためにある?)*/

関数の宣言です。main関数については必要ありませんが、
もしも他の関数の定義をmain関数の定義よりも後に書く場合、
他の関数の宣言がなかったら、main関数のコンパイル時にその関数を
認識できません。
int i; と書いた後しか i を使えないことと似ています。

> /*(バブルソートなどの関数を書く?)*/

出題の意図はそうだと思います。
但し、ここは関数の宣言なので、別の場所に定義を書いたほうが良いでしょう。

> /*構造体配列のメンバ値をセット(これの意味がよくわかりません)*/

コマンドラインから受け取った文字列を分割し構造体に代入します。
set_wordはそのような処理を行っている、ということをコメントにして
説明しているのでしょう。

天和

Re:構造体

#5

投稿記事 by 天和 » 15年前

>よく見たらコメント部分に質問があったのね。
気づき難かったとはいえ失礼しました。

いえいえこちらこそ見づらくてすいません。
>> /*(バブルソートなどの関数を書く?)*/

>出題の意図はそうだと思います。
>但し、ここは関数の宣言なので、別の場所に定義を書いたほうが良いでしょう。

そこなんですがバブルソートって文字でもちゃんと昇順にできるのでしょうか?
バブルソートを調べてみても例題が数字ばっかなので
>> /*構造体配列のメンバ値をセット(これの意味がよくわかりません)*/

>コマンドラインから受け取った文字列を分割し構造体に代入します。
>set_wordはそのような処理を行っている、ということをコメントにして
>説明しているのでしょう。

つまりthisという一単語があったらt h i sと分けて配列に入れるということですね。

non

Re:構造体

#6

投稿記事 by non » 15年前

int set_word(int n, char **s, WORD *p)
{
    int i;
    for(i=1;i<n;i++){
        strcpy((p+i-1)->letter,*(s+i));
        (p+i-1)->lenght=strlen(*(s+i));
        puts(*(s+i));
    }
    return n-1;
}

たかぎ

Re:構造体

#7

投稿記事 by たかぎ » 15年前

私も作ってみました。
int set_word(int argc, char **argv, WORD *word)
{
    int i;
    for (i = 0; i < argc - 1; i++)
        word.lenght = sprintf(word.letter, "%s", argv[i + 1]);
    return argc - 1;
}

こんな感じでしょうか?

example

Re:構造体

#8

投稿記事 by example » 15年前

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

#define MAX_WORD 30    /* 単語数の上限 */
#define MAX_CHAR 20    /* 一単語の最大文字数 */

typedef struct word {
    char letter[MAX_CHA[/url];
    int length;
} WORD;

int set_word(int, char **, WORD *);
void lexicosort(WORD *, int);

int main(int argc, char **argv)
{
    WORD word[MAX_WORD];    /* コマンドラインから取得した単語を格納する構造体配列 */
    int num;    /* 配列wordに格納された要素数 */
    int i;

    num = set_word(argc, argv, word);    /* 構造体配列のメンバ値をセット */
    lexicosort(word, num);    /* 単語を辞書式順序で整列 */
    for(i=0; i<num; i++) {
        printf("%s, %d\n", word.letter, word.length);    /* 結果表示 */
    }

    return 0;
}

int set_word(int argc, char **argv, WORD *word)
{
    int i;

    for(i=0; i<argc-1; i++)    {
        word.length = sprintf(word.letter, "%s", argv[i+1]);
    }

    return argc - 1;
}

void lexicosort(WORD *word, int num)
{
    WORD temp;
    int i, j;

    for(i=0; i<num-1; i++) {
        for(j=num-1; j>i; j--) {
            if(strcmp(word[j-1].letter, word[j].letter) > 0) {
                temp = word[j];
                word[j] = word[j-1];
                word[j-1] = temp;
            }
        }
    }
}

こんな感じでしょうか?
lenghtってlength?

天和

Re:構造体

#9

投稿記事 by 天和 » 15年前

>nonさん >たかぎさん 
いつもありがとうございます。
早速ソース解読をさせていただきます。
>exampleさん
>lenghtってlength?
はいそうです。
すいませんうち間違い多くて。
またソース全文書いていただきありがとうございます

Naohiro19

Re:構造体

#10

投稿記事 by Naohiro19 » 15年前

Lua言語では以下のようなプログラムになります。
--wordは単語
data = {
        {word = "this"},
        {word = "is"},
        {word = "an"},
        {word = "advanced"},
        {word = "programming"},
        {word = "class"}
}

-- 比較
function comp(a, b)
    if( a.word < b.word) then
        return 1
    end
end

-- ソート
table.sort(data,comp)

--表示
for idx = 1, table.getn(data) do
        out = string.format("%s %d",data[idx].word, #data[idx].word)
        print(out)
end

天和

Re:構造体

#11

投稿記事 by 天和 » 15年前

ありがとうございましたー
無事終了することができました

閉鎖

“C言語何でも質問掲示板” へ戻る