掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

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

No.25296

グラフィックとsprintf関数
投稿者---cat(2006/01/14 06:49:06)


現状のgw_string関数は、変数を直接表示する機能は実装されていない。
そこで、パラメータに変数を持つことのできる関数gw_string2を作成せよ。

関数の仕様は以下の通りとする。
引数リスト: gw_string2( X座標, Y座標, 文字列, 変数 )
実行例: gw_string2( 100, 100, "x=%d", x );

変数は1つだけ対応できれば良い。 sprintf関数と組み合わせることに気づけば簡単。

用語説明
・gw_int();
 グラフィックウインドウの表示。
・gw_string(x,y,"str");
 座標(x,y)を始点としたchar型配列による文字列strを表示する。

#include    <stdio.h>
#include    "gw.h"
int main()
{
        int x,y,i;
        char str[100];
        char str1[] = "CAT";
        gw_init();
        while(1)
        {
            gw_color(0);
            for(i=0; i<10; i++)
            {
                sprintf(str,":%s",str1);
                puts(str);
            }
        }
    return 0;
}


プログラムでgw_string(x,y,"str");とやればグラフィック上でX座標とY座標のところにstrを表示してくれます。gw_string2( 100, 100, "x=%d", x );をプログラム中で実装させるにはsprintf関数とどのように組み合わせればいいのでしょうか。よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:グラフィックとsprintf関数 25297 επιστημη 2006/01/14 07:51:32


No.25297

Re:グラフィックとsprintf関数
投稿者---επιστημη(2006/01/14 07:51:32)


>プログラムでgw_string(x,y,"str");とやればグラフィック上でX座標とY座標のところにstrを表示してくれます。gw_string2( 100, 100, "x=%d", x );をプログラム中で実装させるにはsprintf関数とどのように組み合わせればいいのでしょうか。よろしくお願いします。

void gw_string2(int x, int y, const char* format, int value) {
 /* format と value から、出力文字列 output を作る */
  gw_string(x, y, output);
}

↑上記コメント部にsprintfを使います。



この投稿にコメントする

削除パスワード

No.25300

Re:グラフィックとsprintf関数
投稿者---cat(2006/01/14 08:15:50)


επιστημη様、回答ありがとうございます。
#include    <stdio.h>
#include    <string.h>
#include    "gw.h"
int main(void)
{
        int x,y;
        gw_init();
        
        while(1)
        {
            gw_color(0);
            sprintf(gw_string2(100,100, "x=%d" x ));
        }
        
        void gw_string2(int x, int y, const char* format, int value){
        gw_string(x, y, output);
        }
}

このようにしたのですがうごきません、どこがわるいのでしょうか?


この投稿にコメントする

削除パスワード

No.25305

Re:グラフィックとsprintf関数
投稿者---iijima(2006/01/14 09:47:29)


> このようにしたのですがうごきません、どこがわるいのでしょうか?

gw_string2関数の定義を書く場所が間違っています。
これでは、動かないどころか、コンパイルもできないのでは?

また、関数定義を正しい場所に書いたとしても、επιστημηさんが助言された

> /* format と value から、出力文字列 output を作る */

が実装されていないので、やはりコンパイルできないでしょう。


# 「うごきません」だけでは激しく説明不足です。
# コンパイルができない(コンパイラが吐き出したエラーメッセージも添付して説明)、
# コンパイルはできたが実行時にエラーが生じる(エラー発生時の状態を説明)、
# 意図した結果と違う(意図した結果と実際の結果のどこがどう違うのかを説明)
# など、症状は具体的に詳しく書くべきです(「掲示板利用宣言」にもあります)。



この投稿にコメントする

削除パスワード

No.25307

Re:グラフィックとsprintf関数
投稿者---επιστημη(2006/01/14 09:51:05)


>このようにしたのですがうごきません、どこがわるいのでしょうか?

なにひとつ理解していないところ。

「パラメータに変数を持つことのできる関数gw_string2を作成せよ。」
なのにあなたは作成していない。

僕が示したアドバイス:
「format と value から、出力文字列 output を作る」
さえもやっていない。



この投稿にコメントする

削除パスワード

No.25310

Re:グラフィックとsprintf関数
投稿者---kz3(2006/01/14 11:03:59)


もう十分叩かれてると思うから内心(ごめんね)ではあるけど・・・
#include    <stdio.h>
#include    <string.h>
#include    "gw.h"
int main(void)
{
        int x,y;
        gw_init();
        
        while(1)
        {
            gw_color(0);
            sprintf(gw_string2(100,100, "x=%d" x )); // (2)
        }
        
        void gw_string2(int x, int y, const char* format, int value){
        gw_string(x, y, output);
        } // (1),(3)
}


> このようにしたのですがうごきません、どこがわるいのでしょうか?
    1) C言語の文法ではない。
    2) sprintf()を理解していない。
    3) gw_string2()が実装されていない。(επιστημηさんより)


sprintf()がどういう関数なのかを勉強してください。
# すいません、付けたつもりがεπιστημηさんに敬称が付いていませんでした。
# 「初めまして」なのにとんだ失礼をお許しください。



この投稿にコメントする

削除パスワード

No.25311

Re:グラフィックとsprintf関数
投稿者---επιστημη(2006/01/14 11:12:10)


>このようにしたのですがうごきません、どこがわるいのでしょうか?

質問が下手。
コンパイルできないんだから「うごきません」以前の問題。
具体的に「××の行で〜〜というエラーが出ます」のように、【具体的】に説明すべし。

「うごきません」だけで済ますべからず。
「具合が悪いです」だけで治療できる医者はない。いたらヤブ医者。



この投稿にコメントする

削除パスワード

No.25352

Re:グラフィックとsprintf関数
投稿者---cat(2006/01/14 20:13:59)


もうしわけありませんでした。
fprintfの使い方がよく分からないのですが、簡単に教えてもらえないでしょうか?
かけざんの関数を作ってみたのですが、文法はあっているのでしょうか?アドバイスお願いします。


#include<stdio.h>
int kake(int a,int b);
int main(void)
{
int a,b,c;
printf("number");
scanf("%d%d",&a,&b);
c=kake(a,b);
printf("%d×%d=%d\n",a,b,c);
return 0;
}

int kake(int a,int b)
{
int i,c=0;
for(i=1;i<=b;i++)
c+=a;
return c;
}




この投稿にコメントする

削除パスワード

No.25353

Re:グラフィックとsprintf関数
投稿者---RAPT(2006/01/14 20:27:42)


じゃー、サンプルを。

// [ctest.c]
#include <stdio.h>
int main(void)
{
    printf("number\n");
    fprintf(stdout, "--stdout--\n");
    fprintf(stderr, "--stderr--\n");
    return 0;
}

/*
■普通に実行
>>ctest
number
--stdout--
--stderr--

■出力をリダイレクト
>>ctest > ctest.txt
--stderr--

■リダイレクトした中身を確認
>>type ctest.txt
number
--stdout--
*/



この投稿にコメントする

削除パスワード

No.25354

Re:グラフィックとsprintf関数
投稿者---cat(2006/01/14 20:37:41)


RAPT様、回答ありがとうございます。
何をどうしたらいいのやらさっぱりです。^^;
fprintfはsprintfと一緒の内容なんでしょうか?
>■出力をリダイレクト
>>>ctest > ctest.txt
>--stderr--
ここが気になりました。実行してみると、上の二行だけテキストの中に書かれて、3番目は書かれていませんでした。ここにヒントがあるのでしょうか?


この投稿にコメントする

削除パスワード

No.25358

Re:グラフィックとsprintf関数
投稿者---kz3(2006/01/14 23:22:00)


>RAPT様、回答ありがとうございます。
>何をどうしたらいいのやらさっぱりです。^^;
>fprintfはsprintfと一緒の内容なんでしょうか?

C言語を勉強しているわりには手元に関数のリファレンスとかないんですか?
タダ指向であればWEBを検索して関数リファレンスを探してください。
それでも見つからなくて困るのであればC言語辞典を買ってください。


この投稿にコメントする

削除パスワード

No.25361

Re:グラフィックとsprintf関数
投稿者---RAPT(2006/01/15 00:43:46)


折角フルソース掲載したんだから、自分で実行して、結果も確認したんだよね?
そこまではOKです。

あとは、リファレンス見て確認するなり、結果から類推するなりできませんか?
# まー、類推とかは経験積むしかないのも事実ですが。
# だから自分でいろいろやって経験を積むのが王道なんだけど。

stdin  ... 標準入力
stdout ... 標準出力
stderr ... 標準エラー
これらは、stdio.h の中身に実装があります。

C言語やるなら、自分が使っているヘッダファイルの中身は見て置いたほうが良いです。

で、掲載したソースで分かって欲しかった事は、標準出力はリダイレクトできるけど、
標準エラーはリダイレクトされないってコト。
そうすると、本来取得したい結果以外の情報とエラー情報を分離できますね。
ってことです。


ついでに、sprintf()

#include <stdio.h>
int main(void)
{
    char buff[BUFSIZ] = {0};
    int num;
    printf("数字を入力 >");
    scanf("%d", &num);
    sprintf(buff, "入力された数字は%dです。", num);
    printf("buff --> %s\n", buff);
    return 0;
}



この投稿にコメントする

削除パスワード

No.25357

Re:グラフィックとsprintf関数
投稿者---επιστημη(2006/01/14 22:33:19)


>fprintfの使い方がよく分からないのですが、簡単に教えてもらえないでしょうか?

# fprintf? なぜ? sprintfのマチガイ?

まずマニュアルを読み、それに従ってコードを書いて実験し、
それでもわかんなかったら訊いてください。

>かけざんの関数を作ってみたのですが、文法はあっているのでしょうか?アドバイスお願いします。

コンパイルできたんなら文法は正しい。
意図した動作をするかは別モノ。



この投稿にコメントする

削除パスワード

No.25394

Re:グラフィックとsprintf関数
投稿者---cat(2006/01/15 17:46:44)


一応こんなかんじになったのですが、問題の趣旨と一致しているでしょうか?
#include <stdio.h>
#include "gw.h"

void gw_string2(int a, int b, char str[], int x);

int main()
{
    int i;
    int m,n;

    printf("input the number\n");
    scanf("%d",&i);

    printf("input the x\n");
    scanf("%d",&m);
    printf("input the y\n");
    scanf("%d",&n);

    gw_init();

    gw_string2(m,n,"X=",i);

    gw_mouse_wait();
    gw_mouse_wait();

    return 0;
}

void gw_string2(int a,int b,char str[],int x)
{
    char str2[100];

    sprintf( str2, "%s %d", str, x);

    gw_string(a, b, str2);
}




この投稿にコメントする

削除パスワード

No.25395

Re:グラフィックとsprintf関数
投稿者---επιστημη(2006/01/15 17:51:58)


>一応こんなかんじになったのですが、問題の趣旨と一致しているでしょうか?

そんなの訊くまでもない、動かしてみれば一目瞭然じゃないですか。



この投稿にコメントする

削除パスワード

No.25396

Re:グラフィックとsprintf関数
投稿者---kz3(2006/01/15 17:57:37)


>一応こんなかんじになったのですが、問題の趣旨と一致しているでしょうか?

>	現状のgw_string関数は、変数を直接表示する機能は実装されていない。
>	そこで、パラメータに変数を持つことのできる関数gw_string2を作成せよ。

>	関数の仕様は以下の通りとする。
>	引数リスト: gw_string2( X座標, Y座標, 文字列, 変数 )
>	実行例: gw_string2( 100, 100, "x=%d", x );


趣旨は出題者にしか分かりませんので出題者に確認してください・・・。

void gw_string2(int a,int b,char str[],int x)
{
    char str2[100];

    sprintf( str2, "%s %d", str, x);

    gw_string(a, b, str2);
}

それで出来たのであれば自信もって「出来たー!」と言ってください。





この投稿にコメントする

削除パスワード

No.25397

Re:グラフィックとsprintf関数
投稿者---επιστημη(2006/01/15 18:02:42)


>一応こんなかんじになったのですが、問題の趣旨と一致しているでしょうか?

#include <stdio.h>

/* なんちゃって gwライブラリ */
void gw_init() {}
void gw_mouse_wait() {}
void gw_string(int a, int b, char str[]) {
  printf("(%d,%d) に [%s] を書きます。\n", a, b, str);
}

void gw_string2(int a, int b, char str[], int x);

int main()
{
    int i;
    int m,n;

    printf("input the number\n");
    scanf("%d",&i);

    printf("input the x\n");
    scanf("%d",&m);
    printf("input the y\n");
    scanf("%d",&n);

    gw_init();

    gw_string2(m,n,"X=",i);

    gw_mouse_wait();
    gw_mouse_wait();

    return 0;
}

void gw_string2(int a,int b,char str[],int x)
{
    char str2[100];

    sprintf( str2, "%s %d", str, x);

    gw_string(a, b, str2);
}



↑"gwなんたら"の持ち合わせがないので、お試しに書きました。

実行結果:
input the number
10
input the x
20
input the y
30
(20,30) に [X= 10] を書きます。

これがあなたの意図するものなら、正しい。
# てか、「このくらい自分でやれよ」なんだが。



この投稿にコメントする

削除パスワード

No.25399

Re:グラフィックとsprintf関数
投稿者---επιστημη(2006/01/15 18:31:56)


>>一応こんなかんじになったのですが、問題の趣旨と一致しているでしょうか?

/* mainの中でこーすると ... */
gw_string2(m,n,"Xは%dですね",i);


実行結果:
...
(20,30) に [Xは%dですね 10] を書きます。

…ダメダメじゃん orz



この投稿にコメントする

削除パスワード

No.25523

Re:グラフィックとsprintf関数
投稿者---cat(2006/01/20 23:20:00)


επιστημηさん、そのような趣旨でした^^;
無事に作ることができました。ありがとうございました。


この投稿にコメントする

削除パスワード

No.25534

Re:グラフィックとsprintf関数
投稿者---επιστημη(2006/01/21 01:08:31)


>επιστημηさん、そのような趣旨でした^^;

ウソつかない。今のままだと

> gw_string2( 100, 100, "x=%d", 10 );
で表示されるのは "x=%d 10" となります。"x=10" ではありません。



この投稿にコメントする

削除パスワード

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