こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラム問題・・・

今僕は、『if else』『while』『for』『switch』『配列(t[])』を知っているのですが、それで何かプログラムを作りたいのですが・・・思いつきません。
それを使ってできるプログラムが載っているサイトを教えてください。

それか、これらを使ってできる問題を言ってくれるだけでもけっこうです(それらだけでですよ!)

回答おねがいします。

投稿日時 - 2007-07-11 23:47:32

QNo.3159882

困ってます

質問者が選んだベストアンサー

あぁ、問題2のプログラム確かに違いますね。
長さの違う文字列への入れ替えが目的です。ですから、1文字の一致だけで置き換えしてはいけません。文字列全部が一致する場合のみです。文字列の長さが変わる場合は、文字列全体をずらします。

このプログラムの目的ですが、エディタなどにある文字列の置換の機能を自分で作るってところにあります。
実際には1行分の入れ替えしかできていないので、エディタにするにはまだまだ機能を追加しないとダメですが。

今のところ問題2の問題点は以下の通りです。
・outstrへの代入が常に何かしらは行われないといけない。
"フフフフ"は、メモリの初期値が残っています。
・そもそもstr3が出てきていない。
・outstr[0+k]=str1[i]-32;これが何をするのか意味不明。
・以下のプログラムだと結果はstr2の長さにしかならない。
i=0;
while(str2[i]!='\0')
{
i++;
}
outstr[i]='\0'

以上。

投稿日時 - 2007-07-26 14:14:52

お礼

もう見ることもないと思うけど。

すいませんでした。勝手に消えてしまって。

インターネットの調子が悪くて、いつの間にかこの存在も忘れて・・・・いや、問題がいつまでも解けないでもうどうでもいいやと嘆いて放置してしまったのもあります。

よく付き合ってくれたzwiさんありがとうございました。あなたのおかげで得るものがありすぎました。

もし、何かの拍子にこれを見たときは足跡でもつけてください。
何回か期待して見に来ますので。

では、回答ありがとうございました。<(_ _)>

投稿日時 - 2007-10-25 03:18:43

ANo.17

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(17)

ANo.16

zwi

問い1.OKです。
だいぶ理解しましたね。
問い2は、添削中ですが、数値を入れてループしているところを、すべて文字列終端までループする形にまず変えてみてください。そうしないと実用度の低いプログラムになってしまいます。

>・・・そうなんですか。けど、一応とっておいても無駄ではないですよね?
>zwiさんが言うとおりに、過去問をバリバリ解こうかな。zwiさんは基本情報系の方も分かるのですか?

無駄じゃないですよ。大手だと手当がついたり、いちおう就職でも有利だったりします。実力主義のちいさな会社では無視されますが。

>あぁ残念。zwiさんの後輩なるき満々だったのに(笑
期待しています。

投稿日時 - 2007-07-26 12:37:51

補足

あのぉ、友達が問題を見て『char str2[]={zzy}』が『char str3[]={ZZYY}』となっていますが Yが一つ増えてますよね?
str1[]={・・xzzzybc・・}のところで、bからを左にずらすのか、bの上に(Yを)代入するのかどっちなんだい!とのことなんですが。

どうなんでしょう。

というか、また問題の趣旨(?)を僕は理解していませんでした。できれば、これで何ができるか教えてほしい・・・と思うのですが。

投稿日時 - 2007-07-26 13:15:40

ANo.15

zwi

基本情報技術者ですか?
そもそも合格率が15%から20%なので、かなり大変ですが不可能ってことは無いと思います。
学校のクラスの中で合格率トップかなって感じまでは勉強する必要がありますけど。
午前問題は、過去問題集を徹底的にやればほぼ大丈夫です。
午後は、比較的問題が簡単なアセンブラCASL IIを覚えます。それと過去問題を徹底的に。
問題集で常に合格レベルの点が出るようになれば、準備は万端です。
それでも経験が浅いので、来年の春のまで準備したほうが確率は上がると思います。

ただ、就職として考えると「基本情報技術者」合格はプログラマのレベルとしてあまり当てにされてないですね。
自分の後輩として入ってきても、プログラムが出来るやつとは思わないです。実際プログラムできるレベルと関係なかったりしますんで。

投稿日時 - 2007-07-26 09:40:54

補足

問題1.できました。
#include <stdio.h>
void main()
{
char t[10]={'0','4','a','B','1','5','0','1','0','7'},i;
int c[10];

for(i=0;i<10;i++)
{
c[i]=0;
}

for(i=0;i<10;i++)
{
if(t[i]>='0'&&t[i]<='9')
{
c[t[i]-'0']++;
}
}

for(i=0;i<10;i++)
{
printf("t[%d]=%d\n",i,c[i]);
}
}
でどうですか?

投稿日時 - 2007-07-26 11:50:55

お礼

>就職として考えると「基本情報技術者」合格はプログラマのレベルとしてあまり当てにされてないですね。

・・・そうなんですか。けど、一応とっておいても無駄ではないですよね?
zwiさんが言うとおりに、過去問をバリバリ解こうかな。zwiさんは基本情報系の方も分かるのですか?


>自分の後輩として入ってきても、プログラムが出来るやつとは思わないです。実際プログラムできるレベルと関係なかったりしますんで。

あぁ残念。zwiさんの後輩なるき満々だったのに(笑

投稿日時 - 2007-07-26 11:58:58

ANo.14

zwi

#2です。
こちらの都合で返事が遅くなりました。
申し訳ない。

>zwiさんが最初に出した問題の『while文』・『switch文』の問題は解けているのですが・・・。
>僕の方法はあまりにも単純にできているので、できたらzwiさんの答えを教えてほしいんですけど・・・。
この問題は簡単に出来る答えで良いんです。そのまま記入してください。
とりあえず力量を見るために出した問題ですから。
学校の問題のように変に捻ってあったり、妙に難しかくて実用度の低い問題を出す気はまったくありません。

>『c[t[i]-'0']++;』
>『i』がもし2だったら・・・
> 『t[2]』に入っている『'0'』(48)から『'0'』(48)を引きます。48-48=0になるのでその(0)値がC[]のところに添え字となり、『c[0]』に『++』で1カウントされる。
>という説明でいいですか?
正解です!
文字コードの事とプログラムをシンプルに記述できることを理解してほしかった問題ですので。

では、新問題です。

その1.前の問題で、'0'から'9'以外の文字が配列に格納されていると集計処理で問題があります。
char t[10]={'0','4','a','B','1','5','0','1','0','7'};
という配列があった場合に、正しく'0'から'9'までを集計するようにコードを修正してください。if文は使用します。なるべくシンプルな記述を目指してください。

その2.文字列を配列アクセスで加工する問題になります。
char str1[]="1203xzzzybc1zz2axvhzzynyn";
char str2[]="zzy";
char str3[]="ZZYY";
char outstr[100];
str1を加工してoutstrに格納します。
加工はstr1中にstr2の文字列を見つけたらstr3の文字列に置き換えてください。str2が複数見つかる場合はすべて置き換えます。strcpyなどの文字列処理ライブラリは一切使用禁止です。if,for,whileなどC言語の機能をフル活用してください。

実行するとこうなるという例は、こんな感じです。
char str1[]="12ab12";
char str2[]="ab";
char str3[]="AB";
char outstr[100];
がはじめの状態です。
で問題2のプログラムを実行して最後にprintf("outstr=\"%s\"\n", outstr);を実行すると。
outstr="12AB12"
と表示されます。

以上です。

投稿日時 - 2007-07-25 14:39:18

補足

補足ではない話少します・・・すいません。
これは別に回答しなくていいです。

zwiさんは基本情報の国家試験を受けたことがありますか?

質問を投げてなんですけど・・・話を続けます。
僕は、10月頃にあるので受けようかなと思っているのですが・・・ほぼ無知な知識で今から勉強して合格できると思いますか?
無理なら・・・きっぱりと無理といってください。

投稿日時 - 2007-07-26 00:46:50

お礼

問題2.の途中経過・・・(まだ、数字を代入できていません)
#include <stdio.h>
void main()
{
char str1[]={'z','5','m','8','w','9','0','7','i','z'};
char str2[]={'z','w','i'};
char str3[]={'Z','W','I'};
char outstr[100];
int i,k;

for(i=0;i<10;i++)
{
for(k=0;k<3;k++)
{
if(str1[i]==str2[k])
{
outstr[0+k]=str1[i]-32;
}
}
}

i=0;
while(str2[i]!='\0')
{
i++;
}
outstr[i]='\0';

printf("%s",&outstr[0]);
}
で作動させたら何故かフフフフフと笑われてしまうのですが・・・。
どこがいけないのでしょう?

投稿日時 - 2007-07-26 11:48:35

ANo.13

zwi

#2です。
お疲れ様でした。
良い勉強になりました?

結果は・・・。おしい、一箇所間違っています。
それとwhile文を強引にif文代わりに使っているので減点です。
>あと、バブルソート(たしか)っていうんですよね・・・こういう文。いい復習にもなりました。
これは単なる集計でバブルソートとは違います。バブルソートは実際に作ってみないと実感できないかも。

間違いは、for(i=0;i<=10;i++)の<=10だと添え字外なのでNGです。10個の配列の添え字は0~9です。
配列外に書き込んでいる可能性が高いので、異常終了する危険が高い状況でした。たまたま動いているみたいですが。

そして、whileを使わないシンプルな書き方の答えが以下の通りです。
こんなにシンプルに書けるんですよ。

#include <stdio.h>
void main()
{
char e,t[10]={'0','4','0','0','1','5','0','9','0','7'};
int c[10],i,k;

for(i=0;i<10;i++)
{
c[i]=0;
}


for(i=0;i<10;i++)
{
c[t[i]-'0'] ++;
}

for(i=0;i<10;i++)
{
printf("t[%d]=%d\n",i,c[i]);
}

}
これが理解できたなら次の問題も出します。
問題の前に聞いておかないと。
・文字列って習ってますか?
・もし習っているなら、文字列の終端はどんなコードか知っていますか?
・後は、ポインタとか構造体などは習ってますか?どちらかでも良いです。

投稿日時 - 2007-07-18 23:47:27

補足

この文の補足ではないのですが・・・・

zwiさんが最初に出した問題の『while文』・『switch文』の問題は解けているのですが・・・。

僕の方法はあまりにも単純にできているので、できたらzwiさんの答えを教えてほしいんですけど・・・。

お願いします。

投稿日時 - 2007-07-20 22:27:08

お礼

そうですね・・・バブルソートってソート(降順か昇順に並べること)をする方法のことですよね?学校の友達に聞いたらそういわれた・・・。これも勉強になりました。

『<』がよけいなことに気づかなかった。今度から気をつけたいと思います。

『c[t[i]-'0']++;』
『i』がもし2だったら・・・
 『t[2]』に入っている『'0'』(48)から『'0'』(48)を引きます。48-48=0になるのでその(0)値がC[]のところに添え字となり、『c[0]』に『++』で1カウントされる。
という説明でいいですか?

・文字列は習っています。
・『\0』又は『NULL』のことですよね?
・習っていません。けど、調べてわかるのであれば、勉強になるのでだしてください。

よろしくお願いします<(_ _)> 

投稿日時 - 2007-07-20 22:24:37

ANo.12

> リテラルって何ですか?

初心者には理解しにくい概念ですね。
「プログラム上に直接書いたデータ(数値や文字、文字列)」のことです。

char a[5] = "abcd";

としたときの、数値 5 や文字列 "abcd" がリテラルです。
これを別の配列にコピーする際は、データとしては同じ文字列"abcd"ですが、それが
プログラム上に現れるわけではないのでリテラルとは言いません。
型によって「文字列リテラル」とか「数値リテラル」といった使い方をします。

ちなみにこの「リテラル」という言葉は細かな文法上の話をするとき以外あまり使わないので、
プログラマーとして飯を食ってる人でも知らない人の方が多いと思いますよ。
私の部下はきっと誰も知らないんじゃないかな・・・

投稿日時 - 2007-07-15 01:34:39

お礼

宣言するときに使った、文字・数値がリテラルなんですね?(この解釈の仕方間違ってます?)

『プログラマーとして飯を食っている人でも知らない人のほうが多い』
へぇ~、へぇ~・・・20へぇ。

回答ありがとうございました。

投稿日時 - 2007-07-15 05:37:37

ANo.11

> 『123とか1.23のような数値そのもの』
> ・・・意味が良く分からないです。

ということは、習ってないから使えないということでしょう。
リテラルが使えないと、

int a[10];

といった宣言もできませんよね(10はリテラルなので)。

int x = 123;

というのも無理ですね(123がリテラルなので)。

switch (x)
{
case 1:
 break;
case 2:
 break;
}

というのも無理ですよね(1や2はリテラルなので)。

他の方も、いろいろ問題を出してくださっていますが、リテラルが使えないことにはどれも全く歯が立たないと思います。まずは入門書なり教科書なりで、基礎をしっかり固めましょう。

投稿日時 - 2007-07-15 00:35:04

お礼

・・・無理というのは、使えないってことですか?

いや、123を宣言したり、switch文とかも使えますよ。

回答ありがとうございました。

投稿日時 - 2007-07-15 05:47:32

ANo.10

zwi

#2です。
static習ってないですか?
とりあえず無視して単なるcharだと思ってください。

charは数値型だと言うのは習ってますでしょうか?
ヒントとしては、文字を数字として計算します。あとはちょっとした発想の転換です。今習っている知識でできますよ。

投稿日時 - 2007-07-15 00:05:27

お礼

#include <stdio.h>
void main()
{
char e,t[10]={'0','4','0','0','1','5','0','9','0','7'};
int c[10],i,k;

for(i=0;i<10;i++)
{
c[i]=0;
}

for(i=0;i<=10;i++)
{
for(k=0;k<=9;k++)
{
e=48+i;
while(t[k]==e)
{
c[i]=c[i]+1;
e=150;   
}
}
}

for(i=0;i<10;i++)
{
printf("t[%d]=%d\n",i,c[i]);
}

}

これでどうでしょうか!
最初のc[i]をforでまわしているのは初期化です。
e=150;のところはWhile文から無理やりはずすためにいれました。
この例題のおかげで文字と数字の関係を覚えました。教えてもらったサイトわかりやすかったです^皿^)b
あと、バブルソート(たしか)っていうんですよね・・・こういう文。いい復習にもなりました。

だいぶ考えました(ない頭使って)
やっぱC言語楽しい!!

あと・・・また、何か例題を出してくれると嬉しいですが・・・。

回答ありがとうございました。

投稿日時 - 2007-07-18 22:21:09

ANo.9

zwi

問題を出した#2ですが、答えはどうでしょう?
簡単な問題を出したつもりですが、難しかったですか?
状況を答えてもらうと、問題出した私も甲斐があるし、今後の勉強のサポートもできると思うのですが。

投稿日時 - 2007-07-13 14:35:08

お礼

チャレンジしてみたのですが、ifを使わないというのがかなり厳しい・・・。
どうやって、配列の中の文字をどうやって判断するのかが分からないです。
『static char』って関数(?)習っていないんですけど・・・。
僕が今できるといえば、配列に文字列を代入して逆に表示ということぐらいまでしか習っていないんですよ(カウンタを使って)。

・・・それでも、その知識でできるのですか?

投稿日時 - 2007-07-14 22:25:57

ANo.8

> リテラルって何ですか?

123とか1.23のような数値そのものや、'A'のような文字リテラルや、"abc"のような文字列リテラルのことです。
これらも使えないとなると、配列の宣言自体が出来ないと思います。

投稿日時 - 2007-07-12 11:23:17

お礼

『123とか1.23のような数値そのもの』
・・・意味が良く分からないです。

投稿日時 - 2007-07-14 22:38:13

プログラミングの練習でしたらソートを書いてみたらいかがでしょうか。

「配列に入っている文字列の文字を降順および昇順にならべかえよ。」

どういった順番で作るか分からなければトランプを並べ替えて、手順を考えるとよいと思います。

多分そのうち、ソートも習うと思いますが・・・
ソートといっても「バブルソート、シェルソート、バイナリ(2分樹)ソート」など色々な方法があります。

どのようにしたらプログラムが上手に作れるようになるかというのは、設計に近い内容なので、もっと専門的に詳しく勉強してみたいならば「Cによるらくらく構造化設計國友義久 著 1992年2月20日 CQ出版 ISBN 4-7898-3308-9」(絶版または重版未定なので復刊どっとコムで投票を受け付けています)を図書館で捜して読んでみるよよいと思います。

まぁ、先をあせらず今の課題をじっくりと学習していってください。
毎日の積み重ねがあってこそ日の目を見る日がやってくることでしょう。

投稿日時 - 2007-07-12 02:26:47

お礼

1992年ってけっこう昔ですよね。
けど、それでも紹介するということは、とってもいい本なんですね。
ぜひ、調べてみます。

回答ありがとうございました。

投稿日時 - 2007-07-14 22:55:25

ANo.6

> それらだけでですよ!

main関数は作れるとしても、配列以外の変数も、演算子も、標準関数も一切使えないのですよね。int型とリテラルは使えるのでしょうか?

むしろ、
「if文、while文、for文、switch文、および配列だけで、コンパイル、実行&終了可能なプログラムを書け。プログラムが何らかの役に立つかどうかは問わない」
という問題でも結構難度が高いと思います。

投稿日時 - 2007-07-12 01:15:29

お礼

リテラルって何ですか?

いや何か問題とかないだろうかと思ったんですが・・・。それだけじゃ難しいんですね。
じゃあ、もっと覚えてからリベンジします。

回答ありがとうございました。

投稿日時 - 2007-07-12 06:57:49

ANo.5

zwi

あっ、分かりづらかったですか。
じゃあ、ちょっと変えて、
static char moji[13] = {
'0','2','1','0','3','1','0','4','0','9','4','0','2','3' };
int count[10];
の配列を用意してもらって。
moji配列中に'0'~'9'の文字の各々登場する回数をカウントしてcount配列に格納してください。'0'が5回とかカウントします。
ルール。
・charは習ってますよね?
・if文とswitch文は使用禁止です。
・for文かwhile文は使用可能。
以上です。

投稿日時 - 2007-07-12 00:43:13

ANo.4

No.1です。

プログラムには、ランダム関数という乱数(バラバラ数)を
導き出す関数があります。
それを使わないと、数字がばらばらに出ないので、ロト6を
占うには面白さが欠けます。
(RPGゲームの「何ポイントのダメージ!」とかはランダム
 関数です。)

よって、ランダム関数を利用するわけですが。
関数を書くと判りますが、コンピュータのランダム関数は、
毎回バラバラなりに同じ数字が返ってきます。
例えば、1回目に、「1,26,43,15,24,11」と返ってきたとき、
そのソフトを終了し再度実行するとまったく同じ「1,26,43,15,24,11」
という文字列が返ってきてしまいます。

そこで、現在の時刻、例えば「2007/07/12 0:25:43」のような
常に変わりゆく数字を利用し、上記のランダム関数に味付けとして
加えてやると、同じ数字が二度と出ません。
例えば、簡単な例では秒数を44で割った余りを足すだけでも
「1,26,43,15,24,11」それぞれに+幾つを足すのでバラけて見えます。
そういう意味で、日時を利用すると面白い数字が返ってくると
いうわけです。

なお、例に書いてあるように、数字の順番はバラバラで取れる
はずです。
ただ、ロト6を買うには1からの順番が書きやすいですよね?
ということは結果を並び変えたいですよね?
という意味で、1から43は配列を利用。
ゆとりがあれば、ソート関数で並び変えられるようにするわけです。

そのほか。
複雑なものになると、
・トランプのポーカー役、麻雀役
・自販機の釣銭計算
・曜日計算、週計算、時間計算
…ふと思いつくだけでも仰る構文を利用するアルゴリズムは
超大量にあります。
普段何気ないものでも結構難しいものですよ。
お試しください。

投稿日時 - 2007-07-12 00:36:03

お礼

このプログラムは乱数を覚えないと組めませんよね・・・。というわけで、乱数を理解して、このプログラムを組んでみます。

回答ありがとうございました。

投稿日時 - 2007-07-12 01:07:26

ANo.3

> ”0103405067020”で登場する数字の数とはいったいどういうことなのでしょう?
コレは 0がいくつ 1がいくつ といった具合にこの文字列中の数字の種類を数えてくださいといった趣旨だと思います

投稿日時 - 2007-07-12 00:32:12

お礼

あぁ、そうか!

そういう風に問題を理解できるようになりたい(頑

回答ありがとうございました。

投稿日時 - 2007-07-12 00:35:39

ANo.2

zwi

えーと、じゃあ問題を。
『if else』の問題。
変数aが1なら変数bを3に、変数aが2なら変数bを1にしてください。

『while』の問題。
入力された数値が、1~5以外だったら警告して、もう一度入力させるプログラムを作ってください。

『for』の問題。
1,3,5,7,9,11,・・・・変数nまでの数列をforを使って足してください。

『switch』の問題。
変数aが1,4,8,9なら変数bを2に、変数aが2,3,7なら変数bを1にしてください。それ以外は変数bを0にしてください。種類を分類します。

『配列(t[])』の問題。
文字列"0103405067020"でそれぞれ登場する数字の数を数えなさい。

投稿日時 - 2007-07-12 00:05:01

補足

すいません。

配列の問題なんですが・・・

”0103405067020”で登場する数字の数とはいったいどういうことなのでしょう?

投稿日時 - 2007-07-12 00:19:30

ANo.1

分岐とループと配列を使いたいということであれば。

ロト6のあたりを占うソフトでも作れば如何でしょうか(笑)
1~43の数字を配列に入れ。
6個決まるまでループ。
時間の概念+ランダムでチョイスし、重複した数字をチョイスした
場合は再取得をします。

ソフトができれば、その番号のクジを買ってみて。
当たったら儲けもんですよね。(笑)

投稿日時 - 2007-07-11 23:51:16

補足

すいません。
時間の概念ってどういう意味ですか?
ランダムは習っていないのですが・・・。

投稿日時 - 2007-07-12 00:08:56

あなたにオススメの質問