構造体について分かりません

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

構造体について分かりません

#1

投稿記事 by Ten » 15年前

C言語の課題がわからない問題があったので、教えてください。

『氏,名,電話番号からなる番号簿をつくれ.さらに番号簿の任意の項目(例えば,氏)を入力すると該当するすべての人物のデータが表示されるようにせよ.なお,個人データは,構造体配列で持つこと.』という課題が出たのですが全く分かりません。解答を教えてください。

紅葉

Re:構造体について分かりません

#2

投稿記事 by 紅葉 » 15年前

環境と貴方が理解している段階がわからないのでまずはそれを記載して下さい。

構造体と配列は理解できるでしょうか?
構造体とは複数の変数をパッケージ化したものです。
配列とは同じ様な変数の型を連番で扱うことです。

typedef struct{
char name1[8]; // 配列のサイズは適当です
char name2[8];
char phone[16];
}NAME;

NAME name[生徒数];

このように宣言すれば値を格納する構造体ができます。
name[0].name1のようにすればアクセスすることが出来ます。
これらを使えば解決できるかと思います。

Ten

Re:構造体について分かりません

#3

投稿記事 by Ten » 15年前

#include <stdio.h>

#define PERSON_NUM 5

typedef struct {
char si[20];
char mei[20];
int tel;
} person_t;

main()
{
person_t p[PERSON_NUM] = {{1,"Yamada","Tarou",0766566161},
{2,"Tanaka","Asuka",0546734565},
{3,"Suzuki","Ken",0715242523},
{4,"Yamashita","Rei",4267845225},
{5,"Kinoshita","Shinji",5127325352}};


までは分かりますが、ここから任意の項目(例:Yamada)が入力されると、該当するすべての人物の
データが表示されるようにするところがわかりません。

たいちう

Re:構造体について分かりません

#4

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

> までは分かりますが、ここから任意の項目(例:Yamada)が入力されると、該当するすべての人物の
> データが表示されるようにするところがわかりません。

一度に全部作ろうとせず、まずはこの5人分のデータを全て表示するプログラムを作りましょう。
それが難しければ、一人目のデータを全て表示するプログラムを。

紅葉

Re:構造体について分かりません

#5

投稿記事 by 紅葉 » 15年前

試していないので何とも言えないですが下記の様にしていけないでしょうか?
また変数の型に問題点が御座います。
NOを保存する型がないですよね?
又、int型なのに0から始まってしまっております。
デバックに通りましたか?
for(int i=0; i<PERSON_NUM; i++){
    if( p.si == "入力された文字列"){
        printf("%s",p.si);
    }
}

toyo

Re:構造体について分かりません

#6

投稿記事 by toyo » 15年前

質問とは関係なくて恐縮ですがCでは0で始まる数字は8進数になります
010は10進数で8です
person_t p[PERSON_NUM] = {{1,"Yamada","Tarou",0766566161},
                              {2,"Tanaka","Asuka",0546734565},
                              {3,"Suzuki","Ken",0715242523},
                              {4,"Yamashita","Rei",4267845225},
                              {5,"Kinoshita","Shinji",5127325352}};
ではたまたま0で始まる数値に8以上の数がないのでエラーになりませんが078とかいう数値を使うとエラーになると思います
電話番号もchar配列のほうがいいと思いますよ

Ten

Re:構造体について分かりません

#7

投稿記事 by Ten » 15年前

#include <stdio.h>

#define PERSON_NUM 5

typedef struct {
char number;
char si[20];
char mei[20];
} person_t;

int main(void)
{
int i;
char a[20];
person_t p[PERSON_NUM] = {{1,"Yamada","Asuka"},
{2,"Tanaka","Tarou"},
{3,"Suzuki","Ken"},
{4,"Yamashita","Rei"},
{5,"Kinoshita","Shinji"}};


printf(":"); scanf("%s",a);
for(i=0;i<PERSON_NUM;i++){
if (strcmp(p.si,a)==0){
printf("%s\n",p.number);
printf("%s\n",p.si);
printf("%s\n",p.mei);
}
}
return(0);}


このようなプログラムを作ったのですが、「Yamada」と入力すると、「セグメンテーション違反です」と出るのですが、なぜでしょう?

ideyan

Re:構造体について分かりません

#8

投稿記事 by ideyan » 15年前

p.numberは配列じゃないのに%sを使っているからでは?

紅葉

Re:構造体について分かりません

#9

投稿記事 by 紅葉 » 15年前

char numberが理解できないのですが文字列の扱い方はわかりますか?
Noを格納するならint型にし%sを%dにして下さい。
基本が載っているサイトを一度見直してきてはいかがでしょうか?

asd

Re:構造体について分かりません

#10

投稿記事 by asd » 15年前

>紅葉さん
>char numberが理解できないのですが文字列の扱い方はわかりますか?
>Noを格納するならint型にし%sを%dにして下さい。

いやいや、これはtoyoさんの投稿にある、

>ではたまたま0で始まる数値に8以上の数がないのでエラーになりませんが078とかいう数値を使うとエラーになると思います
>電話番号もchar配列のほうがいいと思いますよ

の指摘を受けてchar型に変えたものと思います。
今回は0で始まる数値に8以上の数値が含まれていないためたまたまうまくいきますが、
int型にしてしまうと09012345678のような電話番号はエラーになってしまいます。

#紅葉さんも是非基本が載っているサイトを一度見直すことをお勧めします。

紅葉

Re:構造体について分かりません

#11

投稿記事 by 紅葉 » 15年前

すみません。
他の方の回答をあまり読んでいませんでした。
投稿されたソースでは1~の連番だったのでてっきり0は入らないのかと・・・。
0から始めると皆様が言っている通り進数が変わってしまったりするので
電話番号をchar型にした方がよいと初めに書いたのは私なのですが・・・。

それでも見直してくる必要があるでしょうか?

深黒

画像のフェードについて

#12

投稿記事 by 深黒 » 15年前

http://dixq.net/g/38.html
↑のページを参考にして、これを応用して画像を

黒→元画像
という風にフェードしながら表示できましたが、
白→元画像
という風に表示する事はできないでしょうか?

ookami

Re:画像のフェードについて

#13

投稿記事 by ookami » 15年前

SetDrawBrightでは元の画像より明るくすることはできないので、

SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
DrawGraph(なにがし);
SetDrawBlendMode(DX_BLENDMODE_ALPHA,c);
DrawBox(0,0,640,480,GetColor(255,255,255),true);

とするのが良いと思います。

深黒

Re:画像のフェードについて

#14

投稿記事 by 深黒 » 15年前

返信ありがとうございます
おかげでやりたいことは出来るようになりましたが・・・

i=255;
while(i>0){
i--;
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
LoadGraphScreen(300,300, "使ってる画像" , TRUE );
SetDrawBlendMode(DX_BLENDMODE_ALPHA,i);
DrawBox(300,300,410,436,GetColor(255,255,255),true);
ScreenFlip() ;
}
の処理の後、画面が真っ暗になってしまうのですが、どこかプログラムはおかしいでしょうか?

ookami

Re:画像のフェードについて

#15

投稿記事 by ookami » 15年前

ソースを見る限り問題はないので、ループの外で画面を真っ暗にしているのではないでしょうか?

ついでですが、LoadGraphScreenは毎回ディスクから読み込むので、ループの中で使用すると遅くなります。ループの前にLoadGraphしてループの中でDrawGraphするのが良いです。

Dixq (管理人)

Re:画像のフェードについて

#16

投稿記事 by Dixq (管理人) » 15年前

ループの中では必ずやるべき3大処理はきちんとやった方がいいですよ。

・画面の内容を消す
・メッセージ処理をする
・裏画面を反映する

書き方は上記リンク先の通りです。

深黒

Re:画像のフェードについて

#17

投稿記事 by 深黒 » 15年前

うーん、分からないです・・・
この画像のフェードの処理後、それ以降の動作をしなくなるようです・・・

深黒

Re:画像のフェードについて

#18

投稿記事 by 深黒 » 15年前

管理人さんの書き込みを意識するとこう言うことですかね・・・?

for(i=255;i>=0;i--){
ClearDrawScreen();
SetDrawScreen( DX_SCREEN_BACK ) ;
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
DrawGraph(300,300, 画像 , TRUE );
SetDrawBlendMode(DX_BLENDMODE_ALPHA,i);
DrawBox(300,300,410,436,GetColor(255,255,255),true);
ScreenFlip() ;
}
whileをfor文にして、ClearDrawScreen();を足して、DrawGraphに変えただけですが・・・
なのでこの処理の後画面が真っ暗になります

ru

Re:画像のフェードについて

#19

投稿記事 by ru » 15年前

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    ChangeWindowMode(TRUE);
    DxLib_Init();
    SetDrawScreen(DX_SCREEN_BACK);

    int cnt = 0;
    int GrHandle = LoadGraph("test.png");

    while(1)
    {
        // メッセージを処理する
        if(ProcessMessage() == -1 )
        {
            break;
        }
        if(CheckHitKey(KEY_INPUT_ESCAPE))
        {
            break;
        }
        // 画面の内容を消す
        ClearDrawScreen();

        DrawGraph(300, 300, GrHandle, FALSE);
        SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255 - cnt % 255);
        DrawBox(300, 300, 410, 436, GetColor(255, 255, 255), TRUE);
        SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

        cnt++;

        // 裏画面を反映する
        ScreenFlip();
    }

    DxLib_End();
}

a

Re:画像のフェードについて

#20

投稿記事 by a » 15年前

ruさんの回答を最近よく見かけますが、質問者さんに対して
もうちょっと"言葉"を書いて説明してあげたほうがいいですよ。
少しだけ私は不愉快に思いましたので。
説明の仕方が苦手だからという理由ならば何も言うことないですが。

ookami

Re:画像のフェードについて

#21

投稿記事 by ookami » 15年前

ループを抜けた後
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
とするとどうでしょうか?

ねこ

Re:画像のフェードについて

#22

投稿記事 by ねこ » 15年前

<ruさんの回答を最近よく見かけますが、質問者さんに対して
<もうちょっと"言葉"を書いて説明してあげたほうがいいですよ。
<少しだけ私は不愉快に思いましたので。
<説明の仕方が苦手だからという理由ならば何も言うことないですが。
そう思うなら補足レスしたら良いんじゃないでしょうか。
手間と時間をかけている回答者さんにROM専の人間がどうこう言うのもおかしな話だとROM専になった人間が言ってみます。


質問に関しては他の方もおっしゃってますが、フェード処理の外で何をしてるかですね。
問題が起こる部分だけを抜粋したWinMain関数の中を記述すると問題点が分かると思います。

深黒

Re:画像のフェードについて

#23

投稿記事 by 深黒 » 15年前

たくさんの方、返信ありがとうございました!!
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
と、ループの後に
SetDrawScreen( DX_SCREEN_FRONT ) ;が無かったことからエラーが出ていたようです・・・ 画像

asd

Re:構造体について分かりません

#24

投稿記事 by asd » 15年前

> すみません。
> 他の方の回答をあまり読んでいませんでした。
> 投稿されたソースでは1~の連番だったのでてっきり0は入らないのかと・・・。
> 0から始めると皆様が言っている通り進数が変わってしまったりするので
> 電話番号をchar型にした方がよいと初めに書いたのは私なのですが・・・。

これは失礼いたしました。
最初の構造体宣言で一度char型にて定義されていましたね。

しかし電話番号をchar型にしたほうがよいと仰るのであれば、
なぜ

>Noを格納するならint型にし%sを%dにして下さい。

のような助言が出るのか不思議でなりません。
最初の時点ではchar型(文字列)での保持を書かれていたのに、
次の投稿ではint型を使うことを奨励してしまっているわけですから。

誤読をしてしまった私も悪いのですが、最初はchar型を推奨し、文字列の扱いが誤っていた際に
charの配列を使うよう助言をせずint型を奨励した意図が分かりません。
態度が一貫していないと思うのですが・・・
それでなお「最初にchar型と書いたのは自分だ」と言われると説得力がないと思います。

閉鎖

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