【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21121

define文の書き方
投稿者---アリババ(2005/05/21 16:54:51)


文字型配列に入力された1と0の文字列(大きさは12)、1なら男、0なら女と1行にずらっと表示させるプログラムを作りたい。
(1)define文でまず文字列を入れる配列を定義する
 (2)define文で1という文字の文字コードをMと定義する 
 (3)あとはwhile 文で制御する
このようなプログラムの書き方を教えてください。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:define文の書き方 21122 まきじ 2005/05/21 17:14:54
<子記事> Re:define文の書き方 21135 επιστημη 2005/05/22 08:52:31


No.21122

Re:define文の書き方
投稿者---まきじ(2005/05/21 17:14:54)


>このようなプログラムの書き方を教えてください。

http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+21094
で既に回答がでてます。
改めて、質問しても、回答は同じだと思います。


この投稿にコメントする

削除パスワード

No.21123

Re:define文の書き方
投稿者---アリババ(2005/05/21 17:39:28)


あの、No.21107でコンパイルしたら、エラーが出るんですけど。
エラー内容は、"char型はint型に変換できない"
どうすればいいですか?




この投稿にコメントする

削除パスワード

No.21124

Re:define文の書き方
投稿者---まきじ(2005/05/21 18:02:30)


>エラー内容は、"char型はint型に変換できない"
>どうすればいいですか?

const int table[] = {"男", "女"};

const char *table[] = {"男", "女"};
にとけば、Visual C++ Toolkit 2003 で warning level 4 で
コンパイルは通ります。
期待通りに動きませんけど(^^;
期待通りに動かない理由は既に、回答があります。
ご自分で頑張って解決してください。


この投稿にコメントする

削除パスワード

No.21126

Re:define文の書き方
投稿者---iijima(2005/05/21 19:53:57)


> http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+21094
> で既に回答がでてます。

今回は次の条件がついているので、上記スレッドの回答では不合格です。

>(1)define文でまず文字列を入れる配列を定義する
>(2)define文で1という文字の文字コードをMと定義する 
>(3)あとはwhile 文で制御する

(1)について
defineで「配列」を定義することはできません。
「配列の要素数を表すマクロ」を定義せよということだと推測されます。
題意から要素数は12ですから、例えば、次のようなことなのでしょう。

例:
#define SIZE 12

int main( void )
{
    char array[SIZE];
    以下略

(2)について
1の文字コードは「'1'」で得られるから、Mがそれを表すようにする。
つまり、こういうことだと思います。

#define M  '1'

(3)について
while文を使うのが必須であるなら、次のように考えてはいかがでしょうか。

a. 12文字の入力と配列への文字コード格納
標準入力から1文字ずつ読み込み、要素数12個の文字型(char)の配列の最初の要素から順番に、
入力された文字コードの値を代入する。
「1文字読み込んで配列の要素に代入」を12回繰り返すのにwhile文を使う。

# 1,0以外が入力されたときにどうするかも考えるべきでしょうが、
# 学習の進度として、それは次のステップなのかな。

b. 配列の要素の値に応じて"男"か"女"を出力
配列の最初の要素から順番に値を判定し、'1'なら"男"、'0'なら"女"を表示する。
配列の要素数分これを繰り返すのにwhile文を使う。



この投稿にコメントする

削除パスワード

No.21127

define文の書き方(その2)
投稿者---アリババ(2005/05/21 20:23:39)


iijimaさん
教えていただいてありがとうございました。
実はC言語のことがまだあまり(全然)わかっていなくて、define文というより後半のwhile文の方でつまづいてしまいました。

#include <stdio.h>

#define SIZE 12
#define M '1'

main(void)
{
char dt[SIZE];
int i=0;

while(i<SIZE){
printf("0と1の文字列を入力してください。\n");
scanf("%d",&dt[SIZE]);

if(dt[i]==1){
printf("女 ");
}else{
printf("男 ");
i++;
}
}
}

このように作ったら、1と0を12文字続けて入力しても、最初の1文字分しか男や女の表示が戻りません。
どうしたらいいか教えてください。


この投稿にコメントする

削除パスワード

No.21128

Re:define文の書き方(その2)
投稿者---まきじ(2005/05/21 20:40:02)


>scanf("%d",&dt[SIZE]);

文字型配列ですから、%s ですね。

> if(dt[i]==1){
char型なので、シングルクォーテーションで囲みましょう。


この投稿にコメントする

削除パスワード

No.21129

Re:define文の書き方(その2)
投稿者---iijima(2005/05/21 21:25:23)


いろいろ問題あるコードです。
ひとつひとつ指摘するよりも、入力部と出力部を分割して見直した方が良いかも
知れません。

1.入力部
SIZE個の文字を文字型配列にどのように読み込むか、大きく分けて2通りの方
法が考えられます。

(1)"文字列"として読み込む
この場合、配列には文字列の終端を表すヌル文字'\0'を格納する領域が必要で
すから、配列のサイズを"文字数+1"以上としなければなりません。
whileやforによる繰り返しは必要ありません。
入力する文字数がSIZE個を超えないことが前提です。

    char dt[SIZE + 1];
    scanf( "%s", dt );

(2)1文字ずつ読み込んで配列の要素に順番に格納する
この場合、配列のサイズはSIZE個以上であれば良いことになります。
前回の私の回答はこの方法を想定したものです。

    char dt[SIZE]
    i = 0;
    while( i < SIZE ){
        int c;
        c = getchar();
        dt[i] = (char)c;
        i++;
    }

その他にもバリエーションはいろいろ考えられますが、まずは上のどちらかが
理解できれば良いと思います。


2.出力部

iが0からSIZE未満の間、dt[i]が'1'に等しければ"男"を、'0'に等しければ"女"
を出力する。
このときに注意しなくてはならないのは、dt[i]と比較するのは数値の1,0でなく、
文字コード'1','0'でなくてはならないという点です。


> define文というより後半のwhile文の方でつまづいてしまいました。

であれば、題名もそれにふさわしいものとすべきでしたね。
題名も質問の要点を理解するための重要な情報源ですから。
それと、この掲示板の注意書きにあるように、ソースを載せるときはHTML形式に
変換してください。



この投稿にコメントする

削除パスワード

No.21136

Re:define文の書き方(その2)
投稿者---επιστημη(2005/05/22 08:59:30)


>実はC言語のことがまだあまり(全然)わかっていなくて、define文というより後半のwhile文の方でつまづいてしまいました。

ユーザーの入力をひとまず諦めて、

>main(void)
>{
> char dt[SIZE];
> int i=0;
dt[0] = '0'; dt[1] = '1'; .... dt[11] = '1'; /* [*] 追加 */
> while(i<SIZE){
>....

これで男/女が正しく表示されるコードを書きなさい。
それができたら [*]部をユーザー入力に置き換えなさい。



この投稿にコメントする

削除パスワード

No.21137

Re:define文の書き方(その2)
投稿者---RAPT(2005/05/22 11:20:13)


折角
> #define M '1'
とかしてるのに、M を使っていませんね。
定義しているってことは、ソースで使えって意味だと思いますが。

> scanf("%d", &dt[SIZE]);
SIZEは固定値です。while文で i を変動させているのに
固定値を使うのは本意ではないでしょう。

それから、配列 char dt[SIZE] において、dt[SIZE] にアクセスすると
アクセス違反(範囲外のアクセス)となりますので注意。
char dt[SIZE] で使用できる範囲は dt[0]〜dt[SIZE-1]です。



この投稿にコメントする

削除パスワード

No.21135

Re:define文の書き方
投稿者---επιστημη(2005/05/22 08:52:31)


> (1)define文でまず文字列を入れる配列を定義する
> (2)define文で1という文字の文字コードをMと定義する 
> (3)あとはwhile 文で制御する

あなたはこの'問題'を理解できますか?
正直僕にはさっぱりわかんない。'答が'ではなく'問題が'。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧