構造体について分かりません
構造体について分かりません
C言語の課題がわからない問題があったので、教えてください。
『氏,名,電話番号からなる番号簿をつくれ.さらに番号簿の任意の項目(例えば,氏)を入力すると該当するすべての人物のデータが表示されるようにせよ.なお,個人データは,構造体配列で持つこと.』という課題が出たのですが全く分かりません。解答を教えてください。
『氏,名,電話番号からなる番号簿をつくれ.さらに番号簿の任意の項目(例えば,氏)を入力すると該当するすべての人物のデータが表示されるようにせよ.なお,個人データは,構造体配列で持つこと.』という課題が出たのですが全く分かりません。解答を教えてください。
Re:構造体について分かりません
環境と貴方が理解している段階がわからないのでまずはそれを記載して下さい。
構造体と配列は理解できるでしょうか?
構造体とは複数の変数をパッケージ化したものです。
配列とは同じ様な変数の型を連番で扱うことです。
typedef struct{
char name1[8]; // 配列のサイズは適当です
char name2[8];
char phone[16];
}NAME;
NAME name[生徒数];
このように宣言すれば値を格納する構造体ができます。
name[0].name1のようにすればアクセスすることが出来ます。
これらを使えば解決できるかと思います。
構造体と配列は理解できるでしょうか?
構造体とは複数の変数をパッケージ化したものです。
配列とは同じ様な変数の型を連番で扱うことです。
typedef struct{
char name1[8]; // 配列のサイズは適当です
char name2[8];
char phone[16];
}NAME;
NAME name[生徒数];
このように宣言すれば値を格納する構造体ができます。
name[0].name1のようにすればアクセスすることが出来ます。
これらを使えば解決できるかと思います。
Re:構造体について分かりません
#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)が入力されると、該当するすべての人物の
データが表示されるようにするところがわかりません。
#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:構造体について分かりません
> までは分かりますが、ここから任意の項目(例:Yamada)が入力されると、該当するすべての人物の
> データが表示されるようにするところがわかりません。
一度に全部作ろうとせず、まずはこの5人分のデータを全て表示するプログラムを作りましょう。
それが難しければ、一人目のデータを全て表示するプログラムを。
> データが表示されるようにするところがわかりません。
一度に全部作ろうとせず、まずはこの5人分のデータを全て表示するプログラムを作りましょう。
それが難しければ、一人目のデータを全て表示するプログラムを。
Re:構造体について分かりません
試していないので何とも言えないですが下記の様にしていけないでしょうか?
また変数の型に問題点が御座います。
NOを保存する型がないですよね?
又、int型なのに0から始まってしまっております。
デバックに通りましたか?
また変数の型に問題点が御座います。
NOを保存する型がないですよね?
又、int型なのに0から始まってしまっております。
デバックに通りましたか?
for(int i=0; i<PERSON_NUM; i++){ if( p.si == "入力された文字列"){ printf("%s",p.si); } }
Re:構造体について分かりません
質問とは関係なくて恐縮ですがCでは0で始まる数字は8進数になります
010は10進数で8です
電話番号もchar配列のほうがいいと思いますよ
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配列のほうがいいと思いますよ
Re:構造体について分かりません
#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」と入力すると、「セグメンテーション違反です」と出るのですが、なぜでしょう?
#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」と入力すると、「セグメンテーション違反です」と出るのですが、なぜでしょう?
Re:構造体について分かりません
char numberが理解できないのですが文字列の扱い方はわかりますか?
Noを格納するならint型にし%sを%dにして下さい。
基本が載っているサイトを一度見直してきてはいかがでしょうか?
Noを格納するならint型にし%sを%dにして下さい。
基本が載っているサイトを一度見直してきてはいかがでしょうか?
Re:構造体について分かりません
>紅葉さん
>char numberが理解できないのですが文字列の扱い方はわかりますか?
>Noを格納するならint型にし%sを%dにして下さい。
いやいや、これはtoyoさんの投稿にある、
>ではたまたま0で始まる数値に8以上の数がないのでエラーになりませんが078とかいう数値を使うとエラーになると思います
>電話番号もchar配列のほうがいいと思いますよ
の指摘を受けてchar型に変えたものと思います。
今回は0で始まる数値に8以上の数値が含まれていないためたまたまうまくいきますが、
int型にしてしまうと09012345678のような電話番号はエラーになってしまいます。
#紅葉さんも是非基本が載っているサイトを一度見直すことをお勧めします。
>char numberが理解できないのですが文字列の扱い方はわかりますか?
>Noを格納するならint型にし%sを%dにして下さい。
いやいや、これはtoyoさんの投稿にある、
>ではたまたま0で始まる数値に8以上の数がないのでエラーになりませんが078とかいう数値を使うとエラーになると思います
>電話番号もchar配列のほうがいいと思いますよ
の指摘を受けてchar型に変えたものと思います。
今回は0で始まる数値に8以上の数値が含まれていないためたまたまうまくいきますが、
int型にしてしまうと09012345678のような電話番号はエラーになってしまいます。
#紅葉さんも是非基本が載っているサイトを一度見直すことをお勧めします。
Re:構造体について分かりません
すみません。
他の方の回答をあまり読んでいませんでした。
投稿されたソースでは1~の連番だったのでてっきり0は入らないのかと・・・。
0から始めると皆様が言っている通り進数が変わってしまったりするので
電話番号をchar型にした方がよいと初めに書いたのは私なのですが・・・。
それでも見直してくる必要があるでしょうか?
他の方の回答をあまり読んでいませんでした。
投稿されたソースでは1~の連番だったのでてっきり0は入らないのかと・・・。
0から始めると皆様が言っている通り進数が変わってしまったりするので
電話番号をchar型にした方がよいと初めに書いたのは私なのですが・・・。
それでも見直してくる必要があるでしょうか?
画像のフェードについて
http://dixq.net/g/38.html
↑のページを参考にして、これを応用して画像を
黒→元画像
という風にフェードしながら表示できましたが、
白→元画像
という風に表示する事はできないでしょうか?
↑のページを参考にして、これを応用して画像を
黒→元画像
という風にフェードしながら表示できましたが、
白→元画像
という風に表示する事はできないでしょうか?
Re:画像のフェードについて
SetDrawBrightでは元の画像より明るくすることはできないので、
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
DrawGraph(なにがし);
SetDrawBlendMode(DX_BLENDMODE_ALPHA,c);
DrawBox(0,0,640,480,GetColor(255,255,255),true);
とするのが良いと思います。
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
DrawGraph(なにがし);
SetDrawBlendMode(DX_BLENDMODE_ALPHA,c);
DrawBox(0,0,640,480,GetColor(255,255,255),true);
とするのが良いと思います。
Re:画像のフェードについて
返信ありがとうございます
おかげでやりたいことは出来るようになりましたが・・・
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() ;
}
の処理の後、画面が真っ暗になってしまうのですが、どこかプログラムはおかしいでしょうか?
おかげでやりたいことは出来るようになりましたが・・・
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() ;
}
の処理の後、画面が真っ暗になってしまうのですが、どこかプログラムはおかしいでしょうか?
Re:画像のフェードについて
ソースを見る限り問題はないので、ループの外で画面を真っ暗にしているのではないでしょうか?
ついでですが、LoadGraphScreenは毎回ディスクから読み込むので、ループの中で使用すると遅くなります。ループの前にLoadGraphしてループの中でDrawGraphするのが良いです。
ついでですが、LoadGraphScreenは毎回ディスクから読み込むので、ループの中で使用すると遅くなります。ループの前にLoadGraphしてループの中でDrawGraphするのが良いです。
Re:画像のフェードについて
ループの中では必ずやるべき3大処理はきちんとやった方がいいですよ。
・画面の内容を消す
・メッセージ処理をする
・裏画面を反映する
書き方は上記リンク先の通りです。
・画面の内容を消す
・メッセージ処理をする
・裏画面を反映する
書き方は上記リンク先の通りです。
Re:画像のフェードについて
管理人さんの書き込みを意識するとこう言うことですかね・・・?
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に変えただけですが・・・
なのでこの処理の後画面が真っ暗になります
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に変えただけですが・・・
なのでこの処理の後画面が真っ暗になります
Re:画像のフェードについて
#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(); }
Re:画像のフェードについて
ruさんの回答を最近よく見かけますが、質問者さんに対して
もうちょっと"言葉"を書いて説明してあげたほうがいいですよ。
少しだけ私は不愉快に思いましたので。
説明の仕方が苦手だからという理由ならば何も言うことないですが。
もうちょっと"言葉"を書いて説明してあげたほうがいいですよ。
少しだけ私は不愉快に思いましたので。
説明の仕方が苦手だからという理由ならば何も言うことないですが。
Re:画像のフェードについて
<ruさんの回答を最近よく見かけますが、質問者さんに対して
<もうちょっと"言葉"を書いて説明してあげたほうがいいですよ。
<少しだけ私は不愉快に思いましたので。
<説明の仕方が苦手だからという理由ならば何も言うことないですが。
そう思うなら補足レスしたら良いんじゃないでしょうか。
手間と時間をかけている回答者さんにROM専の人間がどうこう言うのもおかしな話だとROM専になった人間が言ってみます。
質問に関しては他の方もおっしゃってますが、フェード処理の外で何をしてるかですね。
問題が起こる部分だけを抜粋したWinMain関数の中を記述すると問題点が分かると思います。
<もうちょっと"言葉"を書いて説明してあげたほうがいいですよ。
<少しだけ私は不愉快に思いましたので。
<説明の仕方が苦手だからという理由ならば何も言うことないですが。
そう思うなら補足レスしたら良いんじゃないでしょうか。
手間と時間をかけている回答者さんにROM専の人間がどうこう言うのもおかしな話だとROM専になった人間が言ってみます。
質問に関しては他の方もおっしゃってますが、フェード処理の外で何をしてるかですね。
問題が起こる部分だけを抜粋したWinMain関数の中を記述すると問題点が分かると思います。
Re:画像のフェードについて
たくさんの方、返信ありがとうございました!!
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
と、ループの後に
SetDrawScreen( DX_SCREEN_FRONT ) ;が無かったことからエラーが出ていたようです・・・
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
と、ループの後に
SetDrawScreen( DX_SCREEN_FRONT ) ;が無かったことからエラーが出ていたようです・・・

Re:構造体について分かりません
> すみません。
> 他の方の回答をあまり読んでいませんでした。
> 投稿されたソースでは1~の連番だったのでてっきり0は入らないのかと・・・。
> 0から始めると皆様が言っている通り進数が変わってしまったりするので
> 電話番号をchar型にした方がよいと初めに書いたのは私なのですが・・・。
これは失礼いたしました。
最初の構造体宣言で一度char型にて定義されていましたね。
しかし電話番号をchar型にしたほうがよいと仰るのであれば、
なぜ
>Noを格納するならint型にし%sを%dにして下さい。
のような助言が出るのか不思議でなりません。
最初の時点ではchar型(文字列)での保持を書かれていたのに、
次の投稿ではint型を使うことを奨励してしまっているわけですから。
誤読をしてしまった私も悪いのですが、最初はchar型を推奨し、文字列の扱いが誤っていた際に
charの配列を使うよう助言をせずint型を奨励した意図が分かりません。
態度が一貫していないと思うのですが・・・
それでなお「最初にchar型と書いたのは自分だ」と言われると説得力がないと思います。
> 他の方の回答をあまり読んでいませんでした。
> 投稿されたソースでは1~の連番だったのでてっきり0は入らないのかと・・・。
> 0から始めると皆様が言っている通り進数が変わってしまったりするので
> 電話番号をchar型にした方がよいと初めに書いたのは私なのですが・・・。
これは失礼いたしました。
最初の構造体宣言で一度char型にて定義されていましたね。
しかし電話番号をchar型にしたほうがよいと仰るのであれば、
なぜ
>Noを格納するならint型にし%sを%dにして下さい。
のような助言が出るのか不思議でなりません。
最初の時点ではchar型(文字列)での保持を書かれていたのに、
次の投稿ではint型を使うことを奨励してしまっているわけですから。
誤読をしてしまった私も悪いのですが、最初はchar型を推奨し、文字列の扱いが誤っていた際に
charの配列を使うよう助言をせずint型を奨励した意図が分かりません。
態度が一貫していないと思うのですが・・・
それでなお「最初にchar型と書いたのは自分だ」と言われると説得力がないと思います。