- ベストアンサー
プログラム問題・・・
今僕は、『if else』『while』『for』『switch』『配列(t[])』を知っているのですが、それで何かプログラムを作りたいのですが・・・思いつきません。 それを使ってできるプログラムが載っているサイトを教えてください。 それか、これらを使ってできる問題を言ってくれるだけでもけっこうです(それらだけでですよ!) 回答おねがいします。
- みんなの回答 (17)
- 専門家の回答
質問者が選んだベストアンサー
あぁ、問題2のプログラム確かに違いますね。 長さの違う文字列への入れ替えが目的です。ですから、1文字の一致だけで置き換えしてはいけません。文字列全部が一致する場合のみです。文字列の長さが変わる場合は、文字列全体をずらします。 このプログラムの目的ですが、エディタなどにある文字列の置換の機能を自分で作るってところにあります。 実際には1行分の入れ替えしかできていないので、エディタにするにはまだまだ機能を追加しないとダメですが。 今のところ問題2の問題点は以下の通りです。 ・outstrへの代入が常に何かしらは行われないといけない。 "フフフフ"は、メモリの初期値が残っています。 ・そもそもstr3が出てきていない。 ・outstr[0+k]=str1[i]-32;これが何をするのか意味不明。 ・以下のプログラムだと結果はstr2の長さにしかならない。 i=0; while(str2[i]!='\0') { i++; } outstr[i]='\0' 以上。
その他の回答 (16)
- zwi
- ベストアンサー率56% (730/1282)
問い1.OKです。 だいぶ理解しましたね。 問い2は、添削中ですが、数値を入れてループしているところを、すべて文字列終端までループする形にまず変えてみてください。そうしないと実用度の低いプログラムになってしまいます。 >・・・そうなんですか。けど、一応とっておいても無駄ではないですよね? >zwiさんが言うとおりに、過去問をバリバリ解こうかな。zwiさんは基本情報系の方も分かるのですか? 無駄じゃないですよ。大手だと手当がついたり、いちおう就職でも有利だったりします。実力主義のちいさな会社では無視されますが。 >あぁ残念。zwiさんの後輩なるき満々だったのに(笑 期待しています。
補足
あのぉ、友達が問題を見て『char str2[]={zzy}』が『char str3[]={ZZYY}』となっていますが Yが一つ増えてますよね? str1[]={・・xzzzybc・・}のところで、bからを左にずらすのか、bの上に(Yを)代入するのかどっちなんだい!とのことなんですが。 どうなんでしょう。 というか、また問題の趣旨(?)を僕は理解していませんでした。できれば、これで何ができるか教えてほしい・・・と思うのですが。
- zwi
- ベストアンサー率56% (730/1282)
基本情報技術者ですか? そもそも合格率が15%から20%なので、かなり大変ですが不可能ってことは無いと思います。 学校のクラスの中で合格率トップかなって感じまでは勉強する必要がありますけど。 午前問題は、過去問題集を徹底的にやればほぼ大丈夫です。 午後は、比較的問題が簡単なアセンブラCASL IIを覚えます。それと過去問題を徹底的に。 問題集で常に合格レベルの点が出るようになれば、準備は万端です。 それでも経験が浅いので、来年の春のまで準備したほうが確率は上がると思います。 ただ、就職として考えると「基本情報技術者」合格はプログラマのレベルとしてあまり当てにされてないですね。 自分の後輩として入ってきても、プログラムが出来るやつとは思わないです。実際プログラムできるレベルと関係なかったりしますんで。
お礼
>就職として考えると「基本情報技術者」合格はプログラマのレベルとしてあまり当てにされてないですね。 ・・・そうなんですか。けど、一応とっておいても無駄ではないですよね? zwiさんが言うとおりに、過去問をバリバリ解こうかな。zwiさんは基本情報系の方も分かるのですか? >自分の後輩として入ってきても、プログラムが出来るやつとは思わないです。実際プログラムできるレベルと関係なかったりしますんで。 あぁ残念。zwiさんの後輩なるき満々だったのに(笑
補足
問題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]); } } でどうですか?
- zwi
- ベストアンサー率56% (730/1282)
#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" と表示されます。 以上です。
お礼
問題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]); } で作動させたら何故かフフフフフと笑われてしまうのですが・・・。 どこがいけないのでしょう?
補足
補足ではない話少します・・・すいません。 これは別に回答しなくていいです。 zwiさんは基本情報の国家試験を受けたことがありますか? 質問を投げてなんですけど・・・話を続けます。 僕は、10月頃にあるので受けようかなと思っているのですが・・・ほぼ無知な知識で今から勉強して合格できると思いますか? 無理なら・・・きっぱりと無理といってください。
- zwi
- ベストアンサー率56% (730/1282)
#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]); } } これが理解できたなら次の問題も出します。 問題の前に聞いておかないと。 ・文字列って習ってますか? ・もし習っているなら、文字列の終端はどんなコードか知っていますか? ・後は、ポインタとか構造体などは習ってますか?どちらかでも良いです。
お礼
そうですね・・・バブルソートってソート(降順か昇順に並べること)をする方法のことですよね?学校の友達に聞いたらそういわれた・・・。これも勉強になりました。 『<』がよけいなことに気づかなかった。今度から気をつけたいと思います。 『c[t[i]-'0']++;』 『i』がもし2だったら・・・ 『t[2]』に入っている『'0'』(48)から『'0'』(48)を引きます。48-48=0になるのでその(0)値がC[]のところに添え字となり、『c[0]』に『++』で1カウントされる。 という説明でいいですか? ・文字列は習っています。 ・『\0』又は『NULL』のことですよね? ・習っていません。けど、調べてわかるのであれば、勉強になるのでだしてください。 よろしくお願いします<(_ _)>
補足
この文の補足ではないのですが・・・・ zwiさんが最初に出した問題の『while文』・『switch文』の問題は解けているのですが・・・。 僕の方法はあまりにも単純にできているので、できたらzwiさんの答えを教えてほしいんですけど・・・。 お願いします。
- fatbowler
- ベストアンサー率48% (26/54)
> リテラルって何ですか? 初心者には理解しにくい概念ですね。 「プログラム上に直接書いたデータ(数値や文字、文字列)」のことです。 char a[5] = "abcd"; としたときの、数値 5 や文字列 "abcd" がリテラルです。 これを別の配列にコピーする際は、データとしては同じ文字列"abcd"ですが、それが プログラム上に現れるわけではないのでリテラルとは言いません。 型によって「文字列リテラル」とか「数値リテラル」といった使い方をします。 ちなみにこの「リテラル」という言葉は細かな文法上の話をするとき以外あまり使わないので、 プログラマーとして飯を食ってる人でも知らない人の方が多いと思いますよ。 私の部下はきっと誰も知らないんじゃないかな・・・
お礼
宣言するときに使った、文字・数値がリテラルなんですね?(この解釈の仕方間違ってます?) 『プログラマーとして飯を食っている人でも知らない人のほうが多い』 へぇ~、へぇ~・・・20へぇ。 回答ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
> 『123とか1.23のような数値そのもの』 > ・・・意味が良く分からないです。 ということは、習ってないから使えないということでしょう。 リテラルが使えないと、 int a[10]; といった宣言もできませんよね(10はリテラルなので)。 int x = 123; というのも無理ですね(123がリテラルなので)。 switch (x) { case 1: break; case 2: break; } というのも無理ですよね(1や2はリテラルなので)。 他の方も、いろいろ問題を出してくださっていますが、リテラルが使えないことにはどれも全く歯が立たないと思います。まずは入門書なり教科書なりで、基礎をしっかり固めましょう。
お礼
・・・無理というのは、使えないってことですか? いや、123を宣言したり、switch文とかも使えますよ。 回答ありがとうございました。
- zwi
- ベストアンサー率56% (730/1282)
#2です。 static習ってないですか? とりあえず無視して単なるcharだと思ってください。 charは数値型だと言うのは習ってますでしょうか? ヒントとしては、文字を数字として計算します。あとはちょっとした発想の転換です。今習っている知識でできますよ。
お礼
#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言語楽しい!! あと・・・また、何か例題を出してくれると嬉しいですが・・・。 回答ありがとうございました。
- zwi
- ベストアンサー率56% (730/1282)
問題を出した#2ですが、答えはどうでしょう? 簡単な問題を出したつもりですが、難しかったですか? 状況を答えてもらうと、問題出した私も甲斐があるし、今後の勉強のサポートもできると思うのですが。
お礼
チャレンジしてみたのですが、ifを使わないというのがかなり厳しい・・・。 どうやって、配列の中の文字をどうやって判断するのかが分からないです。 『static char』って関数(?)習っていないんですけど・・・。 僕が今できるといえば、配列に文字列を代入して逆に表示ということぐらいまでしか習っていないんですよ(カウンタを使って)。 ・・・それでも、その知識でできるのですか?
- jacta
- ベストアンサー率26% (845/3158)
> リテラルって何ですか? 123とか1.23のような数値そのものや、'A'のような文字リテラルや、"abc"のような文字列リテラルのことです。 これらも使えないとなると、配列の宣言自体が出来ないと思います。
お礼
『123とか1.23のような数値そのもの』 ・・・意味が良く分からないです。
プログラミングの練習でしたらソートを書いてみたらいかがでしょうか。 「配列に入っている文字列の文字を降順および昇順にならべかえよ。」 どういった順番で作るか分からなければトランプを並べ替えて、手順を考えるとよいと思います。 多分そのうち、ソートも習うと思いますが・・・ ソートといっても「バブルソート、シェルソート、バイナリ(2分樹)ソート」など色々な方法があります。 どのようにしたらプログラムが上手に作れるようになるかというのは、設計に近い内容なので、もっと専門的に詳しく勉強してみたいならば「Cによるらくらく構造化設計國友義久 著 1992年2月20日 CQ出版 ISBN 4-7898-3308-9」(絶版または重版未定なので復刊どっとコムで投票を受け付けています)を図書館で捜して読んでみるよよいと思います。 まぁ、先をあせらず今の課題をじっくりと学習していってください。 毎日の積み重ねがあってこそ日の目を見る日がやってくることでしょう。
お礼
1992年ってけっこう昔ですよね。 けど、それでも紹介するということは、とってもいい本なんですね。 ぜひ、調べてみます。 回答ありがとうございました。
- 1
- 2
お礼
もう見ることもないと思うけど。 すいませんでした。勝手に消えてしまって。 インターネットの調子が悪くて、いつの間にかこの存在も忘れて・・・・いや、問題がいつまでも解けないでもうどうでもいいやと嘆いて放置してしまったのもあります。 よく付き合ってくれたzwiさんありがとうございました。あなたのおかげで得るものがありすぎました。 もし、何かの拍子にこれを見たときは足跡でもつけてください。 何回か期待して見に来ますので。 では、回答ありがとうございました。<(_ _)>