c言語の練習問題(デミリタ)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
stap

c言語の練習問題(デミリタ)

#1

投稿記事 by stap » 10年前

学校でc言語の問題が出されたのですが、答えがわかりません。
答えが分かる方、教えてください。

int型の配列データを
3, 2, 1, 4, 5
のように、データとでの間を", "で区切って表示させることを考える
次の条件下でプログラムを書いてください。

printfは一箇所でしか使用してはならず、if文や条件演算子による条件分岐も行わない。

アバター
usao
記事: 1889
登録日時: 11年前

Re: c言語の練習問題(デミリタ)

#2

投稿記事 by usao » 10年前

課題の丸投げは禁止されています.
とりあえず単純にこう書けば条件は満たせるんじゃないですか?

コード:

printf( "%d, %d, %d, ...(必要な個数だけ)", A[0],A[1],A[2], ...(必要な個数だけ) );

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#3

投稿記事 by softya(ソフト屋) » 10年前

> printfは一箇所でしか使用してはならず、if文や条件演算子による条件分岐も行わない。

丸投げは禁止ですので、とりあえずできる事を考えてみましょう。
この条件下で出来るC言語の命令は何だと思いますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

stap

Re: c言語の練習問題(デミリタ)

#4

投稿記事 by stap » 10年前

usao様、ソフト屋様、返信ありがとうございます。

問題を丸投げにしてしまって申し訳ありません。

この問題を解くに当たって、

#include<stdio.h>
#define NMAX 100 //配列の要素数の最大(仮に100とします)

int main(void)
{
int a[NMAX];
int n,i; //nは入力した個数

//配列への入力は省略

for(i = 0; i<n; i++)
{
printf( i==n-1 ? "%d\n" : "%d, " ,a );
}

return(0);

}

というところまで考えましたが、
結局printf文の所で条件演算子を使用しているため、
この問題の答に至りませんでした。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: c言語の練習問題(デミリタ)

#5

投稿記事 by Tatu » 10年前

文字列操作を練習するための課題ではないんですか?

コード:

//必要なヘッダファイルのインクルード

int main(void){
	//必要な変数の宣言
	//int型の配列に代入
	(データの数だけループ){
		//数値を文字列に変換して出力用の文字列に結合する
		//コンマを結合する
	}
	//最後のコンマを消去して終端文字を入れる

	//完成した文字列を出力する
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#6

投稿記事 by softya(ソフト屋) » 10年前

三項演算子は、「条件演算子による条件分岐」に該当するんでしょうかね。先生に聞いてみたい所ではあります。
そうですね。Tatuさんの方法なら出来ます。
そう言う解き方を習っているかが問題ですけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: c言語の練習問題(デミリタ)

#7

投稿記事 by h2so5 » 10年前

ループ文とbreakを使えばif文と同じですよ。

アバター
usao
記事: 1889
登録日時: 11年前

Re: c言語の練習問題(デミリタ)

#8

投稿記事 by usao » 10年前

>文字列操作を練習するための課題
ではないのだとしたら,例えば

コード:

int a[NMAX];
...
for(i = 0; i<n; i++)
{
  printf( i==n-1 ? "%d\n" : "%d, " ,a[i] );
}
ではなく

コード:

int a[NMAX];
...
char *d[NMAX];
/* ここでd[]の内容を,↓でうまく表示できるようにセットする */

for(i = 0; i<n; i++)
{
  printf( "%d%s" ,a[i], d[i] );
}
のようにしてみるとか.

かずま

Re: c言語の練習問題(デミリタ)

#9

投稿記事 by かずま » 10年前

問題をよく読んでみると、
", " で区切るだけで、最後に "\n" を付けろとは書かれていません。
if 文による条件分岐はだめだが、switch 文や while文や for文などに
よる条件分岐はよいはずです。
C の規格で「条件演算子」と言えば、参考演算子の ?: です。

次の xxxx に、ある 4文字の式を書いたものが私の解答です。

コード:

	for (i = 0; i < n; i++)
		printf("%s%d", ", "+xxxx, a[i]);
xxxx に使っている演算子は、! と * だけです。

かずま

Re: c言語の練習問題(デミリタ)

#10

投稿記事 by かずま » 10年前

かずま さんが書きました:C の規格で「条件演算子」と言えば、参考演算子の ?: です。
訂正
参考演算子 → 三項演算子

stap

Re: c言語の練習問題(デミリタ)

#11

投稿記事 by stap » 10年前

Tatu様、ソフト屋様、usao様、かずま様、
大変有意義な返信ありがとうございます

>>ソフト屋様
三項演算子は条件演算子による条件分岐とみなす、と先生は言っていました。
なので私の解答はどちらにせよ不正解ということになります…

>>usano様
恐らく文字列を扱う為の問題ではないと思います。
正しく伝えられなくて申し訳ありません。
usao様のプログラムを参考にさせていたたきます、ありがとうございます

>>かずま様
そうですね、最後の改行は蛇足でした、申し訳ありません。

stap

Re: c言語の練習問題(デミリタ)

#12

投稿記事 by stap » 10年前

h2so5様、返信ありがとうございます。
そうですね、break文などを使うことも考慮してみます
参考にさせていただきます。

stap

Re: c言語の練習問題(デミリタ)

#13

投稿記事 by stap » 10年前

多くの返信ありがとうございます
皆様のアドバイスを参考にもう少し頑張ってみようと思います。

かずま

Re: c言語の練習問題(デミリタ)

#14

投稿記事 by かずま » 10年前

最後に改行を付けるなら、

コード:

		printf("%d%.2s", a[i], ", \n"+(i+1)/n*2);

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#15

投稿記事 by softya(ソフト屋) » 10年前

改行がなくて良いのなら、usaoさんの方法で%sではなく%cを使って最後に空白を出すと処理がシンプルかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1889
登録日時: 11年前

Re: c言語の練習問題(デミリタ)

#16

投稿記事 by usao » 10年前

>%sではなく%c
そっちの方がシンプルで良いですね.
(課題提出先が 末尾に空白ガー とか言い出すような相手だったら
 fprintf( stdout, ... ) とかを持ち出して応戦しましょうw)

Mana

Re: c言語の練習問題(デミリタ)

#17

投稿記事 by Mana » 10年前

C言語で比較演算子を評価すると真と偽はそれぞれ整数値の1と0。
計算式に使える。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#18

投稿記事 by softya(ソフト屋) » 10年前

Mana さんが書きました:C言語で比較演算子を評価すると真と偽はそれぞれ整数値の1と0。
計算式に使える。
申し訳ないですが、まっとうな方法を知っていた上で、あまり良くない方法として披露する分には良いと思うんですよ。
昔は高速化の技法として意味がありましたが、現代においては歓迎される技とは言えないと思います。
※ 頭の体操としては面白いですし、競技プログラミングでは威力を持つ可能性がありますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Mana

Re: c言語の練習問題(デミリタ)

#19

投稿記事 by Mana » 10年前

邪道なのでトピ主には迷惑かからないだろう。

コード:

for (i=0; i<n; i++) {
    printf("%d%c", a[i], "\n,"[i<n-1]);
}
規格で定義されているまっとうな動作ではあるが。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#20

投稿記事 by softya(ソフト屋) » 10年前

Mana さんが書きました:邪道なのでトピ主には迷惑かからないだろう。

コード:

for (i=0; i<n; i++) {
    printf("%d%c", a[i], "\n,"[i<n-1]);
}
規格で定義されているまっとうな動作ではあるが。
これだと先生が理解できない可能性もありますね。
まぁ、学生が出すには非常にチャレンジャブルなソースコードと言えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: c言語の練習問題(デミリタ)

#21

投稿記事 by かずま » 10年前

printf で "%c" を使っている人がいますが、問題をよく見ると、
"," ではなく、「", "で区切って表示させる」とありますから、
スペースが必要です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#22

投稿記事 by softya(ソフト屋) » 10年前

かずま さんが書きました:printf で "%c" を使っている人がいますが、問題をよく見ると、
"," ではなく、「", "で区切って表示させる」とありますから、
スペースが必要です。
他の回答者をその他大勢のように書かずに、他の人のフォローとして書いたほうが掲示板が円滑に回ると思いますよ。
見逃していたことは失礼しました。お互いに上手くコミュニケーションしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: c言語の練習問題(デミリタ)

#23

投稿記事 by かずま » 10年前

softya(ソフト屋) さんが書きました: 他の回答者をその他大勢のように書かずに、他の人のフォローとして書いたほうが掲示板が円滑に回ると思いますよ。
見逃していたことは失礼しました。お互いに上手くコミュニケーションしましょう。
No.15 で softya さんが "%c" を提案し、No.16 で usao さんが同意し、
No.19 で Mana さんが実際にコードを書きました。
3人の発言を引用するのが面倒なので、あのように書きました。
どのようにフォローすればよいのでしょうか?

Mana

Re: c言語の練習問題(デミリタ)

#24

投稿記事 by Mana » 10年前

ではこれで。

コード:

const char *delim[] = { "\n", ", " };
for (i=0; i<n; i++) {
    printf("%d%s", a[i], delim[i<n-1]);
}

Mana

Re: c言語の練習問題(デミリタ)

#25

投稿記事 by Mana » 10年前

これもありか。

コード:

const char *format[] = { "%d\n", "%d, " };
for (i=0; i<n; i++) {
    printf(format[i<n-1], a[i]);
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#26

投稿記事 by softya(ソフト屋) » 10年前

ようは書き方の問題です。

> printf で "%c" を使っている人がいますが

これだと角が立ちます。お前ら間違っているぞ!と言っている印象に私は感じます。他にも感じる人がいるかもしれません。

> 問題をよく見ると、"," ではなく、「", "で区切って表示させる」とありますから、スペースが必要ですね。
> なので、%cの後にスペースが必要かと思います。

となれば全然問題ありません。さりげないフォローになっていると思います。
目くじらを立てるべき問題でもないので、さり気なくフォローして頂ければ幸いです。

【補足】
あっ、いつの間にかManaさんが改訂版を。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#27

投稿記事 by softya(ソフト屋) » 10年前

あるいは、こんな書き方でもよいでしょう。
No.15 で softya さんが "%c" を提案し、No.16 で usao さんが同意し、No.19 で Mana さんが実際にコードを書かれましたが、問題をよく見ると、"," ではなく、「", "で区切って表示させる」とありますから、スペースが必要でだと思います。
"%d%c "とすべきではないでしょうか。
面倒だとは思いますが、ここでコミュニケーションを放棄したら掲示板の意義がなくなりますのでよろしくお願いします。
ここの掲示板が目指すは「アットホームで温かい」です!
回答者同士がコミュニケーションとれていないと、とてもそうなりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: c言語の練習問題(デミリタ)

#28

投稿記事 by かずま » 10年前

softya(ソフト屋) さんが書きました:ようは書き方の問題です。

> printf で "%c" を使っている人がいますが

これだと角が立ちます。お前ら間違っているぞ!と言っている印象に私は感じます。他にも感じる人がいるかもしれません。
具体的に名指ししたほうが「お前は間違っているぞ!」という
印象を与えると思って、それを和らげるために名指しせずに、
「printf で "%c" を使っている人が」とぼかして書いたつもり
なんですが、曲解されるもんなんですね。
usaoさんや、manaさんもそのように感じられたのでしょうか?

アバター
usao
記事: 1889
登録日時: 11年前

Re: c言語の練習問題(デミリタ)

#29

投稿記事 by usao » 10年前

まず,%c云々の件については,
>usaoさんの方法で%sではなく%cを使って最後に空白を出すと処理がシンプルかもしれません
という文章を,その時点で既に
"%d%c " ←%cの次に空白あり
という意味で受け取っています.(…ので私のNo16の受け答えがあのようになる)
以上,「私はそこは間違ってないつもりです」という自己弁護.


>usaoさんや、manaさんもそのように感じられたのでしょうか?
文章の受け取り方側の話については,
「その書き方はこう見える」みたいな私見を申し上げるのは避けさせていただきたく…
オフトピック
個人的希望(?)を述べさせていただくならば,
私の書いた内容について何かしらご指摘いただける際には
問題とする箇所を引用されるなり,書き込みNo(これ,こうやって書いてる際には確認できないのが不便ですね)
などを明示して頂けた方がわかりやすくて助かります.
この掲示板を使っていて 一番得るものがある場面 というのは
自分が書いたことが間違ってるということが判明したとき だと思っていますので,むしろ名指し大歓迎です.
(ダメなところは完膚なきまでに論破願いますw)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: c言語の練習問題(デミリタ)

#30

投稿記事 by softya(ソフト屋) » 10年前

色々な受け取り方がありますので、私はこう思ったと言うことです。
これをきっかけに他の人とに関わりを考えて頂けたらなと思って書き込ませていただきました。
いつも淡々と答えを貼られるだけなので、他の人とも関わってほしいなと思っております。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る