/* program91.c */
#define _CRT_SECURE_NO_WARNINGS
#define NO 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n;
char point[8], name[32];
struct _seiseki{
char szName[32];
int kokugo;
int rika;
} seiseki[NO];
for (n = 0; n < NO; n++) {
printf("%d番の氏名 -- ", n + 1);
gets(seiseki[n].szName);
printf("国語の点数 -- ");
gets(point);
seiseki[n].kokugo = atoi(point);
printf("理科の点数 -- ");
gets(point);
seiseki[n].rika = atoi(point);
}
while (1) {
printf("検索する氏名(Enterキーのみで終了) --- ");
gets(name);
if (strcmp(name, "") == 0)
break;
for (n = 0; n < NO; n++) {
if (strstr(seiseki[n].szName, name))
printf("%s 国語 %d点, 理科 %d点\n",
seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
}
}
return 0;
}
C言語 構造体について
C言語 構造体について
C言語 構造体について
最近C言語の学習を独学で始めたのですが、参考書にてわからない点があるので、質問させてください。
猫でもわかるC言語を参考書に学習を進めているのですがP246問1、要約すると5人の氏名、国語、理科の点数を格納する構造体を作り氏名の一部を入力すると点数を表示するプログラムを作れとのことなのですが、最後に何故for文を使う必要があるのか理解できません。また最後にfor文を入れないと正しい点数が入力されないのはなぜでしょうか?
詳しい方、ご教授をよろしくお願い致します。
*ソースコードはテキストについている模範解答になります。
最後のfor文とはif(strstrの一行上のfor分になります。
猫でもわかるC言語を参考書に学習を進めているのですがP246問1、要約すると5人の氏名、国語、理科の点数を格納する構造体を作り氏名の一部を入力すると点数を表示するプログラムを作れとのことなのですが、最後に何故for文を使う必要があるのか理解できません。また最後にfor文を入れないと正しい点数が入力されないのはなぜでしょうか?
詳しい方、ご教授をよろしくお願い致します。
*ソースコードはテキストについている模範解答になります。
最後のfor文とはif(strstrの一行上のfor分になります。
Re: C言語 構造体について
プログラムをVS2017Community C言語でコンパイル・実行してみましたが なんの疑問点もなく正常ですよ。
ソースコードにコメント文で 疑問点を直に書き入れてください。
この文面は理解不可能ですよ。
ソースコードにコメント文で 疑問点を直に書き入れてください。
この文面は理解不可能ですよ。
Re: C言語 構造体について
問題を読んでいないのでもしかしたら「for文を使う」という指定があるのかもしれないですが、
そうでなければ別にfor文を使う必要は無いですね。
なぜなら、for文 は、(Dにcontinue;を含まなければ) while文 と等価なので、代わりにwhile文を使えばいいからです。
そうでなければ別にfor文を使う必要は無いですね。
なぜなら、for文 は、(Dにcontinue;を含まなければ) while文 と等価なので、代わりにwhile文を使えばいいからです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語 構造体について
これは、入力された複数のデータから、目的のデータを検索する、というプログラムの演習でしょ。
今回は、5 件しかないから、コンピュータに入力してやるより、入力して人間が見て探した方がはやいけれども、
現実の問題の場合は、例えば、大学入試センター試験とかだと、約 60 万人分、処理しなきゃならない
わけですよ。今回の課題だと、固定の配列に入れて、線形検索(「最後の for 文とは if(strstr の一行上の for 文」の
あたり)ですが、60 万人分だとハッシュ使いますかね。
線形検索やハッシュ以外にも、二分木とか、あるわけですよ。で、https://ja.wikipedia.org/wiki/Standard_Template_Library STL 使うと、
アルゴリズム(「線形検索」や「ハッシュ」、「二分木」のこと)が簡単に切り替えられるんです。プログラミング道は、険(けわ)しいです。
なぜ、線形検索で、しかも、STL 使わずに実装させるかといえば、
線形検索が、人間にとって、一番わかりやすいからです。
いまのところ、何を言っているのかわからない、かもしれませんが、プログラミングを続けていると、
必ず、やることになりますので、大雑把(おおざっぱ)でもいいですから、頭の隅に入れておいてください。
今回は、5 件しかないから、コンピュータに入力してやるより、入力して人間が見て探した方がはやいけれども、
現実の問題の場合は、例えば、大学入試センター試験とかだと、約 60 万人分、処理しなきゃならない
わけですよ。今回の課題だと、固定の配列に入れて、線形検索(「最後の for 文とは if(strstr の一行上の for 文」の
あたり)ですが、60 万人分だとハッシュ使いますかね。
線形検索やハッシュ以外にも、二分木とか、あるわけですよ。で、https://ja.wikipedia.org/wiki/Standard_Template_Library STL 使うと、
アルゴリズム(「線形検索」や「ハッシュ」、「二分木」のこと)が簡単に切り替えられるんです。プログラミング道は、険(けわ)しいです。
なぜ、線形検索で、しかも、STL 使わずに実装させるかといえば、
線形検索が、人間にとって、一番わかりやすいからです。
いまのところ、何を言っているのかわからない、かもしれませんが、プログラミングを続けていると、
必ず、やることになりますので、大雑把(おおざっぱ)でもいいですから、頭の隅に入れておいてください。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: C言語 構造体について
/* program91.c */
#define _CRT_SECURE_NO_WARNINGS
#define NO 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n;
char point[8], name[32];
struct _seiseki{
char szName[32];
int kokugo;
int rika;
} seiseki[NO];
for (n = 0; n < NO; n++) {
printf("%d番の氏名 -- ", n + 1);
gets(seiseki[n].szName);
printf("国語の点数 -- ");
gets(point);
seiseki[n].kokugo = atoi(point);
printf("理科の点数 -- ");
gets(point);
seiseki[n].rika = atoi(point);
}
while (1) {
printf("検索する氏名(Enterキーのみで終了) --- ");
gets(name);
if (strcmp(name, "") == 0)
break;
for (n = 0; n < NO; n++) { /*この部分のforが何に使われているかわかりません。*/
if (strstr(seiseki[n].szName, name))
printf("%s 国語 %d点, 理科 %d点\n",
seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
}
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#define NO 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n;
char point[8], name[32];
struct _seiseki{
char szName[32];
int kokugo;
int rika;
} seiseki[NO];
for (n = 0; n < NO; n++) {
printf("%d番の氏名 -- ", n + 1);
gets(seiseki[n].szName);
printf("国語の点数 -- ");
gets(point);
seiseki[n].kokugo = atoi(point);
printf("理科の点数 -- ");
gets(point);
seiseki[n].rika = atoi(point);
}
while (1) {
printf("検索する氏名(Enterキーのみで終了) --- ");
gets(name);
if (strcmp(name, "") == 0)
break;
for (n = 0; n < NO; n++) { /*この部分のforが何に使われているかわかりません。*/
if (strstr(seiseki[n].szName, name))
printf("%s 国語 %d点, 理科 %d点\n",
seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
}
}
return 0;
}
Re: C言語 構造体について
3人ともご丁寧にお答え頂きありがとうございます。
ソース文にコメントを載せたほうがわかりやすいですよね。また、これは模範解答になりますのでfor文を使いなさいと言ったような指示はありません。私自身が模範解答を見てわからないところを質問しているしだいです。
また、最後のfor文は要は目的の数値を見つけやすいとの事でしたが、このfor文を入れないと実際の点数ではなく、無茶苦茶な数値が入るのはなぜでしょうか?
for文を入れる事によって目的の数値を探しているから、この文を入れないと探せないと言うことでしょうか?
ソース文にコメントを載せたほうがわかりやすいですよね。また、これは模範解答になりますのでfor文を使いなさいと言ったような指示はありません。私自身が模範解答を見てわからないところを質問しているしだいです。
また、最後のfor文は要は目的の数値を見つけやすいとの事でしたが、このfor文を入れないと実際の点数ではなく、無茶苦茶な数値が入るのはなぜでしょうか?
for文を入れる事によって目的の数値を探しているから、この文を入れないと探せないと言うことでしょうか?
Re: C言語 構造体について
ウール さんが書きました: ↑5年前/* program91.c */ #define _CRT_SECURE_NO_WARNINGS #define NO 5 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int n; char point[8], name[32]; struct _seiseki{ char szName[32]; int kokugo; int rika; } seiseki[NO]; for (n = 0; n < NO; n++) { printf("%d番の氏名 -- ", n + 1); gets(seiseki[n].szName); printf("国語の点数 -- "); gets(point); seiseki[n].kokugo = atoi(point); printf("理科の点数 -- "); gets(point); seiseki[n].rika = atoi(point); } while (1) { printf("検索する氏名(Enterキーのみで終了) --- "); gets(name); if (strcmp(name, "") == 0) break; for (n = 0; n < NO; n++) { /*この部分のforが何に使われているかわかりません。*/ if (strstr(seiseki[n].szName, name)) printf("%s 国語 %d点, 理科 %d点\n", seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika); } } return 0; }
Re: C言語 構造体について
> 氏名の一部を入力すると点数を表示する
つまり,「入力された氏名の一部に対して,どのデータを表示すべきか?」を判断する必要がある.
データは5つあるから,
・最初のデータは表示すべきか?
・2番目のデータは表示すべきか?
・…
・5番目のデータは表示すべきか?
の判断を行わねばならない.
言い換えれば,
5つのデータ全てに関して,入力と照らし合わせて,そのデータを表示すべきか否かの判定処理を行う必要がある.
「5つのデータ全てに関してXXXする」というのを実装する手段として,そのコードでは(たまたま)forを用いた,というだけのことでしょう.
例えば,要素数5の配列 a[5] の全ての要素をprintfで出力したいとき,forを使って とか書けますよね.それと一緒でしょう.
(これに対して「何でforを使ったの?」と問われても,「まぁ…これが楽な方法だったから……?」という答えになるかなぁ)
つまり,「入力された氏名の一部に対して,どのデータを表示すべきか?」を判断する必要がある.
データは5つあるから,
・最初のデータは表示すべきか?
・2番目のデータは表示すべきか?
・…
・5番目のデータは表示すべきか?
の判断を行わねばならない.
言い換えれば,
5つのデータ全てに関して,入力と照らし合わせて,そのデータを表示すべきか否かの判定処理を行う必要がある.
「5つのデータ全てに関してXXXする」というのを実装する手段として,そのコードでは(たまたま)forを用いた,というだけのことでしょう.
例えば,要素数5の配列 a[5] の全ての要素をprintfで出力したいとき,forを使って とか書けますよね.それと一緒でしょう.
(これに対して「何でforを使ったの?」と問われても,「まぁ…これが楽な方法だったから……?」という答えになるかなぁ)
Re: C言語 構造体について
これ以上補足不要だとは思うけど,
わからんと言われているforの箇所を日本語で書けば,下のような話でしょう.
べつにforを使わずに,他の方がおっしゃるようにwhileとか使っても実装できるでしょうし,
極端な話(?),データ数が5個だと決め打ちするならば
とか書いてもまぁ目的は達成できる.
(前者の(for使う)書き方と,後者の書き方を比較して「どっちで書きたいか?」みたいな世界の話になるのかな?)
わからんと言われているforの箇所を日本語で書けば,下のような話でしょう.
//5つのデータ全てに関して,それを表示すべきか否かを調べ,表示すべきなら表示する
for( int i=0; i<5; ++i ) //5つのデータに関してループ
{
if( i番目のデータは表示すべきか? )
{
i番目のデータを表示する
}
}
極端な話(?),データ数が5個だと決め打ちするならば
//5つのデータ全てに関して,それを表示すべきか否かを調べ,表示すべきなら表示する
if( 1番目のデータを表示すべきか? ){ 1番目のデータを表示する }
if( 2番目のデータを表示すべきか? ){ 2番目のデータを表示する }
if( 3番目のデータを表示すべきか? ){ 3番目のデータを表示する }
if( 4番目のデータを表示すべきか? ){ 4番目のデータを表示する }
if( 5番目のデータを表示すべきか? ){ 5番目のデータを表示する }
(前者の(for使う)書き方と,後者の書き方を比較して「どっちで書きたいか?」みたいな世界の話になるのかな?)
Re: C言語 構造体について
質問者様の質問は 2点あり1点にしか答えてないうえ全て間違っています。(^^;
質問その1::#2に書いてあるのでは >何故for文を使う必要があるのか理解できません。
質問その2::#2に書いてあるのでは >また最後にfor文を入れないと正しい点数が入力されないのはなぜでしょうか
::#7では >また、最後のfor文は要は目的の数値を見つけやすいとの事でしたが、このfor文を入れないと実際の点数ではなく、無茶苦茶な数値が入るのはなぜでしょうか?
質問その1については配列 演算と間違えても正常動作するようにC言語を作ってあるのですが本当は全然違うものです。
質問その2: については質問者様にその症状になるソースコードを提示して頂きたくお願い致します。検討することができないので。
まあ C言語らしく書くとこうなるとおもいますね。
質問その1::#2に書いてあるのでは >何故for文を使う必要があるのか理解できません。
質問その2::#2に書いてあるのでは >また最後にfor文を入れないと正しい点数が入力されないのはなぜでしょうか
::#7では >また、最後のfor文は要は目的の数値を見つけやすいとの事でしたが、このfor文を入れないと実際の点数ではなく、無茶苦茶な数値が入るのはなぜでしょうか?
質問その1については配列 演算と間違えても正常動作するようにC言語を作ってあるのですが本当は全然違うものです。
質問その2: については質問者様にその症状になるソースコードを提示して頂きたくお願い致します。検討することができないので。
まあ C言語らしく書くとこうなるとおもいますね。
/* program91.c */
#define _CRT_SECURE_NO_WARNINGS
#define NO 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n;
char point[8], name[32];
////////////////////////////// 構造体
typedef struct _seiseki { //
char szName[32]; // 名前 文字列
int kokugo; // 国語 点数:整数型
int rika; // 理科 点数:整数型
} seiseki_t; // seiseki_t というオブジェクト型(構造体型)を作る
//////////////////////////////
seiseki_t seiseki[NO]; // オブジェクト型(構造体型) 配列
seiseki_t* obj_p; // オブジェクト型(構造体型) ポインター
//////////////////////////////
for (n = 0; n < NO; n++) {
printf("%d番の氏名 -- ", n + 1);
gets(seiseki[n].szName);
printf("国語の点数 -- ");
gets(point);
seiseki[n].kokugo = atoi(point);
printf("理科の点数 -- ");
gets(point);
seiseki[n].rika = atoi(point);
}
while (1) {
printf("検索する氏名(Enterキーのみで終了) --- ");
gets(name);
if (strcmp(name, "") == 0)
break;
//for (n = 0; n < NO; n++) { /*この部分のforが何に使われているかわかりません。*/
//if (strstr(seiseki[n].szName, name))
//printf("%s 国語 %d点, 理科 %d点\n",
//seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
//}
obj_p = seiseki; // 配列名は先頭のアドレスを持っている
while (obj_p !=NULL) {
if (strstr(obj_p->szName, name)){
printf("%s 国語 %d点, 理科 %d点\n",
obj_p->szName, obj_p->kokugo, obj_p->rika);
break;
}
obj_p++; //-----ポインターを一個進める---------------
}
}
return 0;
}
Re: C言語 構造体について
usaoさん、Mathさんご丁寧な回答ありがとうございます。
何故for文を使わないといけないのかって質問でしたが、名前を探してくる[strstr]の関数を使っているのに、何故、for文で繰り返し処理を実行しなければいけないか、疑問でした。ですが皆さんのおかげで解決に向かいそうです。
また、ご指摘のあった、質問その2ですが下記のソースコードになります。
そのまま、上のソースコードからfor文だけを抜いた形になります。
[
何故for文を使わないといけないのかって質問でしたが、名前を探してくる[strstr]の関数を使っているのに、何故、for文で繰り返し処理を実行しなければいけないか、疑問でした。ですが皆さんのおかげで解決に向かいそうです。
また、ご指摘のあった、質問その2ですが下記のソースコードになります。
そのまま、上のソースコードからfor文だけを抜いた形になります。
[
Re: C言語 構造体について
#define _CRT_SECURE_NO_WARNINGS
#define NO 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n;
char point[8], name[32];
struct _seiseki{
char szName[32];
int kokugo;
int rika;
} seiseki[NO];
for (n = 0; n < NO; n++) {
printf("%d番の氏名 -- ", n + 1);
gets(seiseki[n].szName);
printf("国語の点数 -- ");
gets(point);
seiseki[n].kokugo = atoi(point);
printf("理科の点数 -- ");
gets(point);
seiseki[n].rika = atoi(point);
}
while (1) {
printf("検索する氏名(Enterキーのみで終了) --- ");
gets(name);
if (strcmp(name, "") == 0)
break;
//ここのfor文をなくしました
if (strstr(seiseki[n].szName, name))
printf("%s 国語 %d点, 理科 %d点\n",
seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
}
return 0;
}
Re: C言語 構造体について
予想通りでたらめな「出力」をしているのであって「入力」は関係ありません。
#define _CRT_SECURE_NO_WARNINGS
#define NO 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n;
char point[8], name[32];
struct _seiseki{
char szName[32];
int kokugo;
int rika;
} seiseki[NO];
for (n = 0; n < NO; n++) {
printf("%d番の氏名 -- ", n + 1);
gets(seiseki[n].szName);
printf("国語の点数 -- ");
gets(point);
seiseki[n].kokugo = atoi(point);
printf("理科の点数 -- ");
gets(point);
seiseki[n].rika = atoi(point);
}
//-----------この時点で n の値は 5 になっている----------------------------------------------------------
while (1) {
printf("検索する氏名(Enterキーのみで終了) --- ");
gets(name);
if (strcmp(name, "") == 0)
break;
//ここのfor文をなくしました
if (strstr(seiseki[n].szName, name)) //-----n が 5 なので
// メモリーの範囲外をアクセスし
// でたらめな値を出力する
printf("%s 国語 %d点, 理科 %d点\n",
seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
}
return 0;
}
Re: C言語 構造体について
#2 の
>点数を格納する構造体を作り氏名の一部を入力すると点数を表示するプログラムを作れとのことなのですが、最後に何故for文を使う必要があるのか理解できません
は
可笑しいと思ってました(^^;
一名の名前を入力してますよね。その人を検索しますよね。
>点数を格納する構造体を作り氏名の一部を入力すると点数を表示するプログラムを作れとのことなのですが、最後に何故for文を使う必要があるのか理解できません
は
可笑しいと思ってました(^^;
一名の名前を入力してますよね。その人を検索しますよね。
Re: C言語 構造体について
そのプログラムで、登録されていない名前を検索するとMath さんが書きました: ↑5年前まあ C言語らしく書くとこうなるとおもいますね。
不正な出力になります。
obj_p が NULL になることはありません。
また、Hirose Alice と Hisose Suzu が登録されているとき、
#1 の元のプログラムで、Hirose を検索すると、
2つの情報が表示されますが、この #11 のプログラムでは
1つしか出てきません。
Re: C言語 構造体について
>文字列の【部分一致】で検索するって話でしょ
そうですよね。
そもそもの 勘違いが構造体全体から【部分一致】で検索できる
との思い込みから きてますよね。
構造体型の宣言のところで } seiseki[NO]; と一塊にみえたのでしょうね(^^;
そうですよね。
そもそもの 勘違いが構造体全体から【部分一致】で検索できる
との思い込みから きてますよね。
構造体型の宣言のところで } seiseki[NO]; と一塊にみえたのでしょうね(^^;
Re: C言語 構造体について
>何故 for 文を使わないといけないのかって質問でしたが、名前を探してくる[strstr]の関数を使っているのに、
>何故、for文で繰り返し処理を実行しなければいけないか、疑問でした。
>ですが皆さんのおかげで解決に向かいそうです。
やっと、質問者の意図が分かりました。
B:行で strstr 関数を使ってますが、ここは、strcmp 関数を用いて
if(strcmp(seiseki[n].szName, name)==0) でないと駄目です。
http://hitorilife.com/strstr.php strstr 関数(ja)
アセンブラで書くと
となるので、strstr で一気に検索することはできません。
「一単位づつ strcmp で比較」を for で回す必要があります。
>何故、for文で繰り返し処理を実行しなければいけないか、疑問でした。
>ですが皆さんのおかげで解決に向かいそうです。
やっと、質問者の意図が分かりました。
A: for (n = 0; n > NO; n++) {
B: if (strstr(seiseki[n].szName, name))
C: printf("%s 国語 %d点, 理科 %d点\n",
D: seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
E: }
B:行で strstr 関数を使ってますが、ここは、strcmp 関数を用いて
if(strcmp(seiseki[n].szName, name)==0) でないと駄目です。
http://hitorilife.com/strstr.php strstr 関数(ja)
アセンブラで書くと
db "A-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd 100, 0
db "B-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd 90, 10
db "C-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd 80, 20
db "D-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd 70, 30
db "E-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd 60, 40
「一単位づつ strcmp で比較」を for で回す必要があります。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: C言語 構造体について
>A: for (n = 0; n > NO; n++) {
不等号の向きが、逆ですね。'<' が正しい。
不等号の向きが、逆ですね。'<' が正しい。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: C言語 構造体について
これは誤りです。
なぜなら、#2で「氏名の一部を入力すると点数を表示する」という条件があるのに、
この条件式では氏名全体を入力しないと該当する点数が表示されくなってしまうからです。
同様に、
も誤りです。
以下のようにforを二重にし、
構造体に記録した氏名のデータからマッチする可能性がある部分をstrcmpで比較していく方法もありますが、
上司や先生などからの指示、宗教上の理由、縛りプレイなどの理由が無いのであれば、
素直にstrstrを使ったほうが簡単でしょう。
for (n = 0; n < NO; n++) {
size_t name_length = strlen(name);
size_t simei_length = strlen(seiseki[n].szName);
size_t i;
int matched = 0;
for (i = 0; i + name_length <= simei_length; i++) {
char simei_part[32];
strcpy(simei_part, seiseki[n].szName + i);
simei_part[name_length] = '\0';
if (strcmp(simei_part, name) == 0) matched = 1;
}
if (matched)
printf("%s 国語 %d点, 理科 %d点\n",
seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語 構造体について
strncmp を使えばもっと簡単です。みけCAT さんが書きました: ↑5年前以下のようにforを二重にし、
構造体に記録した氏名のデータからマッチする可能性がある部分をstrcmpで比較していく方法もありますが、
上司や先生などからの指示、宗教上の理由、縛りプレイなどの理由が無いのであれば、
素直にstrstrを使ったほうが簡単でしょう。for (n = 0; n < NO; n++) { size_t name_length = strlen(name); size_t simei_length = strlen(seiseki[n].szName); size_t i; int matched = 0; for (i = 0; i + name_length <= simei_length; i++) { char simei_part[32]; strcpy(simei_part, seiseki[n].szName + i); simei_part[name_length] = '\0'; if (strcmp(simei_part, name) == 0) matched = 1; } if (matched) printf("%s 国語 %d点, 理科 %d点\n", seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika); }
size_t len = strlen(name);
for (n = 0; n < NO; n++) {
char *p = seiseki[n].szName;
for (; *p && strncmp(p, name, len); p++) ;
if (*p) {
printf("%s 国語 %d点, 理科 %d点\n",
seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
}
}
1番の氏名 -- Ishida Yuriko
国語の点数 -- 90
理科の点数 -- 80
2番の氏名 -- Hirose Alice
国語の点数 -- 70
理科の点数 -- 60
3番の氏名 -- Ayase Haruka
国語の点数 -- 50
理科の点数 -- 40
4番の氏名 -- Ishida Hikari
国語の点数 -- 30
理科の点数 -- 20
5番の氏名 -- Hirose Suzu
国語の点数 -- 10
理科の点数 -- 0
検索する氏名(Enterキーのみで終了) --- Hirose
Hirose Alice 国語 70点, 理科 60点
Hirose Suzu 国語 10点, 理科 0点
検索する氏名(Enterキーのみで終了) --- Haruka
Ayase Haruka 国語 50点, 理科 40点
検索する氏名(Enterキーのみで終了) ---
Re: C言語 構造体について
<stdio.h>(C++では<cstdio>)に宣言されている gets関数は GCC/Clang/Visual Studioの環境では
2011年の C言語の規格 C11 および C++11 では gets関数自体が削除されていますので、使うことはできません。
代わりに fgets関数か、 gets_s関数を使うべきでしょう。
2011年の C言語の規格 C11 および C++11 では gets関数自体が削除されていますので、使うことはできません。
代わりに fgets関数か、 gets_s関数を使うべきでしょう。
Re: C言語 構造体について
VS2017Community で
となるのは そいう意味だったのですね。
説明文をだしてエラーにすればいいのに(^^;
1>------ ビルド開始: プロジェクト: Project1, 構成: Debug Win32 ------
1>main.c
1>c:\19\01\c\001\project1\project1\main.c(23): warning C4013: 関数 'gets' は定義されていません。int 型の値を返す外部関数と見なします。
1>Project1.vcxproj -> C:\19\01\c\001\Project1\Debug\Project1.exe
1>プロジェクト "Project1.vcxproj" のビルドが終了しました。
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
説明文をだしてエラーにすればいいのに(^^;
Re: C言語 構造体について
strcmp って書いたのは、問題をよく読んでなかったから。
これ、学校の課題でしょ。問い一「完全一致」、問い二「部分一致」で、問い一は、わかったけど、問い二がわからない、とかじゃ、ないの ? というふうに、エスパーしてみました。
これ、学校の課題でしょ。問い一「完全一致」、問い二「部分一致」で、問い一は、わかったけど、問い二がわからない、とかじゃ、ないの ? というふうに、エスパーしてみました。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。