C言語 関数を使う課題
C言語 関数を使う課題
「文字と個数を引数として受け取り、受け取った文字を受け取った個数だけ横に並べて
出力するような関数を作成しなさい.
その関数をmainから呼び出して、出力する文字をキーボードから読み取り、
□
□□
□□□
□□□□
□□□□□
(□=読み取った文字)
と出力するようにプログラムしなさい.」
という課題です。
申し訳ありませんが、明日の朝が提出期限なので
具体的に誤りを教えていただきたいです。
また、現在手持ちのPCでコンパイルができなく、
どこが間違っているのかわからない状態です。すいません;;
よろしくお願いします。
出力するような関数を作成しなさい.
その関数をmainから呼び出して、出力する文字をキーボードから読み取り、
□
□□
□□□
□□□□
□□□□□
(□=読み取った文字)
と出力するようにプログラムしなさい.」
という課題です。
申し訳ありませんが、明日の朝が提出期限なので
具体的に誤りを教えていただきたいです。
また、現在手持ちのPCでコンパイルができなく、
どこが間違っているのかわからない状態です。すいません;;
よろしくお願いします。
Re:C言語 関数を使う課題
仕様を間違えている様な気がします。
void syuturyoku(int kosu,char a)
{
// 文字と個数を引数として受け取り、
// 受け取った文字を受け取った個数だけ横に並べて出力するような関数
printf("\n"); // 行末は改行
}
main()
{
int i;
char a;
// 出力する文字を a にセットさせて
for(i=0;i<5;i++) syuturyoku(i+1,a);
}
という意味だと思う。
>現在手持ちのPCでコンパイルができなく、
コンパイルできるように出来ないのですか?
void syuturyoku(int kosu,char a)
{
// 文字と個数を引数として受け取り、
// 受け取った文字を受け取った個数だけ横に並べて出力するような関数
printf("\n"); // 行末は改行
}
main()
{
int i;
char a;
// 出力する文字を a にセットさせて
for(i=0;i<5;i++) syuturyoku(i+1,a);
}
という意味だと思う。
>現在手持ちのPCでコンパイルができなく、
コンパイルできるように出来ないのですか?
Re:C言語 関数を使う課題
コンパイルできるようになりました。
エラーはでないのですが、
#include <stdio.h>
void syuturyoku(int kosu,char b)
{
int c;
printf("文字を1つ、出力したい分の数を入力>>");
scanf("%c%d",&b,&kosu);
for(c=1; c<=kosu; c++)
{
printf("%c",b);
}
printf("\n");
return;
}
main()
{
int i;
char a;
char b=a;
for(i=0;i<5;i++) syuturyoku(i+1,a);
return;
}
としたところ、
「文字を1つ、出力したい分の数を入力>>a 2
aa
文字を1つ、出力したい分の数を入力>>a 2
文字を1つ、出力したい分の数を入力>>aa
文字を1つ、出力したい分の数を入力>>a 2
文字を1つ、出力したい分の数を入力>>aa」
と実行されてしまいます。
エラーはでないのですが、
#include <stdio.h>
void syuturyoku(int kosu,char b)
{
int c;
printf("文字を1つ、出力したい分の数を入力>>");
scanf("%c%d",&b,&kosu);
for(c=1; c<=kosu; c++)
{
printf("%c",b);
}
printf("\n");
return;
}
main()
{
int i;
char a;
char b=a;
for(i=0;i<5;i++) syuturyoku(i+1,a);
return;
}
としたところ、
「文字を1つ、出力したい分の数を入力>>a 2
aa
文字を1つ、出力したい分の数を入力>>a 2
文字を1つ、出力したい分の数を入力>>aa
文字を1つ、出力したい分の数を入力>>a 2
文字を1つ、出力したい分の数を入力>>aa」
と実行されてしまいます。
Re:C言語 関数を使う課題
なぜsyuturyokuの中でプロンプト(入力要求)を出しているのでしょう?
問題を読むと大筋は
1) main関数で、出力する文字と個数を入力させる
2) main関数で、1個から開始して、要求された個数までsyuturyoku関数を繰り返し呼び出す
という形になると思いますけど。
問題を読むと大筋は
1) main関数で、出力する文字と個数を入力させる
2) main関数で、1個から開始して、要求された個数までsyuturyoku関数を繰り返し呼び出す
という形になると思いますけど。
Re:
これはscanfの問題点を知ってて問題を出したのでしょうか
http://ja.wikipedia.org/wiki/Scanf
から引用
scanfの問題点と回避方法 [編集]
scanf は非常に簡潔に入力の制御が行えるため、C言語の入門書では必ずと言っていいほど登場する。しかしこの関数にはいくつかの問題点が指摘されている。ここではよく指摘される scanf の問題点とその回避方法について宣べる。
改行文字の取り扱い [編集]
入力が文字(char)の場合、主にキーボードで入力の際に押されるリターンキーが無視できないという問題点がある。例えば
char a, b, c;
scanf("%c", &a);
scanf("%c", &b);
scanf("%c", &c);
とした場合、通常なら3回入力待ちが行われることが期待されていると思われるが、実際には2回しか行われない(予期しない入力はここでは考慮しない)。これは最初の a の入力には入力された文字が代入されるが、このときストリーム上に改行コードが残されてしまい、次の bには aを入力する際に押下されたリターンキーの改行コードが代入されるためである。通常の %d や %s の場合改行コードは無視して入力を読み込むので問題にはならないが、 %c の場合は無条件にストリーム上の次のバイトを返すためこのような現象が発生する。これを防ぐには、
scanf("%c", &a);
scanf(" %c", &b);
scanf(" %c", &c);
のように最初に空白を入れることで回避される。
http://ja.wikipedia.org/wiki/Scanf
から引用
scanfの問題点と回避方法 [編集]
scanf は非常に簡潔に入力の制御が行えるため、C言語の入門書では必ずと言っていいほど登場する。しかしこの関数にはいくつかの問題点が指摘されている。ここではよく指摘される scanf の問題点とその回避方法について宣べる。
改行文字の取り扱い [編集]
入力が文字(char)の場合、主にキーボードで入力の際に押されるリターンキーが無視できないという問題点がある。例えば
char a, b, c;
scanf("%c", &a);
scanf("%c", &b);
scanf("%c", &c);
とした場合、通常なら3回入力待ちが行われることが期待されていると思われるが、実際には2回しか行われない(予期しない入力はここでは考慮しない)。これは最初の a の入力には入力された文字が代入されるが、このときストリーム上に改行コードが残されてしまい、次の bには aを入力する際に押下されたリターンキーの改行コードが代入されるためである。通常の %d や %s の場合改行コードは無視して入力を読み込むので問題にはならないが、 %c の場合は無条件にストリーム上の次のバイトを返すためこのような現象が発生する。これを防ぐには、
scanf("%c", &a);
scanf(" %c", &b);
scanf(" %c", &c);
のように最初に空白を入れることで回避される。
Re:プログラムを打つ早さ
argvとargcは、関数ではなく、そのファイル自体に引数を渡す時に使われるポインタです。
exeファイルをコマンドプロンプト等で呼び出す際に使います。
例:C:\Documents and Settings\Administrator>hogehoge.exe hikisu
この場合*argv[1]に"hikisu"が、argcには引数の個数(今回は1)が入ります。
今回のでは使わなくても大丈夫なので、また気になって眠れなくなったら質問して下さい。
>dicさん
私は情報系の学校には通っていませんが、情報系の友人の課題をよくやっていましたwその時に思ったのですが、学校は本当に基礎的なところだけで、職業として通用するようなプログラミングは教えていないようです。セーフプログラミングなんかもっての外でしたよw
>ISLeさん
>問題を良く読むと入力させるのは文字だけですね。
個数も入力させるのでは?私もトピ主さんに詳しく聞かなければ何とも言えないので多分ですけど、文字数の自動判断はさせないと思います。
読めば読むほど分からなくなってくる・・。というかこれ、個数を引数にする必要はあるのだろうか・・?
exeファイルをコマンドプロンプト等で呼び出す際に使います。
例:C:\Documents and Settings\Administrator>hogehoge.exe hikisu
この場合*argv[1]に"hikisu"が、argcには引数の個数(今回は1)が入ります。
今回のでは使わなくても大丈夫なので、また気になって眠れなくなったら質問して下さい。
>dicさん
私は情報系の学校には通っていませんが、情報系の友人の課題をよくやっていましたwその時に思ったのですが、学校は本当に基礎的なところだけで、職業として通用するようなプログラミングは教えていないようです。セーフプログラミングなんかもっての外でしたよw
>ISLeさん
>問題を良く読むと入力させるのは文字だけですね。
個数も入力させるのでは?私もトピ主さんに詳しく聞かなければ何とも言えないので多分ですけど、文字数の自動判断はさせないと思います。
読めば読むほど分からなくなってくる・・。というかこれ、個数を引数にする必要はあるのだろうか・・?
Re:
#1時間経ったので
No:64072に書いてある通りなら入力するのは文字だけで5回繰り返すということだと思います。
コードの不等号が化けたので修正
No:64072に書いてある通りなら入力するのは文字だけで5回繰り返すということだと思います。
#include <stdio.h> void putchars(char c, size_t n) { while (n-- >0) { putchar(c); } } int main(void) { char c; int i; printf("文字?\n"); scanf("%c", &c); for (i=0;i<5;i++) { putchars(c, i+1); putchar('\n'); } return 0; }という感じ?
コードの不等号が化けたので修正

Re:
既にISLeさんが上げていますが、一応数字を入れるバージョンを私の方で上げておきます。
2回目に葵さんが上げていたプログラムの仕様を参考に作ってあるので、ISLeさんのとどちらにするかは友達等と相談の上で決めて下さいw
2回目に葵さんが上げていたプログラムの仕様を参考に作ってあるので、ISLeさんのとどちらにするかは友達等と相談の上で決めて下さいw
#include <stdio.h> void Put(char c, int n){ for(;n > 0;n--){ putchar(c); } } int main(void){ char c; int n; while(1){ printf("nの入力で終了します。\n文字を1つ、出力したい分の数を入力。例:>>a3 >>"); scanf("%c",&c); //文字取得 if(c == 'n') break; //nで終了 scanf("%d",&n); //入力数取得 Put(c,n); printf("\n\n"); while(getchar() != '\n'); //入力バッファのクリア } while(getchar() != '\n'); puts("終了します。Enterを押して下さい。"); getchar(); }何ループさせるか分からなかったので、とりあえずnを入力するまでエンドレスループな仕様にしておきました。
Re:
>個数も入力するんだと思います。
>実は私もそこが曖昧で…確認する時間がなく今に至ってしまいました。
国語の問題になりますが、私はそんなに曖昧な問題では無いと思います。
仕様としては
(1) 文字と個数を引数として受け取り、受け取った文字を受け取った個数だけ
横に並べて出力するような関数を作成しなさい.
(2) その関数をmainから呼び出して、出力する文字をキーボードから読み取り、
□
□□
□□□
□□□□
□□□□□
(□=読み取った文字)
と出力するようにプログラムしなさい.
でしょ?
文字コードと個数を引数とした文字を個数分出力する関数を利用して
main ではキーボードから読み取った文字コードを1~5個出力する。
としか読めません、私には。
個数、というか行数も入力させると問題から読み取った方は、どのあたりの文章から
そう判断されたのでしょう?
題意が伝わりやすい出題にするには、どう記述すればよかったんでしょうかね今回は。
(私はこれで十分だと思いますが)
>実は私もそこが曖昧で…確認する時間がなく今に至ってしまいました。
国語の問題になりますが、私はそんなに曖昧な問題では無いと思います。
仕様としては
(1) 文字と個数を引数として受け取り、受け取った文字を受け取った個数だけ
横に並べて出力するような関数を作成しなさい.
(2) その関数をmainから呼び出して、出力する文字をキーボードから読み取り、
□
□□
□□□
□□□□
□□□□□
(□=読み取った文字)
と出力するようにプログラムしなさい.
でしょ?
文字コードと個数を引数とした文字を個数分出力する関数を利用して
main ではキーボードから読み取った文字コードを1~5個出力する。
としか読めません、私には。
個数、というか行数も入力させると問題から読み取った方は、どのあたりの文章から
そう判断されたのでしょう?
題意が伝わりやすい出題にするには、どう記述すればよかったんでしょうかね今回は。
(私はこれで十分だと思いますが)