• 締切済み

続・C言語について

http://okwave.jp/qa5241461.html 先ほど、このような質問をして、いただいた回答を参考に下記のようなプログラムを作ってみたのですが、実行結果は、数値の入力と最後の"\n"しか反映していません…。 このプログラムのどの部分がマズイのか、お教えいただけたら幸いです。 よろしくお願いいたします。 #include <stdio.h> void draw_even(int, int); void draw_odd(int, int); int main(void) { int kazu; int gyou=1; printf("数字2~9を入力してください:"); scanf("%d", &kazu); while(kazu < 2 || kazu >9) { printf("※入力エラー!! 2~9を入力してください:"); scanf("%d", &kazu); } while(gyou <= kazu) { if(kazu = 2*(kazu/2)) { gyou = kazu+1; draw_even(kazu, gyou); } else { gyou = kazu; draw_odd(kazu, gyou); } gyou++; } } void draw_even(int kazu, int gyou) { int keta = 1; if(kazu!=(gyou+1)/2) { while(keta==kazu && keta==(gyou+1)/2 && keta==gyou-(kazu-1)) { printf("*"); } } else { for(keta=1; keta<=gyou; keta++) { if(keta!=(gyou+1)/2) { printf("*"); } else { printf(" "); } } } printf("\n"); } void draw_odd(int kazu, int gyou) { int keta = 1; if(kazu!=(gyou+1)/2) { while(keta==kazu && keta==(gyou+1)/2 && keta==gyou-(kazu-1)) { printf("*"); } } else { for(keta=1; keta<=gyou; keta++) { printf("*"); } } printf("\n"); }

みんなの回答

noname#157743
noname#157743
回答No.4

前の質問のお礼でお呼びでしたのでちょっと見に来ましたが、あまりにもメチャクチャなのでちょっとコメントのしようがないです。自分で何をやりたいのか1行1行考えて書いていますか? 雰囲気で書いてもプログラムは動きません。1行・1文字に全て意味があります。日本語のように多少言い間違えてもコンピュータの方が気を利かせて理解してくれるということはありません。順番を1つ間違えてもだめです。 まずは、元の例題プログラムが1行1行何をしているのか、全て理解できていますか? それがわかっていないうちに改造に手をつけても無理だと思います。まずは例題プログラムを徹底的に分析してみてください。

speedy-boy
質問者

お礼

#include <stdio.h> void draw_u (int); void draw_odd (int); void draw_even (int); void draw_d (int); void SPACEx (int); void SPACEy (int); void main (void) { int suu; printf("数字2~9を入力してください:"); scanf("%d", &suu); while(suu < 2 || suu > 9) { printf("※入力エラー!! 2~9を入力してください:"); scanf("%d", &suu); } if(suu == 2*(suu/2)) { suu = suu+1; draw_u (suu); draw_even (suu); draw_d (suu); } else { draw_u (suu); draw_odd (suu); draw_d (suu); } } void draw_u (int suu) { int a, b, cnt; a=0; b=(suu-3)/2; cnt=1; while(cnt<=(suu-1)/2) { SPACEx (a); SPACEy (b); SPACEy (b); a++; b--; cnt++; printf("\n"); } } void draw_odd (int suu) { int kazu; for(kazu=1; kazu<=suu; kazu++) { printf("*"); } printf("\n"); } void draw_even (int suu) { int kazu; for(kazu=1; kazu<=suu; kazu++) { if(kazu != (suu+1)/2) { printf("*"); } else { printf(" "); } } printf("\n"); } void draw_d (int suu) { int a, b,cnt; a=(suu-3)/2; b=0; cnt=1; while(cnt<=(suu-1)/2) { SPACEx (a); SPACEy (b); SPACEy (b); a--; b++; cnt++; printf("\n"); } } void SPACEx (int a) { int kazu; kazu=1; while(kazu<=a) { printf(" "); kazu++; } printf("*"); } void SPACEy (int b) { int kazu; kazu=1; while(kazu<=b) { printf(" "); kazu++; } printf("*"); } 関数が増えて不格好になってしまいましたが、このような形で落ち着きました。 今回はありがとうございました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

#2は他のかたと重複しました。 無視してくださってかまいません。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>if(kazu = 2*(kazu/2)) これは、何をするためのif文ですか?

speedy-boy
質問者

補足

kazu==2*kazu/2を満たせばkazuは『偶数』で、満たさなければ『奇数』を判別するモノ(のつもり)です。 お手数ですが、前回の質問を見ていただけるとわかるのですが、偶数の場合と奇数の場合とで処理が変わるので、このようなif文を入れてあります。 intで宣言した数が奇数だった場合、2で割ると小数点以下が切り捨てになり、5/2=2となる為、これで偶数・奇数が判別できると思ったのですが、間違いでしょうか…?

noname#246547
noname#246547
回答No.1

斜め読みで申し訳ないが if(kazu = 2*(kazu/2)) ってシングルイコールだけど大丈夫?

speedy-boy
質問者

お礼

あッ!!こりゃあいけないですね! ありがとうございます! つでに、自分で発見したミスなんですが、関数のwhile文の中の「keta==(gyou+1)/2」の部分は「keta<=(gyou+1)/2」の間違いでした。 上記の2つを直しても、実行結果は変わりませんでした…。

speedy-boy
質問者

補足

下記のお礼の「ミスを見つけた」の部分がまたミスです…。 アホですね…自分。 もとのままでOKでした。。。

関連するQ&A

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • C++言語について。構文エラー

    ジャンケンゲームを作ってたんですが サイトを参考にしながらやってたんですが、どこかでミスったみたいで。 コピーしてやるのはイヤなので、自分で打ちたいんです。   どうか間違いを指摘してもらえないでしょうか?            #include <stdio.h> #include <stdlib.h> int main() { int n; int p;//player int c;//computer srand(0);//乱数の初期化 do { //プレイヤーの手 printf("あなたの手を入力してください\n(グー:1、チョキ:2、パー:3\n"); scanf("%d", &p); //コンピュータの手 c = rand() % 3 + 1; //勝ち負け判定 if(p == c){ printf("draw\n"); }else if(p == 1 && c == 2){ printf("WIN!!\n"); }else if(p == 2 && c == 3){ printf("WIN!!\n"); }else if(p == 3 && c == 2){ printf("WIN!!\n"); }else{ printf("lose...\n"); } //続けるかどうかの判定 printf("try agin?\nNO(0を入力)---"); scanf("%d", &n); //nが0以外だったら続ける }while(n != 0); return 0; }        で、エラーが構文エラー : ';' が 'return' の前にありません。 というものでした。   よろしくおねがいします。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • C言語で数当てゲーム

    私は最近5月からCのプログラミングを学び始めた中3なんですが じゃんけんゲームと丁半ゲームを今までに作りました で今回数当てゲームを作ってみたのですが何回作り直しても エラーが出ます(コンパイラのエラーではなくWindows?のエラーのようなもの) じゃんけんゲームなどと同じように作ったつもりなのですが・・・・ どうなっているのでしょうか? ソースは↓です #include <stdio.h> #include <time.h> #include <stdlib.h> #include <conio.h> int main() { int kazu,i,x; printf("数当てゲーム!!\n"); srand(time(NULL)); x=0; i=0; do { kazu=rand()%9+1; printf("数を入力してください(1~9)\n"); scanf("%d",i); if(i<10){ if(i==kazu) { printf("当たり!!\n続けるなら0やめるなら0以外を入力"); scanf("%d",x); } else {printf("残念・・・はずれ\n続けるなら0やめるなら0以外を入力"); scanf("%d",x);} } else {printf("入力ミスです\n続けるなら0やめるなら0以外を入力"); getch();} }while(x==0); return 0; } 一応コンパイラのエラーは出ていないのですが・・・ 初心者なのでわかりません。 どこが原因なのか詳しくおしえてください

  • C言語

    #include <stdio.h> int main(void) { int a=0,ans1,ans2,ans3,ans4; printf("整数を入力してください。\n"); scanf("%d",a); ans1 = a+7; ans2 = a*;8 ans3 = a%3; ans4 = a*(-1); printf("%d\n",ans1); printf("%d\n",ans2); printf("%d\n",ans3); if(a==15){ prntf("true\n",a); } else{ printf("false\n",a); } if(a != 8){ printf("true\n",a); } else{ printf("false\n",a); } if(a <= 3){ printf("true\n",a); } else{ printf("false\n",a); } printf("%d\n",ans4); if(a<2||7<a){ printf("true\n",a); } else{ printf("false\n",a); } return 0; } これを実行しようとしてもexeファイルになりません。 教えていただけませんか?

  • C言語の事で・・・

    C勉強し始めたばかりなんですが気になってるプログラムがあります。 ttp://akabas.net/lib/CTask.aspx?id=105のページのナンバーズっていうゲームなんですがよく分からない部分があります。どなたか解説してもらえませんか? for( turn = 1 ; ; turn++ ){ int num; int test[4]; int kazu = 0; int keta = 0; int i, j; printf( "数を当ててください。\n" ); scanf( "%d", &num ); test[3] = num % 10; test[2] = ( num / 10 ) % 10; test[1] = ( num / 100 ) % 10; test[0] = ( num / 1000 ) % 10; for( i = 0 ; i < 4 ; i++ ){ for( j = 0 ; j < 4 ; j++ ){ if( numbers[i] == test[j] ){ kazu++; if( i == j ) keta++; のとこです。お願いします。

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • C言語について

    問題文が表示され、その解答を数字で入力すると正解の場合は「大正解」、不正解の場合は「はずれ」と表示されるプログラムなのですが、?部分がどうしても分りません・・・ 正しいと思えば0、間違ってると思うなら1と入力するプログラムです。 どなたかご教授いただけるとありがたいです>< main() { int i,k; i=0; while(i<5){ printf("次の文章が正しければ0、間違っていれば1を入力してください。\n"); printf("%s",q[i]); scanf("%d",&k); if(a[?]==?) {printf("大正解\n");} else {printf("はずれ\n");} i????; } printf("おしまい\n"); }

  • C言語

    はじめまして。 C言語を学習しております。 参考書の練習問題19(下記)で以下の部分がどうしても理解できません。 1、【(People*)mallock】の部分で、mallockの前のPeopleを()でくくる意味とPeopleの後に*を付ける意 味がわかりません。 2、InputPeople関数とShowPeople関数の最後の部分(●の印をしている部分)になぜretutn 0がいらないのでしょうか(原文にはretutn 0の記述がありません)。 3、【while (1)】の部分で、while文の使い方は、「while(条件式){ 繰り返す文;}」のはずですが、なぜ条件式の部分が1なのでしょうか(a > bなどの形ではないのでしょうか)。 4、【while (1)】の部分で、InputPeople関数の引数としてdata[count]がありますが、何を意味しているのかがわかりません。People型の変数dataとint型の変数countを組み合わせてどういう意味合いになるのでしょうか。dataとcountはどういう関係でしょうか。 5、【while (1)】の部分で、count++する意味がわかりません。 6、【while (1)】文内の下記の記述が何を意味しているのかがわかりません。       if (count >= datasize) {       datasize += 10;       data = (People*)realloc(data,sizeof(People) * datasize);      } ここでつまづいて先に進めず困っております。 どうか教えていただきたく、お願い致します。 ●練習問題19 練習問題16(一番下に参考として解答を載せています)の、 「3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。 ただし、データは構造体で記憶することとし、 また、データの入力と表示はそれぞれ専用の関数を作って行うこととする。」 という問題を元に、何人分でも入力できるように改造しなさい。 なお、年齢に-1が入力されれば入力終了とする。 ※配列番号がint型なのでint型の最大値まで扱えれば良い。 ●練習問題19の解答 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { int i,count,datasize; People *data; datasize = 10; data = (People*)malloc(sizeof(People) * datasize); count = 0; while (1) { InputPeople(&data[count]); if (data[count].age == -1) break; count++; if (count >= datasize) { datasize += 10; data = (People*)realloc(data,sizeof(People) * datasize); } } for (i = 0;i < count;i++) { ShowPeople(data[i]); } free(data); return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n");     /*●retutn 0は不要?*/ } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n");     /*●retutn 0は不要?*/ } ●練習問題16の解答 #include <stdio.h> #include <string.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { People data[3]; int i; for (i = 0;i < 3;i++) { InputPeople(&data[i]); } for (i = 0;i < 3;i++) { ShowPeople(data[i]); } return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n"); } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n"); }

  • C言語!教えてください!

    /* キーボードから4桁の数字を読み込み、3で割った余りが0ならばそのまま  表示する。1ならば数字と並びを逆に表示する。  2ならばその数字と逆に並べた数字の差の絶対値を表示。その際に差が0  であるなら入力した数字をそのまま表示するプログラム。 */ #include <stdio.h> int main(void) { int no; printf("4桁の数字を入力してください:"); scanf("%d",&no); if(no % 3 ==0) printf("%d \n" , no); else if(no % 3 ==1) do{ printf("%d",no%10); no = no / 10; }while (no > 0 ); else ここから絶対値を考えようとしたのですが 逆にした値が文字で置かれていないのでやりようがありません。 逆にした値は文字で置けるものなんですか? それともこの文ではできませんか? よろしくお願いします。

専門家に質問してみよう