痔になりやすい生活習慣とは?

下のようなプログラムを作ってみたのですが、思うように動作してくれません。
本当は曜日と時間を7回入力した後に、入力した時間に応じて○曜日は午前か午後を判別するプログラムを作ったつもりなのですが、曜日と時間を入力するところまでは上手く行くのですが、その後の曜日と午前か午後を判別するところが、全て最初に入力した曜日と必ず午前と出てしまいます。
コンパイルしてもエラーは出ないので、どこを直せばちゃんと思った通りに動作してくれるのでしょうか
わかる方いましたら教えて頂けたらと思います。
※ソースコードは下に書いてあります
※写真はコンパイルした後の実行結果です。

#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person_array[NUM];
person *person_ptr;
int i,j;
for(j=0;j<NUM;j++){
person_ptr = &person_array[j];
printf("曜日と時間1,時間2,分1,分2を入力\n");
scanf("%s",person_ptr->day);
scanf("%d",&person_ptr->time);
scanf("%d",&person_ptr->stime);
scanf("%d",&person_ptr->min);
scanf("%d",&person_ptr->smin);
printf("曜日は%s曜日,時間は%d時%d分から%d時%d分まで\n",person_ptr->day,person_ptr->time,person_ptr->min,person_ptr->stime,person_ptr->smin);
}
for(i=0;i<NUM;i++){
if(0<person_ptr->time<12){
printf("%s曜日は午前です\n",person_ptr->day);
} else {
if(11<person_ptr->time<24){
printf("%s曜日は午後です\n",person_ptr->day);
}
return 0;
}
}
}

「下のようなプログラムを作ってみたのですが」の質問画像

A 回答 (3件)

あ, 間違えてた.



演算子 < は左結合なので
(0<person_ptr->time)<12

(0<person_ptr->time)<12
と解釈しますね>#1.



演算子 < は左結合なので
0<person_ptr->time<12

(0<person_ptr->time)<12
と解釈しますね>#1.

の間違いです. コピペに失敗した.
    • good
    • 0

演算子 < は左結合なので


(0<person_ptr->time)<12

(0<person_ptr->time)<12
と解釈しますね>#1.

演算子 < の結果は 0 か 1 なので, 結局のところ
0<person_ptr->time<12
は必ず 1 ですが.
    • good
    • 0

>その後の曜日と午前か午後を判別するところが、全て最初に入力した曜日と必ず午前と出てしまいます。



「最後に」入力したもので判定したものを7 回表示。
のはずですが?


>for(j=0;j<NUM;j++){
> person_ptr = &person_array[j];
> printf("曜日と時間1,時間2,分1,分2を入力\n");
  :
>}
で、person_ptrはperson_array[0]からperson_array[6]まで順番に設定されます。
このforループを終了した時点で
「person_ptrはperson_array[6]」を指しています。

>for(i=0;i<NUM;i++){
> if(0<person_ptr->time<12){
>  printf("%s曜日は午前です\n",person_ptr->day);
> } else {
>  if(11<person_ptr->time<24){
>   printf("%s曜日は午後です\n",person_ptr->day);
>  }
>  return 0;
> }
>}
のループ中に「person_ptrはperson_array[6]」を指したまま変化しません。
# ループの中にreturnがあるのはコピペミスですかね。
# ってかif文内の条件式ヘンですけど。
## 0<person_ptr->time<12だと…まず、0<person_ptr->timeが判定されて、入力した時間が0時でなければ真(1)に
## 次に評価式の結果を12と比較して……というモノになるのか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QC言語のものなのですが、具体的にこの文がなにをしているかについてわからないので説明をお願いいたします

C言語のものなのですが、具体的にこの文がなにをしているかについてわからないので説明をお願いいたします。

Aベストアンサー

画像じゃなく、テキストで貼ってほしいところですが…。
で、掲示されている範囲ではs_copy()とs_reverse()の仕様が不明です。
# まぁ、名前からだいたい想像は付きますけども。

ということで、下記のページをどうぞ。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13182921508

QCのif文の書き方の質問です

『x=a & j=1 』の様に、『&』の前後に式を書くことがありますか?
使ったことがないので、ここに質問させて頂いております。
コメント、説明頂けますと大変有り難いです。

if stype=='L' then
x=a & j=1 //===
elseif stype=='M' then
x=a+(h/2) & j=2//============
else x=a+h & j=3//=================
end

以上、宜しくお願いします。

Aベストアンサー

見た目から、命令の区切りに使っているように見えますが、
公式マニュアルを確認しても ; や , はありましたが & は見つけられなかったので断言はできません。

https://help.scilab.org/docs/6.0.1/ja_JP/comma.html
https://help.scilab.org/docs/6.0.1/ja_JP/semicolon.html

Qc言語の課題がわかりません

XOR を用いて文字列の暗号化及び暗号化された文字列の復号化をするプログラムを作成し,暗号化した文字列の結果は code.txt に出力し、復号化する際には code.txt からファイルを読み込んで復号化することとし、入力する文字列は最大で 9 文字までとする。暗号化および復号化には鍵として1つの文字用いる。鍵は暗号化の際に入力させ、復号化の際にも同じ鍵を用いる。暗号化は文字列の各文字ごとに鍵との間の XOR を取るものとする。と課題で出たのですが、自分には難しすぎて出来ません。どなたかおしえてください。プログラムの途中経過と実行例を記しておきます。
#include<stdio.h>
int main(){
int x;
char a[256],b[256];

printf("Select Mode 1.Encryption, 2.Decryption :");
scanf("%d",&x);
if(a==1){
printf("Input passphrase :");
scanf("%s",a);
printf("Input key:");
scanf("%d",b);
}else{
printf("Input key:");
scanf("%d",b);

}

if(a==3){
printf("Invalid value\n");
}
return 0;
}
<実行例 1>
Select Mode 1.Encryption, 2.Decryption : 1
Input passphrase : password
Input key : $
TEWWSKV@
<実行例 2>
Select Mode 1.Encryption, 2.Decryption : 2
Input key : $
Code : TEWWSKV@
Decode : password
<実行例 3>
Select Mode 1.Encryption, 2.Decryption : 3
Invalid value

XOR を用いて文字列の暗号化及び暗号化された文字列の復号化をするプログラムを作成し,暗号化した文字列の結果は code.txt に出力し、復号化する際には code.txt からファイルを読み込んで復号化することとし、入力する文字列は最大で 9 文字までとする。暗号化および復号化には鍵として1つの文字用いる。鍵は暗号化の際に入力させ、復号化の際にも同じ鍵を用いる。暗号化は文字列の各文字ごとに鍵との間の XOR を取るものとする。と課題で出たのですが、自分には難しすぎて出来ません。どなたかおしえてください...続きを読む

Aベストアンサー

以下、ファイルの入出力を絡めると理解が遠のくので、
シンプルに、画面を通しての入出力動作をするものにしました。
forループの中で行っている1行が最も重要な箇所なので、じっくり理解して下さい。

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

int main() {
int x;
char a[9+1];
char b[1+1];
char r[9+1];

memset(a, 0x00, sizeof(a));
memset(b, 0x00, sizeof(b));
memset(r, 0x00, sizeof(r));

printf("Select Mode 1.Encryption, 2.Decryption : ");
scanf_s("%d", &x);
if (x == 1) {

printf("Input passphrase : ");
scanf("%s", a);

printf("Input key: ");
scanf("%s", b);

} else if (x == 2) {
printf("Input key: ");
scanf("%s", b);

printf("Code : ");
scanf("%s", a);

printf("Decode : ");

} else {
printf("Invalid value\n");
return 0;
}

for (unsigned int i = 0; i < strlen(a); i++) {
r[i] = a[i] ^ b[0];
}

printf("%s\n", r);

return 0;
}

以下、ファイルの入出力を絡めると理解が遠のくので、
シンプルに、画面を通しての入出力動作をするものにしました。
forループの中で行っている1行が最も重要な箇所なので、じっくり理解して下さい。

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

int main() {
int x;
char a[9+1];
char b[1+1];
char r[9+1];

memset(a, 0x00, sizeof(a));
memset(b, 0x00, sizeof(b));
memset(r, 0x00, sizeof(r));

printf("Select Mode 1.Encryption, 2.Decryption : ");
scanf_s("%d", &x);
if (x == 1) {

printf(...続きを読む

QC++を本で独学してますが、配列とポインタでわからないところがあります。

現在C++を本で独学しており、ポインタの章を終えて配列の章を
学んでいるのですがでわからないところがあります。

『配列名は配列の先頭要素のアドレスをあらわす。』と習ったのですが、
下記のコードにての

#include <iostream>
using namespace std;

int main()
{
char str[] = "Hello";
cout << str << '/\';
return 0;
}

を実行すると"Hello"が出力されるとのことですが、
どうしてchar型配列strの要素をそのまま出力することになるのでしょうか?
この場合、『配列名は配列の先頭要素のアドレスをあらわす。』に
のっとれば出力されるのは「char型配列strの先頭要素のアドレス」に
なり、アドレスが出力されなければおかしいと思うのですが・・・?

同様に

#include <iostream>
using namespace std;

int main()
{
char* char = "Hello";
cout << str << '/\';
return 0;
}

のコードでもどうして間接参照演算子*さえ使わずに
strの要素を出力できるのかがさっぱりわかりません。

ご説明頂ければ幸いです。

現在C++を本で独学しており、ポインタの章を終えて配列の章を
学んでいるのですがでわからないところがあります。

『配列名は配列の先頭要素のアドレスをあらわす。』と習ったのですが、
下記のコードにての

#include <iostream>
using namespace std;

int main()
{
char str[] = "Hello";
cout << str << '/\';
return 0;
}

を実行すると"Hello"が出力されるとのことですが、
どうしてchar型配列strの要素をそのまま出力することになるのでしょうか?
この場合、『配列名は配列の先頭要素...続きを読む

Aベストアンサー

cout の << は。その後の型によって何を表示するかが変わります。
このような仕組をポリモーフィズムと言って、C++の重要な仕組の一つです。


他のポインタだと、そのアドレスを出力する、となっています。
対して、 char * だと「その示すアドレスから順番に、'\0'の前までの『文字』を出力する」となっています。

これは、以下のような理由があります。
・C++の元になったC言語では、「文字列型」というものが無く、「charの配列の先頭から'\0'の前までを文字列として扱う」というルールを使っている。
C++でも、そのルールを引き継いで、char * / char[] を文字列として扱うケースが多い。
・cout << にchar * を指定したとき、圧倒的に「文字列を出力したい」ケースが多い


アドレスを出力させたいのなら、char *でないポインタにキャストすることです。
そういう時は、汎用につかえる void * にキャストするのが常套手段です。

C言語由来の記法では (void * ) str と、(型)とします。
ですが、このキャストはなんでも有りすぎるので、C++ではC++専用のキャスト方法が用意されているので、そちらを使いましょう。
static_cast<void *>(str)

cout の << は。その後の型によって何を表示するかが変わります。
このような仕組をポリモーフィズムと言って、C++の重要な仕組の一つです。


他のポインタだと、そのアドレスを出力する、となっています。
対して、 char * だと「その示すアドレスから順番に、'\0'の前までの『文字』を出力する」となっています。

これは、以下のような理由があります。
・C++の元になったC言語では、「文字列型」というものが無く、「charの配列の先頭から'\0'の前までを文字列として扱う」というルールを使っている。
C++で...続きを読む

Q構造体の勉強をしているのですが1と2は同じなのでしょうか?違うのでしょうか? もし違うならなぜ違うの

構造体の勉強をしているのですが1と2は同じなのでしょうか?違うのでしょうか?
もし違うならなぜ違うのか説明してください‼︎
よろしくお願いします。

1.typedef struct roll{メンバー};

2.typedef struct {メンバー}roll;

Aベストアンサー

「struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前」の「型」と「構造体の名前」の違いってなんだろ.

さておき, これは typedef の仕様との関係がありますねぇ.

まず構造体の定義を完全に書くと
struct 構造体タグ メンバー定義 宣言子;
という形になります. ここで構造体タグは識別子, メンバー定義は
{ メンバーの宣言 }
という形で宣言子は変数やら配列やらポインタやらを表します. struct 以外は省略可能なのですが, 実際に意味を持つのは
・宣言子を省略する: 「struct 構造体タグ」で表される新しい構造体を定義する
・メンバー定義を省略する: 「struct 構造体タグ」で表される構造体型の変数などを宣言する
・構造体タグを省略する: 構造体タグがなんらかの理由で不要なときにはこの形式もあります
・メンバー定義と宣言子を省略する: 「struct 構造体タグ」で表される構造体型があることを宣言する
の 4つに限られます (全部省略しちゃダメなのは明らかだと思うけど). 再度確認しておくと, 「struct 構造体タグ」で 1つの型を表します.

質問文にある 2つの文を (typedef を除いて) 解釈するとそれぞれ
1. 宣言子を省略している. roll が構造体タグで, 「struct roll」という型を定義する
2. 構造体タグを省略している. roll は宣言子で, この場合は roll という変数を宣言する
となります. そして, *typedef がなければ*どちらも合法です (ただし, 当然ですが意味は違います).

で typedef の影響が出ます. typedef は
宣言子に含まれる識別子に対し, 「typedef がなければ与えられるはずの型」の別名として定義する
という働きをもちます. 例えば
int FOO, *Bar;
だと
・FOO は int型の変数
・Bar は int へのポインタ型の変数
なので, ここに typedef を付けた
typedef int FOO, *Bar;
では
・FOO は int型の別名
・Bar は int へのポインタ型の別名
となります. このように typedef では「別名を定義する」都合上, 宣言子はどうしても必須となります. 従って, 宣言子が省略された 1 はダメということになります.

「struct の直後に来るのが型でメンバーの後に来るのが新しい構造体の名前」の「型」と「構造体の名前」の違いってなんだろ.

さておき, これは typedef の仕様との関係がありますねぇ.

まず構造体の定義を完全に書くと
struct 構造体タグ メンバー定義 宣言子;
という形になります. ここで構造体タグは識別子, メンバー定義は
{ メンバーの宣言 }
という形で宣言子は変数やら配列やらポインタやらを表します. struct 以外は省略可能なのですが, 実際に意味を持つのは
・宣言子を省略する: 「struct 構造体タグ」...続きを読む

QC言語のポインタの価値

下名は、プログラムの完全な素人ではないのですが、

C言語の初心者が、ポインタがわかりにくいということがよくあると思います。
例えば、pythonや他の言語では、ポインタはなかったと思います。

C言語において、ポインタは、必須だったのでしょうか?
それとも、単に、配列ぐらいあれば、言語として、問題なかったのでしょうか?
C言語が、ポインタの機能で何を実現できているのか、理解を深めたく。

Aベストアンサー

> C言語が、ポインタの機能で何を実現できているのか

データをコピーする手間を無くすことができます。
例えば要素の合計を求める関数を作って、その引数として要素100個の配列を渡すとしましょう。
関数の実行時には一時的にメモリ上に必要な作業エリアを確保します。
ポインタが無い場合は、作業エリアに要素100個を全てコピーしてきて、それを元に計算を始めます。
でもポインタがある場合は、元々の配列のアドレスだけをコピーしてきて、そのアドレスを進めながらアドレス先のデータを取得するという動作で計算を進めることができます。
データが1000個、10000個だったら、コピーする手間が更に余計にかかりますよね?


> C言語において、ポインタは、必須だったのでしょうか?

C言語はアセンブリ言語の面倒くささを改善するために作成されました。
アセンブリ言語でのプログラムを経験されればお分かりになると思いますがアクセスするメモリのアドレスを決定するのに「間接アドレッシング」が多用されます、これがポインタそのものなんですよね。
従ってアセンブリ言語の延長として開発されたC言語にはポインタ機能は当然存在すべきものだったと思います。


> 例えば、pythonや他の言語では、ポインタはなかったと思います。

他の方も仰っていますが見えなくなっているだけでポインタは存在します。
例えばPythonでインスタンスを宣言した場合の

 p = MyClass()

このpはポインタそのものです。
ただ、ポインタであることを意識しなくても良いように考えられているだけなんですよね。


> C言語の初心者が、ポインタがわかりにくいということがよくあると思います。

これはC言語でのポインタの記述の仕方が分かりにくいというのも多分にあると思います。
当初は「分かっている人」だけが使う為に設計された言語ですから、あまり考慮されなかったのですね。
ですから後に続く言語は、ポインタを意識しなくても良い様になったのではないでしょうか?

> C言語が、ポインタの機能で何を実現できているのか

データをコピーする手間を無くすことができます。
例えば要素の合計を求める関数を作って、その引数として要素100個の配列を渡すとしましょう。
関数の実行時には一時的にメモリ上に必要な作業エリアを確保します。
ポインタが無い場合は、作業エリアに要素100個を全てコピーしてきて、それを元に計算を始めます。
でもポインタがある場合は、元々の配列のアドレスだけをコピーしてきて、そのアドレスを進めながらアドレス先のデータを取得するという動作で計...続きを読む

Q下のようなプログラムを作ってみたのですが、このプログラムを構造体のポインタを用いて書き換えたいのです

下のようなプログラムを作ってみたのですが、このプログラムを構造体のポインタを用いて書き換えたいのですがどのように変えるのがいいのでしょうか?
[NUM]の配列の部分は変えずに、ポインタを使うことは可能なのでしょうか?
どの部分を書き換えればいいのか、分かる方いましたら教えて頂けると有難いです*_ _)


#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person[NUM];
int j;
for(j=0;j<NUM;j++){
printf("曜日と時間1,時間2,分1,分2を入力\n",person[j].day,person[j].time,person[j].stime,person[j].min,person[j].smin);
scanf("%s",&person[j].day);
scanf("%d",&person[j].time);
scanf("%d",&person[j].stime);
scanf("%d",&person[j].min);
scanf("%d",&person[j].smin);
printf("曜日は%s,時間は%d時%d分から%d時%d分\n",person[j].day,person[j].time,person[j].min,person[j].stime,person[j].smin);
}
return 0;
}

下のようなプログラムを作ってみたのですが、このプログラムを構造体のポインタを用いて書き換えたいのですがどのように変えるのがいいのでしょうか?
[NUM]の配列の部分は変えずに、ポインタを使うことは可能なのでしょうか?
どの部分を書き換えればいいのか、分かる方いましたら教えて頂けると有難いです*_ _)


#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person[NUM];
int j;
...続きを読む

Aベストアンサー

以下のようになります。
person person[NUM];は、紛らわしいので
person person_array[NUM];に変えています。
--------------------------------------------------
#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person_array[NUM];
person *person_ptr;
int j;
for(j=0;j<NUM;j++){
person_ptr = &person_array[j];
printf("曜日と時間1,時間2,分1,分2を入力\n");
scanf("%s",person_ptr->day);
scanf("%d",&person_ptr->time);
scanf("%d",&person_ptr->stime);
scanf("%d",&person_ptr->min);
scanf("%d",&person_ptr->smin);
printf("曜日は%s,時間は%d時%d分から%d時%d分\n",person_ptr->day,person_ptr->time,person_ptr->min,person_ptr->stime,person_ptr->smin);
}
return 0;
}

以下のようになります。
person person[NUM];は、紛らわしいので
person person_array[NUM];に変えています。
--------------------------------------------------
#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person_array[NUM];
person *person_ptr;
int j;
for(j=0;j<NUM;j++){
person_ptr = &person_array[j];
printf("曜日と時間1,時間2,分1,分2を入力\n");
scanf("%s",person_ptr->day);
scanf("%d",&...続きを読む

QC言語のポインタ関数について main関数のなかで &をつけてc=0 a=1 b=2として sum3

C言語のポインタ関数について
main関数のなかで
&をつけてc=0
a=1
b=2として
sum3関数に飛ばします。

void sum3(int a, int b, int *c)
{
*c = a + b;
}

通常*をつけないと
mainでprintでひょうじしても
3になりませんが
*つけると
3と表示できます。
なぜでしょうか?

またreturnがいらない理由も教えてください。

Aベストアンサー

a、bは「値渡し」であって、sum2の中で値を変えても、呼び出し元には反映されません。
cに"*"をつけて「アドレス渡し」とすることで、sum2の中で変更した値が呼び出し元の変数に反映されるようになります。

このあたりのことは、作ったC言語のソースを実行形式ではなくて、コンパイルオプションを指定して、アセンブラー言語で表示させてみるとよくわかると思います。
C言語のポインタを理解するには、アセンブラ言語の勉強をするのが一番効果があります。

なお、アセンブラはCPUによって違いがあったりします。
私が勉強したころは、CPUがまだ8ビットで、68系(モトローラ系)、80系(インテル系)とか、あるいは、IBMのS/370汎用機とかだったのですけど、どれか1つのアセンブラを勉強すれば、いいと思います。

Qこのプログラムを教えてください。

このプログラムを教えてください。

Aベストアンサー

以下のPGで実現出来ます。
難解なところは特にありません。
初めて見る関数などの無いよう、敢えて四則演算を用いて解を導いています。
これを見て、数式の解を表現する1つの方法をぜひ身に付けて下さい。

/* 課題1 */
/* maru.c */

#include<stdio.h>
#include<string.h>
#define PI 3.14

int main() {

float d; /* 入力の直径 */
float e; /* 円周 */
float m; /* 面積 */
float s; /* 表面積 */
float v; /* 体積 */

printf("直径を入力してください[cm]: ");
scanf("%f", &d);

d = d / 2; /* 入力直径を半径に変換 */
d = d / 100; /* 入力値の単位変換 [cm]→[m] */

printf("(1)円の円周 [m] =%f\n", 2 * PI * d );
printf("(2)円の面積 [m2]=%f\n", PI * d * d );
printf("(3)球の表面積[m2]=%f\n", 4 * PI * d * d );
printf("(4)球の体積 [m3]=%f\n", (4.0 / 3.0) * PI * d * d * d);

return 0;
}

以下のPGで実現出来ます。
難解なところは特にありません。
初めて見る関数などの無いよう、敢えて四則演算を用いて解を導いています。
これを見て、数式の解を表現する1つの方法をぜひ身に付けて下さい。

/* 課題1 */
/* maru.c */

#include<stdio.h>
#include<string.h>
#define PI 3.14

int main() {

float d; /* 入力の直径 */
float e; /* 円周 */
float m; /* 面積 */
float s; /* 表面積 */
float v; /* 体積 */

printf("直径を入力してください[cm]: ");
scanf("%f", &d);

d = d / 2; /* ...続きを読む

Qc言語について

このプログラムは(ありがとう)を5回入力するのですが、n<5だと4回しか表示されないと思うのですが、どうなんでしょうか。

Aベストアンサー

forループの1回目のnの値は0なのでprint文を実行。
2回目は1なのでprint文を実行。
3回目は2なのでprint文を実行。
4回目は3なのでprint文を実行。
5回目は4なのでprint文を実行。
6回目は5なのでループを抜ける。

参考まで。


[おまけ]
print文の次の行の}はforの下に来るようにした方が可読性が高いです。
同様にreturn文の次の行の}は3行目の{と同じ位置にした方が可読性が高いです。
そうすると全体として{から}までの範囲を直観的に理解できてソースコードを読むのが楽になります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング