ページ 1 / 1
C言語 関数を使う課題
Posted: 2010年10月25日(月) 13:56
by 葵
「文字と個数を引数として受け取り、受け取った文字を受け取った個数だけ横に並べて
出力するような関数を作成しなさい.
その関数をmainから呼び出して、出力する文字をキーボードから読み取り、
□
□□
□□□
□□□□
□□□□□
(□=読み取った文字)
と出力するようにプログラムしなさい.」
という課題です。
申し訳ありませんが、明日の朝が提出期限なので
具体的に誤りを教えていただきたいです。
また、現在手持ちのPCでコンパイルができなく、
どこが間違っているのかわからない状態です。すいません;;
よろしくお願いします。
Re:C言語 関数を使う課題
Posted: 2010年10月25日(月) 16:56
by さかまき
仕様を間違えている様な気がします。
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言語 関数を使う課題
Posted: 2010年10月25日(月) 17:58
by 葵
コンパイルできるようになりました。
エラーはでないのですが、
#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言語 関数を使う課題
Posted: 2010年10月25日(月) 18:11
by ISLe
なぜsyuturyokuの中でプロンプト(入力要求)を出しているのでしょう?
問題を読むと大筋は
1) main関数で、出力する文字と個数を入力させる
2) main関数で、1個から開始して、要求された個数までsyuturyoku関数を繰り返し呼び出す
という形になると思いますけど。
Re:
Posted: 2010年10月25日(月) 19:25
by ゆーずぃ
main関数の中で宣言してるchar b;の無意味さが気になる…。
ISleさんの言うように、仕様としてはscanfを使う必要はないわけですから(柔軟に対応できなくても毎回同じ動作でOK)、それを取っ払えばエライ簡単になると思いますよ~。
Re:
Posted: 2010年10月25日(月) 21:14
by ゆーずぃ
失礼、
>出力する文字をキーボードから読み取り、
とありましたね;
ISLeさんのはscanfではなく、恐らくargvとargcのことでしょうか;勘違いしてお恥ずかしいw
明日までの課題ということで、必要であれば解答を書きます。まぁなるべくなら自分の力で頑張って下さい。
Re:
Posted: 2010年10月25日(月) 21:38
by 葵
すいません、
argvとargcとはどのようなものなのでしょうか
調べてみたのですがわかりません;;
あと1時間やってみます
それでもできなかった時は回答をお願いします;
Re:
Posted: 2010年10月25日(月) 22:00
by dic
これは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);
のように最初に空白を入れることで回避される。
Re:
Posted: 2010年10月25日(月) 22:00
by ISLe
scanfで良いと思いますけど、入力を受けるのはmain関数の直下であるべきかと。
問題を良く読むと入力させるのは文字だけですね。
他の情報に引っ張られて分からなくなってます。
Re:
Posted: 2010年10月25日(月) 22:19
by ISLe
>dicさん
入力を5回繰り返しているのは問題解釈の誤りで実際には1回で良いのです。
scanfの改行コードの問題は関係ありません。
#あと転載と引用の違いに気を付けたほうが良いと思います。
Re:プログラムを打つ早さ
Posted: 2010年10月25日(月) 22:43
by ゆーずぃ
argvとargcは、関数ではなく、そのファイル自体に引数を渡す時に使われるポインタです。
exeファイルをコマンドプロンプト等で呼び出す際に使います。
例:C:\Documents and Settings\Administrator>hogehoge.exe hikisu
この場合*argv[1]に"hikisu"が、argcには引数の個数(今回は1)が入ります。
今回のでは使わなくても大丈夫なので、また気になって眠れなくなったら質問して下さい。
>dicさん
私は情報系の学校には通っていませんが、情報系の友人の課題をよくやっていましたwその時に思ったのですが、学校は本当に基礎的なところだけで、職業として通用するようなプログラミングは教えていないようです。セーフプログラミングなんかもっての外でしたよw
>ISLeさん
>問題を良く読むと入力させるのは文字だけですね。
個数も入力させるのでは?私もトピ主さんに詳しく聞かなければ何とも言えないので多分ですけど、文字数の自動判断はさせないと思います。
読めば読むほど分からなくなってくる・・。というかこれ、個数を引数にする必要はあるのだろうか・・?
Re:
Posted: 2010年10月25日(月) 22:47
by ISLe
#1時間経ったので
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:
Posted: 2010年10月25日(月) 22:57
by 葵
>ゆーずぃさん
>個数も入力させるのでは?
個数も入力するんだと思います。
実は私もそこが曖昧で…確認する時間がなく今に至ってしまいました。
課題の問題をそのまま貼ったのですが…分かりにくいでしょうか
やってみましたが分かりません…解答をお願いします。。
Re:
Posted: 2010年10月25日(月) 23:19
by ゆーずぃ
既にISLeさんが上げていますが、一応数字を入れるバージョンを私の方で上げておきます。
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:
Posted: 2010年10月25日(月) 23:31
by 葵
>ISLeさん、ゆーずぃさん
ありがとうございますm(_ _)m
関数の仕組みがまだ分かりきれてなくて…勉強します。
問題の分かりにくい部分も解決しておくべきでした。
さかまきさん、dicさんもありがとうございました!
Re:
Posted: 2010年10月26日(火) 09:24
by さかまき
>個数も入力するんだと思います。
>実は私もそこが曖昧で…確認する時間がなく今に至ってしまいました。
国語の問題になりますが、私はそんなに曖昧な問題では無いと思います。
仕様としては
(1) 文字と個数を引数として受け取り、受け取った文字を受け取った個数だけ
横に並べて出力するような関数を作成しなさい.
(2) その関数をmainから呼び出して、出力する文字をキーボードから読み取り、
□
□□
□□□
□□□□
□□□□□
(□=読み取った文字)
と出力するようにプログラムしなさい.
でしょ?
文字コードと個数を引数とした文字を個数分出力する関数を利用して
main ではキーボードから読み取った文字コードを1~5個出力する。
としか読めません、私には。
個数、というか行数も入力させると問題から読み取った方は、どのあたりの文章から
そう判断されたのでしょう?
題意が伝わりやすい出題にするには、どう記述すればよかったんでしょうかね今回は。
(私はこれで十分だと思いますが)