おまいら!今日からC言語を学んでいくぞー!パート2
728 :
デフォルトの名無しさん :
2005/11/10(木) 23:33:00 <HTML><HEAD><TITLE>例8</TITLE></HEAD> <BODY> <FORM NAME="TEST"> 調べたい数= <INPUT TYPE="TEXT"NAME="NYURYOKU"onChange= "x=TEST.NYURYOKU.value; TEST.KEKKA.value=Math.sqrt(x);"> <HR> あなたが入力した数の平方根は <INPUT TYPE="TEXT"NAME="KEKKA"> です。 </FORM> </BODY></HTML> と、 <HTML><HEAD><TITLE>例8</TITLE></HEAD> <BODY> <SCRIPT language="javascript"> x=5; y=1; s=0; while(y<=x){ s=s+y; y=y+1; } alert("1から"+x+"までの合計は"+s+"です。"); </SCRIPT> </BODY></HTML> を組み合わせて、1からユーザーの入力した数までの合計値を求めて表示する javascriptを作ってください!
>>728 <HTML><HEAD><TITLE>例8</TITLE></HEAD>
<BODY>
<FORM NAME="TEST">
調べたい数=
<INPUT TYPE="TEXT"NAME="NYURYOKU"onChange=
"x=eval(TEST.NYURYOKU.value);
TEST.KEKKA.value=x*(x+1)/2;">
<HR>
あなたが入力した数の合計は
<INPUT TYPE="TEXT"NAME="KEKKA">
です。
</FORM>
</BODY></HTML>
>>727 >>716 ではないが、俺も4月から始めたばかりの初心者だ。(しかも、バリバリの文系。数学は数2Bまでしかやってない)
夏までは『Cの絵本』と大学の講義で基礎部分を学んだ。今は『猫でもわかる〜』を使って独学している。
今日は『Cの絵本』だと今一つぴんとこなかったポインタの基礎を、やっと理解できた。
まだまだ先は長いが、お互い頑張ろう。
>>697 っ[Intel C++][xmmintrin.h]
学校の数学ってそんなに大切なの? C言語覚えるのと同じでやりながら必要なもの覚えればいいんじゃない?
やりながら覚えるっていうのは仕事に追われた場末のマが自虐的に言う台詞だぞ あまり真剣に受け止めるな
>>727 線形代数って名前でもメインは行列とベクトルだけどな
数Cの教科書で基礎、線形代数のでその他をやるが吉
アルゴリズム考えるときに結構応用が利く
737 :
デフォルトの名無しさん :2005/11/11(金) 02:09:44
>>730 スレ違いの中、本当にありがとうございました(/_;)
助かりました!
738 :
デフォルトの名無しさん :2005/11/11(金) 02:52:37
935 名前: デフォルトの名無しさん [sage] 投稿日: 2005/11/06(日) 15:25:10 このsageない基地外なんか過去から全部同じ椰子じゃないかとまで思ってしまう。 (ネタがつまらんのが致命的にキモイ)
こんにちは。
>>731 こちらこそ(_ ´∀`)_
朝方、WIKIと前スレ読んでたんだけども
「猫でもわかる〜」っていうのは前スレで紹介されてたやつですな。
まだ見てないけれど、自分もこの本読破できたら行ってみようと思っとります。
同じ文系の人がいた事に親近感(*´Д`*)
>>736 なるほど、全部が全部でなく、抑えるべき要所を覚えれば良いのですな。
覚えるのはまだ先の話だけど、やる気出てきた(`・ω・´)
--------------------------
朝の9時から13時過ぎまでやって、LESSON4がようやく終了。
重ねて言ってるけどこの本(やさしいC)、ホント親切。
自分が疑問に思った事を見透かしたかのように次のページには
その解が書いてある。図解も分かり易く、よほど俺には合うみたい。
今回は式と演算子の章だったので、数学苦手な人間としては
突然難易度を上げられた感じ。まだどうにか食いついていってるが。
「キーボードで五科目のテストの点数を入力して、
合計値と平均値を求めるコードを記述しろ」
って問題には、息も絶え絶えクリアできたものの、
「整数を入力した際、正負を反転して出力するコードを記述しろ」
には頭抱えてましたw解答見た時は唖然「ははは!こやつめ!(AA略」
昼飯食べたら関係演算子やらif文やらのLESSON5に入ります。
参考書で理解できない所があるので質問させて下さい ↓文字列sの複製を作る関数です char *strdup(const char *s) { char *p = (char *)malloc(strlen(s) + 1); return (strcpy(p, s)) } ↑の関数の内容は理解できますが、strdupの関数名に なぜ*がつくのか理解できません。 なんで*strdupになるのですか?
これが噂の関数ポインタって奴ですか? まったく知らないけど。
戻り値が文字列の先頭を指すポインタ
>>742 さん
>戻り値が文字列の先頭を指すポインタ
というのはstrdupがsを指すポインタという事ですか?
>>743 char *func();の書き方がわかりにくいなら
char* func();だと考えてくれ
要はchar*型を戻り値にもってるってこと
つーか、いくら入門書とはいえ(むしろ入門書だからこそ)
malloc後のNULLチェックを飛ばすのはダメだろ
>>744 ああぁあっ!!分かった気がします!
戻り値が文字列なので*strdupは先頭を指すポインタの
意味がたぶんわかりました!
NULLチェックの重要性について丁寧にやってみます!
答えてくださってありがとうございます
かなり興奮中です(゚∀゚)
return strcpy(malloc(strlen(s) + 1), s); むしろここまでやってくれたら尊敬する ちなみにstr[a-z].*という名前の外部関数をプログラム側で定義するのはだめだって話を宿題スレでやってた。
>>746 そこまで短縮できるまでの頭のキレがほしいです!
これまたレベル高い情報で尊敬の眼差しが・・・
本当にありがとうございます、やる気でてきました(`・ω・´)
>>747 >>746 は絶対にやっちゃダメだろ
strcpyは領域チェックをしない
NULLにコピー何てしたら何が起こるかシラネ
ちなみにWindowsではヌルポインタにアクセスしようとすると例外が飛ぶ。 ただNullPointerExceptionでないのが惜しい。
明日のための鉄則その1 mallocの戻り値は必ずチェックしろ
>>749 そういやCじゃ例外機構ないよな
例外発生すると有無を言わさず強制終了?
>>751 VCやBCCではCにもWin独自の例外機構(SEH)が備えられている。(__try〜__except/__finally)
C++ではC++の例外とSEHをまぜて使える。
>NULLにコピー何てしたら何が起こるかシラネ って事は領域確保したら安全性のため領域確保できたか チェックもいれなければだめなんですね。参考になります。
半ばニート頑張るなw
C言語を学び始めて2日目です。 このスレに書いてある事がサッパリわからない。 今現在「ネコでもわかる〜」のC言語編第八章です。 ってか「ネコでもわかる〜」すげー難しいんですけど・・・ 百章まであると思うとクラクラする。 11月22日にテストなのにヤヴァイ・・・
>>755 8,9,10は後でやることを先にやってるだけだから飛ばそう。
猫でも〜は何が言いたいのか良く分からないけど。
>>755 俺もそれ思ったw
ネットでならネコやる前に苦Cのが分かりやすかったよ
>>756 >>757 マジでぇえ?情報をどーもです。
他のもイロイロ見てみよう。わかんないとこがわからん・・・
今日はC言語勉強3日目です。
あと9日でCの基礎、制御文、データ型、変数、式の詳細を学ばなければならない。
今日と明日は会社が休みなのでひきもって勉強するつもり。
今から勉強します。
>>755 猫でもは非初心者向け。面倒だと思わずに入門書を買うなり図書館から借りるなりした方が懸命。
つーか、前にも言ってただろ確か。
こんにちは。
>>754 わかる間は面白いです。全く理解できなくなった時がコワス(´・ω・`)
>>758 勉強始めた日が同じだw
(*´∀`)人(´∀`*)ナカーマ
本なら
>>274 氏同様、やさしいCを超オススメ。
これなら、覚えの良い人なら二日漬けで内容3分の2以上は消化できるかと。
覚え悪い俺でも今日で半分まで進めました。
日にちが差し迫ってるのが辛いトコだけど、がんがって!
----------------------------
昨日はLesson5を消化してから、マ版に行ってました。
半端な知識でプログラマーになるって事がどうゆう末路を辿るのかを理解完了orz
最初は「これで就職を・・・」と思っていたけれども、
今それを考える事は後回しにする。働く事も後回しにしたi(ry
昨日同様朝9時から今さっきまでで、ようやくLesson6終了。
繰り返し文についてだったんだけども、応用がやたらと利くのか、
練習問題はほとんどクリアできず(´-ω-`)
解を見ればしくみは理解できるんだけど、
問題見てそういうしくみを自分で閃けなかった。
こんなので大丈夫なんだろかなぁ・・・。
全Lesson、12に対し半分を終えれました。
ずっとこもってたので今日は外出。走る。泳ぐ。筋トレしてみる。
帰ったら配列のLesson7に挑戦。
>>760 乙。結構頑張ってるみたいで。
>半端な知識でプログラマーになるって事がどうゆう末路を辿るのかを理解完了orz
PGは理想と現実のギャップが激しいからな;俺は「それでもSEになりたいか」という本を読んで概要を知った口。>残業とバグと納期との戦い までは読んださ。
>練習問題はほとんどクリアできず(´-ω-`)
ちょっと待てwそれじゃ先進む意味無いだろw
時間かけてでも内容をしっかりと把握するべし。
仕組み、というか文の流れをイメージできる様にすれば割と簡単に覚えられると思う。丁度、やさCの解説絵みたいな漢字。
>>758 俺は猫Cの本の方を今読んでいるが、正直言ってWEBの内容も本の内容も、全くの初学者(特に文系の人)が手を付けるには少しわかり辛い気がする。
というか、初学者は素直に入門書を買った方が良いぞ。
WEBに挙がっているテキストは、編集者の目が入っていないのでわかり辛くなっているものも多い。
お勧め本としては、『Cの絵本』あたりかな。
ただ、これは練習問題が入っていないので、そこら辺を上手く補強する必要があるが。
『やさC』も
>>274 氏や半ばニート氏が言うように良い本なんだろうが、俺は買ったことがないので薦めることはしない。
(別に
>>274 氏や半ばニート氏を信用していないのではなくて、俺は本屋で立ち読みした程度なので、薦めると無責任になってしまうから。)
>>760 >>761 (273氏)も言っているように、解けない問題は自力で解けるまでやり直した方が良いと思う。
急がば回れじゃないけど、焦って急ぐと後で大変になるから。
人の話の受け売りだが、良いプログラマの条件はアルゴリズムのネタを多くもっていることらしいし。
初心者が偉そうなこと書いてスマソ。orz
>>762 printf("(273氏)は(274氏)の間違えです。\nスレ汚しスマソ。orz\n");
走って泳いで腕立てふせ辺りで疲れ果てて居眠りこいてました、
あきれ果てた顔のドラえもんAAが頭よぎった半ばニート24歳です。
>>761 >>762 ども(´∀`)ノ
ちょっと離れた間に心配かけてたみたいで恐縮(´・ω・`)
お二人の言う通り「これわからないので後回し」ってのは
昔からよくありました。これを機に脱したい。気ぃつけます(`・ω・´)ゝ
今のところ一度解答さえ見れば、
>>274 氏の言う「流れ」がなんとか見え隠れしているのか、
二度目同じ問題をやるとできているようです。
明日もっぺんやってちゃんと理解できてるか確認してみます。
ただ、初挑戦の段階でその流れを閃く事ができなかったってのがどうにも。
基礎の構文覚えても応用をまるで利かせれない自分の頭にアワレワロス。
慣れなのかな。ネタ、一つでも多く持ちたいです。がむばる。
今日は結局Lesson6のみでした。明日この章の練習問題を経てLesson7行きます。
>>764 読んでる本は猫だっけ?
あの本はscanfかなんかの危険性を指摘せずに使ってるというのを見たから
全く読んだこと無いけど、とりあえずリストとかの基本的なデータ構造を
一回自分で作ってみるといい
一度書けば、どんな物なのかというのが理解できるし、それが必要となったときに
楽に実装できるようになる
>>751 setjmp/longjmpで似たようなもの実装できるし現にRubyがそうやってる。
あとこのへんの実装はOS依存だがシグナルとか。
今レポートやっつけ中。VBなんて窓から放り投げてCがやりたい…
>>762 解答なんて全章終わった後に読むぐらいのつもりでないと。っつか、俺が現にその状態なんだが。
正常に動けば形がどうであれ正解なんだし、分かるまでやってみたらどう?必要なら応用問題も出すよ。
変な時間に睡眠とったんで、寝れそうで寝れないorz
>>765 読んでるのは、やさしいCっす。
なるほど、練習問題なら複数回やったことはあれど、自分で作った事はマダーです。
そうですな、明日(というよりもう今日)早速その方法を参考にさせて頂きつつ、
ちょっとノートかPCにまとめてみます。アドバイスどもです(`・ω・´)ゝ
>>768 アンカー違うけど、俺宛ぽいので。
うーん、確かに。
・・・ニート属性として「諦め早い」のスキル持ってるのですが、
俺はここから一歩でも前へ進みたい。この際です。捨ててみます。
応用問題とはありがたい!俺は今の段階では答えられそもありませんが、
問題を出すなら今でもいいぽいと思われます。
ここ数日、俺ばかり奇襲して暴れ放題チラシ放題ですが、
このスレには自分以外にも問題を待ってる人、沢山いると思うんで。
元々ここはそういうスレだと、昨日WIKIで見かけました。
俺はスレのログは残してるので、
然るべき日(基礎ができたかなと自分で納得できた辺り)になれば
後でこっそりやりますよー。
おはようございます。
>>755 >>758 です。
今日はC言語勉強4日目。今日は制御文forループってのからやってみるつもり。
>>759 本は「独習C」ってゆー黄色い本を持ってます。
ってかテストがこの本の第1〜第4まで出ます。
チンプンカンプンなのでC初心者HPを参考に並行して勉強してる次第であります。
>>760 おお、勉強をはじめた日が同じなんて奇遇ですね。共に頑張りましょう。
私のほうが先に脱落するかもだけど。
初心者本は明日仕事中(営業マンなので自由がきく)に見てこようと思います。
今から勉強します。また夜きます。では。
お前らたまにはageないと埋もれますよ
772 :
デフォルトの名無しさん :2005/11/13(日) 13:17:35
じゃあage
>>764 >「流れ」がなんとか見え隠れしているのか〜
手間と時間と金が惜しくなければ、例題や解答のソースを自分で打って何枚か印刷し、それぞれ、赤ペンで使って線を引きながら、処理ごとにプログラムの動きを追ってみると良いかも。
例えば、
int main(){
int a;
printf("aさんの出席番号を入力して下さい。>>");
scanf("%d",&a);
printf("aさんの出席番号は%dです。\n",&a);
returne 0;
/*適当に書いたので、細かいツッコミはしないでね。*/
}
というプログラムだったら、main関数に入る所から線を引き始めて、int a;の所に来たら「int型の変数aをつくる」、最初のprintfの所に来たら、「番号の入力を求めるのか〜」、
scanfの所に来たら「さっきのaにキーボードから入力するのか…とりあえず、1を入れとこ。すると、今のaは1だな。」、
printfの所に来たら「%dに入るのは…&aだからaの値で…1か」みたいな。
俺は普段頭の中でやって、良く分からない時だけ紙に書いてるけど、これをやるとコメント(/*〜*/)を書くのが少し上手くなる(気がする)。
何故線を引くのかは、条件分岐やループなんかを入れたソースでやってみると、良くわかると思う。
ついでに、暇だったらそれをフローチャートに起こしてみる。
そうすると、自分が1からフローチャートを起こす時にも多少は役立つのではないかと。
初心者対して、よく「フローチャートを書いてから作れ」という人が居るけど、俺の場合はそれはしなかった。(というか、できなかった)
俺自身、フロチャを起こすようになったのはつい最近、CやVBで複雑なプログラムを組み始めてからだった。
アルゴリズムのネタが少ない内は、かえって混乱するから、"自分でソースを書く時に限っては"フロチャを書かないほうが良いかもしれないね。
以上、あくまでもいい加減な主観だから、参考にもならんが。
>>770 どこまで進んだかだけでなく、どの程度理解しているかも書くとスレの住民も反応しやすいかと。
レベルは「本の練習問題を数回やって解けるレベル」とか、「まとめwikiの○番目の問題が解けた」とか。
こんにちは。
>>770 俺も朝方ようやくforループに一区切りつけたトコです。
whileやらdo whileやら複数種類あってややこしかったーヽ(`Д´)ノ
>>773 おお、アドバイスどもです。俺とよく似た方法ですね。
自分はまだ脳内のみでやり始めると
文字達が勝手に頭の中でBダッシュジャンプしてどっか行くので
わかるのもわからないのもノートに手書きで書き写して、
上から順に「ここがどうでそこがああで」と音読しながら線引いてます。
フローチャートの意味を知らなかったのでググりました。
なるほど図形に起こすのか。新鮮です。
確かにこれは慣れてからの方が良さそうですが、良い事聞きました(*´∀`)
----------------------
繰り返し文もちょっとずつ見えて来ました。
んで、今Lesson7にいます。早くも壁来ましたorz もう同じ問題に早や2時間。
ついに低学歴がアダになる時が来たか、と。ウワアアアアン。
「Lesson7の7.5です」と言うと内輪な話になるので
本書から抜粋しました。
C言語質問スレ【激初心者】に行くべきか迷いましたが、
せっかく
>>274 が協力して下さるとの好意に甘えたいので今回のみここで。
以後、この手の質問は上記スレ行こうと思ってます。
#include<stdio.h> #define NUM 5 int main(void) {int test[NUM]; int tmp; int i,j,s,t; printf("%d人の点数を入力して下さい。\n",NUM); for(i=0; i<NUM; i++){ scanf("%d", &test[i]); } for(s=0; s<NUM-1; s++){ /*この行と*/ for(t=s+1; t<NUM; t++){/*この行が問題*/ if(test[t] > test[s]){ tmp = test[t]; test[t] = test[s]; test[s] = tmp; } } } for(j=0; j<NUM; j++){ printf("%d番目の人の人数は%dです。\n", j+1, test[j]); } return 0; } 上記コメント二行の部分、 繰り返しの流れが理解できず悶絶してます。 本書にも「ちょっとややこしいですが」と図解付きの説明がありますが、 それでもこの脳では許容できずorz
バブルソート
仮に上のループを条件1として下のループを条件2と考えて まず for(s=0; s<NUM-1; s++) 条件1 は5回のループを意味する このループの間for(t=s+1; t<NUM; t++) 条件2 を繰り返す。 if(test[t] > test[s]) は初めの値(配列0番目)と次の値 (t=s+1によって)を比較して交換する意味 0番目と1番目、0と2・・・0と4(配列にして5番目の値)の比較が 終わったら条件1の判定に戻りsの値を1増やして、繰り返す と言う事。の説明でオッケ−だと思われ? 初心者の説明でスマン
はう!!交換のとことか間違えた('A`) でもいっかwwwwwwww
>>779 調べて意味を見てたら開眼できました(゚∀゚)!
ありがとうございますm()m
>>781 ちょwwwwwww
でもわざわざ助力頂き助かりましたm()m
------------------
>>779 氏の一言のおかげの開眼と、
>>780 氏の説明部分のおかげで
自分の質問がずれている事に気がつけました。
コメント入れた部分自体は前Lessonで把握済みでした。
全体の流れがしっかり把握できてなく曖昧であったのに、
無理にどこがわからないのか具体的な目星をつけた事が、
ずれを引き起こした原因だったようです。
バブルソート、覚えました。
>>274 氏、申し訳ない。まだ頑張れそうです。
>>773 細かい揚げ足取ると
・returne
・printfに&a使うとアドレスが出力される、aだけで十分
>>778 氏付けなくていいって。大した事やって無い&&年下だし…と言いたいが、俺も小手で呼ぶ時は「半ニ氏」みたいになりそうだな…
777の問題は俺も時間かかったな。ソースと解説だけでしつこくやってたらいつの間にか完璧にソース覚えちまった。
簡素な処理ばかりだった初期の頃で「プログラムすげぇw」と思えた初めてのソースだったな。
さて、そろそろ練習問題逝っとく?
やべ、細かいツッコミはタブーだったかorz
(  ̄∀ ̄) <問題!問題!
>>783 おお、ご指摘どうもです。
&aはscanfを書いた後に書いたので、うっかりしてました。
returnのスペルミスは、普段int main()ではなくvoid main()で書いているので、これまた単純ミスです。
わざわざ、すいませんです。orz
788 :
ddd :2005/11/13(日) 21:05:28
>>787 問題
キキキキタタタタ━━━(((((゚(゚(゚(((゚゚∀∀゚゚)))゚)゚)゚)))))━━━!!!!!!
んっ?多次元?点数を配列に格納するんですか?
すいません キー連打してたらdddとか打っちゃった
>>788 >>787 は俺ね。(コテハン記憶し忘れた)
>>274 氏が出す前に初心者の俺が出すのは問題かも知れんが…。
よかったら解いて見てください。
但し、多次元配列とfor文が使えることが前提です。(何度も言うように、俺は『やさC』を持っていないので、Lessonいくつと書かれても、具体的にどこまで出来るのかわからんので。)
問題1
多次元配列を利用して、学生10人分の出席番号・国語の点数・社会の点数・英語の点数を入力し、標準出力でアウトプットするプログラムを作りなさい。
出力例
学生1の国語の点数は100点、社会の点数は100点、英語の点数は100点です。
学生2の国語の点数は90点、社会の点数は75点、英語の点数は100点です。
(以下略)
あ、ちなみに、出力例の「学生」に続いている数字(1とか2とか)が出席番号ね。 ちょっと長いので、項目ごとに改行して出力しても良いです。 例 学生1 国語100 社会100 英語100 学生2 国語100 社会100 英語65 (以下略) while文が使えるのであれば、ちょっとした追加問題も用意してるんで言って下さい。
792 :
デフォルトの名無しさん :2005/11/13(日) 21:38:30
問題出現アゲ∩(・ω・)∩
さっきから連レススマソ。orz もうひとつ補足。 出席番号と点数の入力は標準入力(キーボード)を使って下さい。 入力例はこんな感じで。 例 出席番号を入力>> 1 国語の点数を入力>> 100 社会の点数を入力>> 100 英語の点数を入力>> 100 スレ汚しスマソ。
こんばんは。
>>755 >>758 >>770 です。
今日は明日の仕事の設計書とかプレゼンの練習であんまり勉強できなかったなぁ。
forループ、演算子、printf()とエスケープ文字をやりました。
wikiの「1から50までの和」が解けました。
>>776 同じ日にはじめたのにもう随分差をつけられちゃったっぽいなー(笑い
因みに24歳なんですね。歳近いですな。私は25歳です。
>>790 うげっ!わからん・・・多次元配列?もっと勉強して解かせて頂きます。
問題だああsはうあふああh やってみるお(´・ω・`)
>>790 >274氏が出す前に初心者の俺が出すのは問題かも知れんが…。
全然お構いなく。俺もまだ文字列ポインタ・ポインタ配列辺りで苦戦中だから、皆と同じぐらいのレベルだし。
今だ片付かないレポートをよそに俺もやってみるわ>問題
>>794 普通の配列は分かりますか。
それだったらば、ちょっとした問題を出せますが。
>>795 >>796 >やってみるお(´・ω・`)
>今だ片付かないレポートをよそに俺もやってみるわ>問題
そういって頂けると、何だか凄く嬉しいです。
まったりいい流れ。 俺も4月からc習い始めてる理系学生です。 蝶初心者向けの本を構造体の前まで(友達にぱくられた)読み終えて、今は猫読んでます。 けど今まで理解した気になってるだけで、実は理解してないんじゃないかと不安になってるんです。 というのも猫をパラ見しながら感じたんですが問題を解いた数が少ないんです。 学校の課題はやるんですけどその時やったことだけだったり、応用的な問題や違う切り口の問題を解くことが少ない。 猫を見てみたら問題が少ない。やっぱ数こなすことも大事だと思うんで・・・ そんな時ここのwiki見つけて喜んでました。問題いっぱい! 最近時間なくて問題は解けないけど通学時間に本読んで勉強する気ではいます。 やっぱ実際打ってみないと力つかないし覚えられないからなぁ・・・ とチラシの裏みたいになったけど用は問題出してくれるこのスレに感謝!ってこと 最近出題が少なくてしょんぼりだけど。 出題者がんばれ!初心者もっとがんばれ! 790の問題時間見つけてやってみます。
一応
>>790 の問題をやってみたんだけど、
入力は出来るんだけど何故か「1」が出る。も〜何でw
こんなカンジで↓ 「1」後は普通に入力出来るんだけどなぁ。。。
出席番号を入力>> 1
国語の点数を入力>> 1
社会の点数を入力>> 1
英語の点数を入力>> 1
はぁ、明日仕事なんでもう寝なきゃ。
>>799 ソースコード上げてもらえますか。
これから数日、この板に来れないかもしれないのですが、間に合えば問題点を指摘しますんで。
少し時間が経ったのと問題が補足等で複数レスに渡ってしまったので、整理とヒント、追加問題出しも含めて再書き込み。
>>790 の問題
問題1
多次元配列を利用して、学生10人分の出席番号・国語の点数・社会の点数・英語の点数を標準入力(キーボード)から入力し、標準出力(画面)に出力するプログラムを作りなさい。
入力部分の例
出席番号を入力>> 1
国語の点数を入力>> 100
社会の点数を入力>> 100
英語の点数を入力>> 65
出力部分の例
出席番号1の国語の点数は100点、社会の点数は100点、英語の点数は100点です。
出席番号77の国語の点数は90点、社会の点数は75点、英語の点数は100点です。
(以下略)
または
出席番号1
国語100
社会100
英語100
出席番号88
国語100
社会100
英語65
(以下略)
以下は問題1のヒントです。 良く分からない方は、上から順を追って読んでみて下さい。 但し、解き方が何パターンかあると思うので、あくまでも私と同じ解答を導き出すことを前提としたヒントです。(要するに、私と違った解き方をするならば役に立たないよ、ということ) ヒント1> 配列の次元数は二次元です。 ヒント2> for文を使うと楽。 ヒント3> for文は二重になります。 ヒント4> 二重のfor文?…二次元配列…? 同じ2だなぁ。 ヒント5> 二次元配列を宣言する時、配列の後ろの[ ]に入る数字は4。 つまり、4つのデータを格納するということ。 ヒント6> 二次元配列の数がよくわからなかったらば、とりあえず1人分の出席番号と国社英の点数を入力するプログラムを考えてみよう。 今回のヒントはここまで。
ここまで解けた方は、以下の追加問題もどうぞ。 問題2 問題1で作ったプログラムに、ありえないデータが入力された場合のエラー処理を付け加えなさい。 なお、具体的な処理内容は以下の通り。 1.出席番号を入力する際、0以下の値を入力されたらば、「1以上の値を入力して下さい」と画面に出力し、キーボードからデータの再入力を求める。 2.各教科の点数を入力する際、0未満の値と100よりも大きい値が入力されたらば、「0から100までの値を入力して下さい」と画面に出力し、キーボードからデータの再入力を求める。 補足1.上記二つの処理は、文字列が入力されることは想定しなくて良いです。 補足2.エラーの内容(「1以上の値を〜」等)を出力した後は、このプログラムの利用者が正しい値を入力してくれるものと考えて良いです。 問題3 問題2で作ったエラー処理を改良し、エラー内容を出力した後に入力される値が正しい値になるまで同様の処理を続けるようにしなさい。 例(出席番号の場合) 1.出力:「出席番号を入力>>」 2.キーボードから0を入力し、Enterキーを押す 3.出力:「1以上の値を入力して下さい」 4.キーボードから0を入力し、Enterキーを押す 5.出力:「1以上の値を入力して下さい」 (以下、正しい値(この場合は1以上の値)が入力されるまで、同じ処理を繰り返す。) ヒント>while文を使うと楽かも
まったり系のスレとはいえ、何度も連レスしてしまい、すいませんでした。orz さっきも書いたように、明日から数日間このスレに来れないかもしれませんが、数日以内に解答のソースは必ず書き込みますのでご勘弁を。 (「俺が書いたる」という方がいらっしゃったらば、書いちゃって頂いても構いません。) それでは、今晩は寝ます。
「ミスター」を名乗るからにはもう少し知識を身につけて欲しいなぁ。 或いは自分の書いた文章の間違いに気を配るとか。 #理系だからそれらが許されると言うことでもないが。
>>805 ちょっと見ただけだけど。
・main()関数の型が間違っている。
#どこからcharが……
・voidでない関数はreturnで値を返さないといけない。
・別々の配列(少なくとも一つの配列と一つの二重配列)にすべきものを無理矢理二重配列としてしまうのは如何なものか。
#あ〜、ヒントが悪いのか。
・整数定数は、使い回しが利くようにマクロにするほうがいい。
・無限ループはコンパイラによっては無駄な警告が出るwhile (1)よりfor (;;)がお勧め。
#そのためにわざわざ1を書かなくてもいいように仕様が決められているのだから。
・馴れないうちは(俗に言う)一行野郎で書こうとせずに複文化したほうがいい。
#if (...) ...; などね。
・scanf()で数値を入力するのは間違って英字を入力したときに悲惨なので避けた方がいい。
#慣れないと判りにくいから今後の課題と言うことでいいと思うが。
・(固定)文字列の配列は、const char * sub[] = {"...", "...", "...",};とするのが常道。
#人間がわざわざ数を数えることはない。
808 :
274 :2005/11/14(月) 09:12:22
>>807 ・main()関数の型が間違っている。
これはcharの関数作ろうと思って消し忘れた奴
・別々の配列(少なくとも一つの配列と一つの二重配列)に〜
多次元配列で作れと指定されてる
・馴れないうちは(俗に言う)一行野郎で〜
馴れてるから書いてるだけ。レスで貼付ける時にはスマートかと。
・scanf()で数値を入力するのは間違って〜
つ[スレタイ && 最新100]
810 :
807 :2005/11/14(月) 11:26:22
>>808 言い訳せんでいいよ。ヒントを書いているだけで教える気があるわけじゃないから。
疑問があるなら質問してくれ。暇があったらスレチェックしているから。
811 :
807 :2005/11/14(月) 11:29:43
>>809 漏れに惚れちゃぁいけねぇぜ。
追記。
「多次元配列で作れ」≠「単一の多次元配列に放り込めるものは全て放り込んで作れ」
言い訳を捻出する暇があったら行間を読む努力をする方がいい。
Cの勉強中で基本はもう終わったので、プログラムを作ってみたりしてるんですが、 データベースファイルのようなものにCの標準機能だけでプログラムで登録、削除、参照などを したい場合って、CSV形式のファイルを利用するのが一般的なのでしょうか?
データベースにアクセスしたいなら専用ライブラリが無料配布されてるぞ
815 :
813 :2005/11/14(月) 13:29:31
データベースにアクセスしたいというよりも、ファイル操作等の練習のためにやってみたいだけなんです。 でも練習なんだし、普通はどうするとか考えるよりもとりあえずやってみればいいですよね。 どうもありがとうございました。
>>815 それならCSVでもいいんでない?
できたファイルをExcelで読み込んでもいいし、エディタで開いてもいいし。
#尤も、ただのTSV(項目をカンマではなくタブコードで区切る)でもいいかも知れない。
>>810 こちとら眠気押さえて打ってたんだ、手直し後にコンパイルしてなければミスに気付かない事もある。
配列分けろだのconst付けろだの、俺はあんたの物差しに沿って打ってる訳でも無いし、あんたがC覚える為に読んできた書籍も知らない。それを皆が皆最善だと思うとは考えにくいが。
自意識過剰を自覚してるのならHCS(ヒューマンコミュニケーションスキル)を学ぶ事から始めたらどうだ?あんたの文面は叩き荒らしの特性によく似ている。
818 :
デフォルトの名無しさん :2005/11/14(月) 17:51:56
不穏な空気になってまいりました。
どう見ても精子です。 本当にありがとうございました
僕の息子は常時スタンバってます('A`)
>>817 同じ学び中の者から少し。
こういう初心者スレでわざわざソースを見てくれて悪いところを指摘してくれる人なんて悪い人じゃないと思うよ。
間違った変な知識で指摘する人もいるかもしれないけど、そういう場合って大概別の知識のある人からの
突っ込みが入ったりする。
匿名のネットで指摘されたって恥をかくわけじゃないんだから、こういうのは謙虚に受け取っとけばいいと思う。
現時点からしたら細かい指摘なのかもしれないけれど、constの件などはおそらく最善の部類に入ることだろうし、
プログラミング時眠かったとか手直し後に再度コンパイルしてないってのは初心者だからとか関係ない。
結果間違ってたところ、改善可能な点を知れたなんて良いことじゃないか。
俺にも参考になったし、今後他の人の参考にもなるかもしれない。
一応固定みたいにしてるなら些細なことでツンケンせずに楽しくいこうぜ!
>>817 >こちとら眠気押さえて打ってたんだ、
私の知ったことではない。嫌ならやらなければいいだろう。
寧ろ、眠気を抑えながらの学習は効果が薄いと思うが如何だろうか。
>手直し後にコンパイルしてなければミスに気付かない事もある。
コンパイラが発見できないようなケアレスミスで苦しむこともなかろうと極力ミスが発生しないやり方を書いている。
>配列分けろだのconst付けろだの、
命令してはいない。参考にするもしないも私の知ったことではない。
>俺はあんたの物差しに沿って打ってる訳でも無いし、あんたがC覚える為に読んできた書籍も知らない。
当たり前だ。私は何冊も読んだわけではないからそれを明かしたところで参考にさえならないだろう。
>それを皆が皆最善だと思うとは考えにくいが。
一部反論もあるだろうが、概ね受け入れられるように書いている積もりだ。
また、>821も書いている通り、問題があるなら他から指摘されるだろう。
>自意識過剰を自覚してるのならHCS(ヒューマンコミュニケーションスキル)を学ぶ事から始めたらどうだ?
その言葉、そのままお返ししよう。
>あんたの文面は叩き荒らしの特性によく似ている。
これもそのままお返ししておこうか。
>疑問があるなら質問してくれ。
あー、一つだけ命令口調になっていたか。これは「疑問があるなら質問してくれても構わない」と言い換えておこう。
たまたま虫の居所が悪いところに紋切り型の口調が気に入らなかったのかもしれないが、
自分が誰のために学習しているのかよく考えてみてみたらどうだろうか。
>>822 気が多いなw
もう不倫はしません(´・ω・`)
825 :
デフォルトの名無しさん :2005/11/14(月) 19:11:27
まあ、二人とも落ち着けや せっかく俺スゲーって作ったらダメだし食らって切れちゃっただけなんだし
日本語にコンパイルしてください でないと、あなたが何者か分か・・・(ry
807は命令口調のようだったのがまずかったな。 #しかし2chではあれくらいでも普通だと思うけどな。 とにかく言っていることは正しい。俺も保障する。(保障になっていないってw
>>807 一応C99からはintで宣言したmain関数は明示的にreturnしなかった場合0を返すことが保証されている。
まあ個人的には
・C99で追加された機能はできるだけ使わない
・C99で削除された機能は絶対使わない
という態度で書くのが良いとは思うが
829 :
807 :2005/11/14(月) 20:42:14
>>828 >一応C99からはintで宣言したmain関数は明示的にreturnしなかった場合0を返すことが保証されている。
ついついそれを忘れちゃうんだよね。フォロー感謝。
>・C99で追加された機能はできるだけ使わない
>・C99で削除された機能は絶対使わない
同意。特に初心者はその方がいいね。
#と言いつつ自分はC99で追加された機能(ブロックの途中での変数宣言や関数のinline指定)を使うけど。
むつかしくて何言ってんのかわかんねえや
問題: int配列の重複がないことをチェックする関数 つまり 配列の先頭要素へのポインタと配列の長さを受け取り、 配列中の他の要素と同じ値を持つ要素があれば0を、なければ0以外の値を返す関数を作りなさい 例: {1,2,3,4,5,6,7,8} => 0以外を返す {1,2,3,4,5,2,7,8} => 0を返す もしこの問題が解けて退屈だったら 選択文(if,switch)や条件演算子(?:),繰返し文(for,while,do-while)を使わないで作るってのはどう?
俺の場合、C++にあればC99にあろうとなかろうと気にせず使う。
835 :
832 :2005/11/14(月) 21:18:42
>>834 あ、、、。orz
後ろの問題はgotoも禁止ね。thx
836 :
832 :2005/11/14(月) 21:22:46
連投スマソ いや、むしろgoto使って書けるもんなら書いてほしいと思ったり
837 :
813 :2005/11/14(月) 22:11:47
>>816 区切り文字をタブにした形式もあるんですね。
数字を1,000のように書いたりする場合にはそっちのが良さそう。
ありがとうございます。
>>823 言い訳を捻出する暇があったら行間を読む努力をする方がいい。
つか、互いに言い訳、互いに屑。そういう事にしとこうか。
>>831 ざっと見た範囲で。
・バックスラッシュが2バイト文字になっているけど大丈夫?
・問題の性格上仕方ないけど、memcpy()かぁ……
・点数の入力に関して、条件判断とメッセージの内容が噛みあっていない。
#片や1以上、片や0以上。
・printStudentInfo()はprintf()一文で書いてもいいかも。
#その場合、文字列リテラルが連結できることを利用するといい。
・enumの最後の値の後に','を置くのは間違い。
#コンパイラによっては通るかもしれないが。
・feof()を呼ぶまでもなくfgets()の戻り値を見るだけで充分。
#feof()を禁止するわけではない。
・intValueと言う名前のint変数でlongの値チェックをするのは如何なものかと。
>>838 まだ続けるの? そういうのを恥の上塗りと言うのだよ。
>>839 もう締めようとしてんだろ屑。
インテリ気取る前に鏡の前に逝けよ
>>840 師匠になにを言う(`・ω・´)
ってかそろそろやめなって・・・www
真面目な指摘してくれて、聞く立場からすれば
とても参考になるし、勉強になる。
なんだ、スレを通してみたら妙に納得してしまった。
>>274 君、面白いよ。その純粋な子供らしさを失わないようにね。
>>839 >・intValueと言う名前のint変数でlongの値チェックをするのは如何なものかと。
これはどうしろと?
843 :
274 :2005/11/14(月) 23:50:39
>>841 勝手な言い掛かりで煽られれば
頭にも来るし、反論したくもなる。
俺は
>>808 でありのままに答えた(多次元は違っていたとしても)
だがあんたは煽るかの様に言い訳と決めつけた。これが問題。
「初心者には容赦しない知ってる君」みたいな態度に頭が来ただけ。
初心者そっちのけで喚き散らしてる時点で言い訳不能だと思うが
うぜーよ
846 :
デフォルトの名無しさん :2005/11/15(火) 00:37:22
盛 り 上 が っ て ま い り ま し た
|ω・`)
>>847 なんで隠れてるのお前www
ω・` >⊂ おら、出て来いw
>>832 やってみました。むずかしーよー。頭テンパった。
#include <stdio.h>
#include <string.h>
int CheckSameValue(int *array, int len);
int main(void)
{
int n[] = {1,2,3,4,5,6,1,8};
int len;
int checked;
len = sizeof(n);
len = len / sizeof(int);
checked = CheckSameValue(n, len);
if (checked) {
printf("同じ値無し");
}else{
printf("同じ値あり");
}
return 0;
}
int CheckSameValue(int *array, int len) { int ret; int i, j; for (i = 0; i < len; i++) { for (j = i + 1; j < len; j++) { if (i != j) { if (*(array + i) == *(array + j)) { return 0; }else{ ret = 1; } } } } return ret; }
>832 思いついたのはソートして隣と不一致な事を確認する、で >選択文(if,switch)や条件演算子(?:),繰返し文(for,while,do-while)を使わないで作るってのは 思いつかんかった...
>>832 再帰書いてたら頭痛くなってきた。
俺には再帰無理かも。
int not_find_int(int array[],int n,int c){
return n==0 || (array[0]!=c && not_find_int(array+1,n-1,c));
}
int not_find_ints(int array[],int n){
return n==0 ||(
not_find_int(array+1,n-1,array[0]) &&
not_find_ints(array+1,n-1)
);
}
#include<stdio.h>
int main(){
int a[]={1,2,3,4,5,6,7,8};/* => 0以外を返す */
int b[]={1,2,3,4,5,2,7,8};/* => 0を返す */
printf("%d\n%d",not_find_ints(a,8),not_find_ints(b,8));
}
>>832 #include <stdio.h>
#include <stdlib.h>
int greater(const int *l, const int *r)
{
return (*l-*r);
}
int overlap(int *array, int len)
{
int i;
qsort(array, 8, sizeof(int), greater);
for (i=1 ; i<len ; i++)
{
if (array[i-1]==array[i])
{
return 0;
}
}
return 1;
}
int main()
{
int ex1[]={1,2,3,4,5,6,7,8};// => 0以外を返す
int ex2[]={1,2,3,4,5,2,7,8};// => 0を返す
printf("%d\n", overlap(ex1, sizeof(ex1)/sizeof(int)));
printf("%d\n", overlap(ex2, sizeof(ex2)/sizeof(int)));
return 0;
}
>>855 例によってぱっと見で。
・ソート用比較関数の引き数は、qsort()の第4引き数にあわせたほうがいい。
#const int *だと警告が出ると思う。
・int同士の引き算だと、差がINT_MAXを超えてしまうので都合が悪い。
#より大きな型を使うか、一般的には条件文でいいだろう。
##値域が限定されていることが保証されているなら構わないが。
・qsort()の第二引き数の固定値は拙かろう。
#つーか、len使ってないじゃん。
・配列の要素数を求めるのは、sizeof(配列) / sizeof(*配列)の方が一般的。
#sizeof(int)もこの場合は間違いではないが、ex1の型を変更したらアボン。
##どうせそのときはoverlap()自体を変更する必要があるからとやかく言うなという意見もありそうだが。
弱気にならんでも。 プログラム書いた人間じゃないけど参考になってるよ。
861 :
831 :2005/11/15(火) 20:12:13
>>839 添削ありがとうございますた。
>・問題の性格上仕方ないけど、memcpy()かぁ……
memcpy()をつかうと何かマズいんでそーか・・・?
横着せずに、一つずつした方が良いんですか?
>・enumの最後の値の後に','を置くのは間違い。
ずーっとカンマ置いてました。
たぶんココで指摘されなかったら
カンマ要るもんだと思い込んでた鴨。
>・点数の入力に関して、条件判断とメッセージの内容が噛みあっていない。
>・intValueと言う名前のint変数でlongの値チェックをするのは如何なものかと。
うぁ、全く気づきませんですた。
名前重要、名前重要と・・。
何回も見直したつもりでしたが、まだまだのようで。
精進しまつ。
>>861 その手のロジックでは、構造体を使うのが一般的。構造体なら、代入が使える。
→しかし、その問題では配列を使うと言う縛りがあるから仕方ないね。
ということです。仕事柄、memcpy()があると注意Lvが一段上がるからw
で、念のために書くけどintValueはlong型でないとダメで、その場合名前が変だと言うことね。
#LONG_MAXなどを扱うのだから。
863 :
831 :2005/11/15(火) 21:22:24
>>862 >→しかし、その問題では配列を使うと言う縛りがあるから仕方ないね。
>ということです。仕事柄、memcpy()があると注意Lvが一段上がるからw
なるほどぉ、構造体でつか・・・。
にしてもmemcpy()には要注意とはコレ如何に?
何度もスンマセンです。
>で、念のために書くけどintValueはlong型でないとダメで、その場合名前が変だと言うことね。
>#LONG_MAXなどを扱うのだから。
指摘されて、遅まきながら気づきましたです。ハイ。
>>863 memcpy()を使わなければ、転送サイズ間違いなどによるバグは発生しない。
仕事柄他人のソースのバグを探ることが多いのだが、バッファオーバランなどのバグは
「本人は正しいと思い込んでいて」、「簡単な動作確認は問題なく通り」、見つけにくいことが多いからね。
他にも、memset(), strncpy(), strncat(), strdup(), realloc()なども注意Lvが一段上がる。
#malloc(), realloc(), calloc(), strdup(), free()はメモリ管理一般として元々注意Lv高めなのだが。
>>842 スレ見返してたらこれ見落としてた。スマン。
そういうわけで、>862参照で。
865 :
831 :2005/11/15(火) 22:19:04
>>864 詳しいフォロー、サンクスでつ。
すんごい勉強になります。
ありがとうございますた。
うがっ、
>>382 の問題漏れには難しすぎるぽぉ。
頭よじれたけど何も出てきませんですた。
頭よじれすぎてアンカー間違えたorz.
>>832 ですた。
俺はこのスレ見てるとC言語やってるのが 馬鹿みたい思えてくるw だって難しいんだもん・・・こんなの反則だよ('A`)
>>868 C言語やってるのが馬鹿じゃなくって
お前が馬鹿なんだよ
871 :
文系 :2005/11/16(水) 00:22:50
何だか、私の問題が悪かった所為で荒れてしまったようで、申し訳ありません。orz
>>806 すいません。以後、気を付けます。
とりあえず、私の解答例を書いておきます。
#include<stdio.h>
int main(){
int tensuhyo[10][4];
int gakusei,date;
for(gakusei=0;gakusei<10;gakusei++){
for(date=0;date<4;date++){
872 :
文系 :2005/11/16(水) 00:23:18
switch(date){ case 0: printf("出席番号を入力>>"); scanf("%d",&tensuhyo[gakusei][date]); while(tensuhyo[gakusei][date]<1){ printf("1以上の値を入力して下さい。>>"); scanf("%d",&tensuhyo[gakusei][date]); } break; case 1: printf("国語の点数を入力>>"); scanf("%d",&tensuhyo[gakusei][date]); while(tensuhyo[gakusei][date]<0 || tensuhyo[gakusei][date]>100){ printf("0から100までの値を入力して下さい。>>"); scanf("%d",&tensuhyo[gakusei][date]); } break; }
873 :
文系 :2005/11/16(水) 00:24:55
case 2: printf("社会の点数を入力>>"); scanf("%d",&tensuhyo[gakusei][date]); while(tensuhyo[gakusei][date]<0 || tensuhyo[gakusei][date]>100){ printf("0から100までの値を入力して下さい。>>"); scanf("%d",&tensuhyo[gakusei][date]); } break; case 3: printf("英語の点数を入力>>"); scanf("%d",&tensuhyo[gakusei][date]); while(tensuhyo[gakusei][date]<0 || tensuhyo[gakusei][date]>100){ printf("0から100までの値を入力して下さい。>>"); scanf("%d",&tensuhyo[gakusei][date]); } break; } } } for(gakusei=0;gakusei<10;gakusei++){ date=0; printf("出席番号%dの国語の点数は%d、社会の点数は%d、英語の点数は%dです。\n",tensuhyo[gakusei][date],tensuhyo[gakusei][date+1],tensuhyo[gakusei][date+2],tensuhyo[gakusei][date+3]); } return 0; }
874 :
文系 :2005/11/16(水) 00:28:19
本によっては、まだ(自作)関数が分からない方も居ると思うので、エラー処理はそのつど書いてあります。 同様に、今回はヒントの書き方が悪かったので分からなかった方もいらっしゃったようですが、原則として文字列が入力されることは考えなくて良いとしてあるので、scanf関数を使用しています。 勿論、使える方はfgetsとsscanf等の組み合わせを使用して頂いても構いません。 なんか、本当にわかり辛くて申し訳ありませんでした。 反省として、暫く出題は控えさせて頂きます。
あの、誤変換や誤用くらいならまだ可愛いもんだと思うのですが、 変数名dateは流石に鼻でせせら笑いたくなるんですけど。
きっと宮城県出身なんだよ。
877 :
文系 :2005/11/16(水) 00:52:30
>>875 すいません。
英語に弱いもので。
C言語、やめた方が良いかも知れませんね…。orz
せめて国語、社会、英語の点数入力くらいはループで処理しても良いと思うんだ。
>英語に弱いもので だったら最初から、「文系」なんて名乗るなよ。 date(日付け)なんて中学英語以下の問題だろうが。
>>879 このスレの皆さんには散々迷惑をかけた上、大した解答も出来ず、本当にすいませんでした。
もう二度と書き込まないので、それでどうか許して下さい。
ROMるなと言われれば、ROMもしません。
本当にすいませんでした。
882 :
880 :2005/11/16(水) 08:26:50
>>881 もう書き込まないと言っておきながら、すいません。
一晩経ったのと
>>881 さんの書き込みで頭が冷えました。
英語の件と、ソースの件を指摘されてから、もっとスレにとって有意義な方向にもっていくべきだったと思います。(今更遅いですが)
言い訳のしようもありません。
>>878 点数をfor文で回すことは思いつきませんでした。(実を言うと最初は考えたのですが、思い付かなくてswitchに逃げたので。)
もしよかったら、今後の勉強のためにそのアルゴリズムを使ったソースを上げてもらえませんでしょうか。
>>879 ご指摘ありがとうございました。
何度も言うように俺は本当に英語が駄目なので、これを機に英語から逃げず、改めて勉強しなおすことにします。
住民のみなさん
こうしてスレと無関係な話題でスレを汚したり、雰囲気を悪くしてしまい、すいませんでした。
>>882 3科目の点数の入力処理で異なる部分は、入力を促すメッセージだけでしょ。それなら
const char *subject[3] = {"国語", "社会","英語"}; とか追加してしまえば
入力処理をこんな感じで纏められるでしょ。
for(gakusei=0;gakusei<10;gakusei++) {
printf("出席番号を入力>>");
scanf("%d",&tensuhyo[gakusei][0]);
while(tensuhyo[gakusei][0]<1){
printf("1以上の値を入力して下さい。>>");
scanf("%d",&tensuhyo[gakusei][date]);
}
for(date=1;date<4;date++) {
printf("%sの点数を入力>>", subject[date-1]);
scanf("%d",&tensuhyo[gakusei][date]);
while(tensuhyo[gakusei][date]<0 || tensuhyo[gakusei][date]>100) {
printf("0から100までの値を入力して下さい。>>");
scanf("%d",&tensuhyo[gakusei][date]);
}
}
}
885 :
832 :2005/11/16(水) 14:18:27
>>850-851 はーい、正解乙。でも気になった点があるのでまずは3つ
・i == j になることってないよね
・*(array + i) という式には syntax-sugar(※)があって、array[i]と書くことができる。こう書くことの方が多分多いよ
※意味は同じだけどもっと書きやすい表現。構文糖、糖衣構文、構文糖衣ともいう
# []演算子は本当は *いつでも* そういう意味なんだけど、説明すると長くなるから最初は「配列にも使えるし、配列の要素を指すポインタにも使える」ということで。
・retを使うより。2重ループを抜けた時点で単に1を返した方がすっきりする。
# 出口を一つに(return文は1つしか書かない)、というコンセプトで書きたいなら話は別だけど
さらに。
俺が出した例が悪かったのかもしれんが、テストパターンが1つというのは寂しいんでない?
int n0[] = {1,2,3,4,5,6,1,8};
int n1[] = {1,2,3,4,5,6,7,1};
int n2[] = {1,2,3,8,5,6,7,8};
int n3[] = {1,2,3,4,5,2,7,8};
int n4[] = {1,2,3,4,5,6,7,8,4};
int len = sizeof(n0)/sizeof(n0[0]);
特に境界部分のチェックは重要。
n4は「指定範囲外を調べないか」をチェックするため。
886 :
832 :2005/11/16(水) 15:08:53
int n3[] = {1,2,2,4,5,6,7,8};
こっちの方がいいか。
>>885 >>854 「再帰で書こう」ではなく、「重複しないとはどういうことかを説明しよう」と思って書けば簡単だと思う。
not_find_intsを日本語に訳せば
・配列の長さが1以下であるか(あ、0か。これはやめた方がいい。このコードはたまたま大丈夫だけど(※))、または
・先頭要素が残りの部分に含まれず、残りの部分でも重複がない
って書いてるだけだよね。たまたま説明が再帰的なだけ。
ループだけでなく条件分岐も排除したのはそういう考え方で書かせたかったから。
「こうだったらああしてそうじゃなかったらこうする」みたいな(つまり手続き的な)考え方はして欲しくなかった。
# 書いていい文はreturn文だけ。条件演算子は使用禁止。で良かったかも
# 勿論これは普通の書き方で書けた上での応用問題
※ この書き方だと要素数が1のときnot_find_intに1番目の要素を指すポインタが渡される。
つまり配列の範囲外を指すポインタになるわけで、そういう(実際には何も指していない)ポインタは生成するだけで未定義動作を引き起こす(注:ヌルポインタは別)。
ただ、例外があって、配列の最後の要素の次の要素を指すポインタは生成するだけなら問題ない。
でも指しているオブジェクトの中身を覗こうとするとやっぱり未定義動作になる。
で、not_find_intの定義をみると覗こうとはしていないから実際には大丈夫。だけど呼び出し先の関数にそんなことは期待しちゃいけない。ブラックボックスのように取り扱うべきだ、と。
887 :
832 :2005/11/16(水) 16:08:47
はう、見難くてすまん。
>>855 STL(C++)のuniqueと同じ考え方だね。(あれは予めソートしなきゃいかんが)
基本的に
>>856 なんだけど
>・ソート用比較関数の引き数は、qsort()の第4引き数にあわせたほうがいい。
あわせた方がいいというか、あわせなきゃいかんのよ。処理系によっては「引数や戻り値の型が一部異なっていてもそれがポインタなら大丈夫」というのもあるが、一般には保証されない。
>・int同士の引き算だと、差がINT_MAXを超えてしまうので都合が悪い。
<チラシの裏>
時々比較関数を、*第1引数 - *第2引数 の結果を返す。
という風に説明しているのを見かけるが、悪い説明の典型だと思う。
引き算で書いても大丈夫だとわかった上で自分で書くのは問題ないが、初心者にはそんな説明はしちゃいかんよな。
・符号付きの型だとオーバー/アンダーフローする(かもしれない)
・符号なしの型だと負数が返らない
・引き算のない型だと書き様がない
とかで初心者がはまったらそういう説明をした奴の責任は重いと思う。
</チラシの裏>
あと、greaterという名前はやめた方がいい compare_int_in_ascending あたりが妥当かな。長いか?
greaterだと述語みたいだし、qsortの比較関数だということがわかったとしても降順だと思われそうだ。
>>884 なるほど、勉強になりました。
ありがとうございました。
読みづらい。
890 :
850 :2005/11/17(木) 02:07:39
>>885 >・i == j になることってないよね
あ、あれ?もう頭こんがらがっていつの間にか入ってた・・・
>・*(array + i) という式には syntax-sugar(※)があって、array[i]と書くことができる。こう書くことの方が多分多いよ
すいません。array[i]を*(array + i)で書けること最近覚えたんですが
その逆もまたできることに気づかなかった頭の固さが憎い。
>・retを使うより。2重ループを抜けた時点で単に1を返した方がすっきりする。
最初 return 0 を ret = 0 にしてて有り得ない挙動だったから思い切ってここでループ抜けて
他のは直して無かったです。でもこれってgoto文と変わらないですね。
>>890 >でもこれってgoto文と変わらないですね
だから嫌う人もいるけど、私は手頃な妥協だと思う。
何よりも、retを使って見通しを悪くしてバグの原因を増やすことはない。
#勿論、このケースではgotoを使うべきではないのは言うまでもないけど。
「複数の出口」と「goto」を同一視するのは間違いだと思うけど。 breakやcontinueをgotoと同一視するならまだしも
returnは関数出口へのgotoとも言えるべ。 #実装も普通そう作るし。
gccで遊んでたのですが、以下のソースで /tmp/cclObBZ1.o: In function `main': /tmp/cclObBZ1.o(.text+0x20): the `gets' function is dangerous and should not be used. と怒られました。何が原因ですか? #include<stdio.h> void cpt(char *str); int main(void) { char ms[50]; printf("暗号化プログラム\n文字?:"); gets(ms); cpt(ms); printf("暗号化\n\t%s\n",ms); return 0; } void cpt(char *str) { while(*str!='\0'){ *str=(*str+3); str++; } }
>>894 そのくらいの英語、判らないならExcite翻訳にでも掛けなさいよ。
余りにも簡単すぎるから敢えてノーヒントで。
>>895 ええ、「危険だから使うべきでない」って書いてるのは分かりますが、
どう危険なのかなと思って。"原因"です。
>>896 なるほど、バッファオーバーランが起こる危険性があるですね。
gets()が危険だと警告が出ているのに、なんでソース貼るかな。 つーか、どうせしょぼい暗号を試すなら+3じゃなくて-1でIBMを入力してみればいいのに。
899 :
デフォルトの名無しさん :2005/11/17(木) 20:16:19
C言語を1(初級)から10(上級)まで学びたいのですが、オススメの本とかありますか?
getsが悪いとでるならscanfでも出るのかw ポインタの使い方を誤ると結構warでたりするが そこは配列の方が良いんじゃないか?
普通に使うだけでワーニングがでる関数 strcpy, strncpy, fopen, plitpath, sprintf, getenv, strcat, itoa
>>901 マジ?gccじゃ出ないんだが
strcpyでワーニング出るオプション教えてくれ
>>894 の、*str=(*str+3); は
*str = *(str+3)と書いてもいいんですよね?
>>903 いいえ、違います。
(*str+3)はstrが指す位置にある文字の文字コードに3加えた値になるが、
*(str+3)はstrの3文字先の値になる。
ところで*str=(*str+3);より*str += 3と書くのが一般的。
>>904 レスして頂きありがとう御座います。
そうなるのでしたか。考えが足りてませんでした・・・('A`)
全角スペースを半角スペース2個に変換するプログラムを書こうとしたら挫折してしまった… これって簡単?
俺の使ってるエディタで簡単に出来た。
>>906 どこでつっかかったんだ?
自分で途中まで書いたソースなり、フローチャートっぽいものなりを書き込めば、誰かヒント出してくれるかもよ。
n文字をm文字に置換するのが訳分からない。 イメージとしては 文字列 ABCDABBG 検索文字 AB 置換文字 NTT 置換結果 NTTCDNTTBG だけど、置換結果用に新しく大きな配列を用意する必要ありですか?
NTTの人ですか?
いや、IBOとかSTOとかFBIとか浮かんだ結果、 最後に残ったのがNTTだった。
>>906 system("sed -e 's/ / /g' inFile > outFile");
913 :
906 :2005/11/18(金) 00:19:59
>>908 下のプログラムを作ってみたけど、全部そのままコピーするだけになってしまいました。
ちなみにうちのcygwin環境だといろいろヘッダを足してもgetwcharとかはundefinedだと怒られて
コンパイルが通らなかったのでvc2005でコンパイルしました。
if(wch==' ')とか間違ってるんだろうけど""でも駄目でどうすればいいのやら、といった状態です。
>>912 できればCで書きたいのですが…
#include <stdio.h>
int main(void)
{
int wch;
while((wch=getwchar()) != WEOF){
if(wch==' ')
printf(" ");
else
putwchar(wch);
}
return 0;
}
>>909 char * replace1(char * dest, char const * source, const char * key, const char * repl)
{
char * p = strstr(source, key);
if (p) {
sprintf(dest, "%.*s%s%s", p - source, source, repl, p + strlen(key));
}
return p;
}
void replace(char * dest, char const * source, const char * key, const char * repl)
{
char * work = malloc(strlen(source) + strlen(repl));
strcpy(work, source);
while (replace1(dest, work, key, repl)) {
strcpy(work, dest);
}
free(work);
}
>>913 /* 空白だと見えにくいので「外」で */
int cho = EOF;
while ((ch = getchar()) != EOF) {
if (cho == "外"[0] && ch == "外"[1]) {
cho = 'タ';
ch = 'ト';
}
putchar(cho);
cho = ch;
}
if (cho != EOF) {
putchar(cho);
}
916 :
906 :2005/11/18(金) 00:53:33
>>915 うーん、うまく動きそうだけどこれもそのままコピーになってしまいます。
明日また試してみます。
917 :
デフォルトの名無しさん :2005/11/21(月) 05:44:26
>>916 まさか、タトを外に見間違えたって落ちじゃないよな。
>>918 if文中の外を全角スペース、タとトを半角スペースに入れ替えるんですよね?
それで無理でした。
ちょこちょこいじってみてもなんか駄目ですが、
>>915 でいけました?
>>920 試してない。うちに帰って気力があったら試してみるわさ。
922 :
915 :2005/11/22(火) 01:40:02
/* ほい、修正版 */ int ch; int cho = EOF; while ((ch = getchar()) != EOF) { if (cho == (unsigned char) "外"[0] && ch == (unsigned char) "外"[1]) { cho = 'タ'; ch = 'ト'; } if (cho != EOF) { putchar(cho); } cho = ch; } if (cho != EOF) { putchar(cho); }
制御プログラム(C言語)を扱う必要が出てきたのですが、 フォートランとVBをかじった程度の人間でも分かる参考書って どなたかご存知ないですか? 立ち読みした限り、「猫でも分かる」は結構難しかったっす
925 :
デフォルトの名無しさん :2005/11/23(水) 11:39:28
C言語のプログラムを作成中なんですが、 文字列で関数を指定する方法ってないですか? 引数でもらう値によって使う関数を変えたいので。 if文でもよいのですが(以下のように) sub(char c) { if(strcmp(c,"A")==0) { A(); } else { B(); } return; } 引数に関数名(c)が入ってくるので直接使えればなと思い。。。
>>925 お望み通りのものは無理。
関数テーブルを、関数名をキーにして持つって手もあるけど
その程度なら素直にstrcmpで分けた方がいい。
927 :
デフォルトの名無しさん :2005/11/23(水) 12:13:29
>>926 やっぱそうなんですかー。
なんかうまい手があるかもしれないと思っていたので残念です。
レスありがとうございました。
928 :
915 :2005/11/23(水) 13:42:48
いや、strcmp()じゃダメだろう。 その例なら、 void sub(char c) { void (*func)(); switch (c) { case 'A': func = A; break; case 'B': default: func = B; break; } func(); return; } ってところかな。
番号残ってた……
ホシュ
931 :
デフォルトの名無しさん :2005/11/24(木) 22:55:13
gccでdefineしたら無効だと怒られました。何ですか? #include<stdio.h> #define >= <= int main(void) { int a[5],f=0,i,w,j; printf("5つの整数をいれてください\n"); for(i=0;i<5;i++){ printf("%dつ目:",i+1); scanf("%d",&a[i]); } for(j=0;j<5;j++){ for(i=4;i>=j;i--){ if(a[i] <= a[i-1]){ w=a[i]; a[i]=a[i-1]; a[i-1]=w; } } } for(i=0;i<5;i++) printf("%d ",a[i]); printf("\n"); return 0; }
>>931 #defineで定義する名前は識別子でなければならない。
変数・関数名などと同じで英字・下線で始まり,2文字目以降はそれに加え数字が使える。
だから#define gt_eq <=のような例はいいけど、その例のように記号は無理。
要約:そんな#defineをするな!
934 :
デフォルトの名無しさん :2005/11/24(木) 23:52:18
#define ID_MAX 255
>>935 プリプロセッサにm4使ったり自作したりすればいいw
937 :
デフォルトの名無しさん :2005/11/28(月) 15:17:02
初級編: gets関数を使ってif文を作りなさい
そんなアバウトな
中級編: gets関数を使ってwhile文を作りなさい
そんなアバウトな
941 :
デフォルトの名無しさん :2005/11/29(火) 13:56:39
中級編: gets関数を使ってif文とwhile文を使った7行のプログラムを無理矢理作りなさい
いいかげんウザいんだよ しらけてる空気を読めよ馬鹿
945 :
デフォルトの名無しさん :2005/11/29(火) 17:44:28
>>937 ってネタ?マジでそんなことできるんですか?
できるよ。
>>1 が逃げたので、このスレはこれで終了します。
続きは沢山あるC言語のスレのどれかへ移動です。
まとめサイトまであるのに逃げたって・・・。
951 :
デフォルトの名無しさん :2005/11/30(水) 02:44:40
ksk
952 :
デフォルトの名無しさん :2005/11/30(水) 02:56:53
kwsk
たしかに最近のやりとり見てもここのスレで行う意味無いねぇ 宿題スレやC/C++室でやる方が人の分散も無く良いんじゃないかな 次を立てても廃墟の予感
>>955 いいじゃんかよーここもコテの私物から始まったんじゃん?
>>956 おまえのやってることはただの荒らし依頼だ
>>958 無関係のスレを次スレとして指定することに違和感ない?
両方のスレの合意を取るのが先だろう
両方Cを学んでいくスレじゃん。どこが無関係だっつーの。
>>960 いや、あっちの中身はスレタイとはかなりそぐわない。
俺はこのスレが好きなんだけどなあ。 とても勉強になったよ。ありがとう。
このスレ終わって欲しくない・・・嫌だ
久々にスレが伸びてると思ったら嵐だったってのは良くある罠
乱数で既に出た数字を再び出さないようにするには、 どのように処理すれば良いですか? 具体的にはトランプなどです。
int toranpu[52]={1,2,3,4,.......}
>>965 あらかじめ出るであろう数だけ配列作っておいて
出た奴は1にでもしてifで判定する
>>967 スイッチ立てまくるんですね。
>>968 CASLで取ったので見てませんでした。
見てみます。
俺のも立ちまくり
フラグ立てる方法だと、たまたま乱数が既出の数字と 同じものが連続して出てくるケースだといつまでたっても・・・ ということでシャッフルが終わる時間の保証がありません。 他のアルゴリズムを採用することをお勧めします。
配列にトランプの数字を入れる(1-13を4組、順番は問わない。) 0〜51までの乱数を発生させる その乱数の位置にある数がカードの山から取り出した数になる 取り出した数はもう2度と使わないので一番後ろの数とスワップする カードは51枚になったので0〜50までの乱数を発生させる ・ ・ ・ (以下繰り返し)
頭良いなぁ。
>>974 その方法は偏り具合が決まって出るのであまり良くない
どっちかというと
>>973 の方を薦める
丁度、今月のCマガでシャッフルについての連載があった希ガス
>>976 975ではないが解答編なら大丈夫っぽい
回答編も要素数に比例して時間がかかる
あ、正しくシャッフルできるかどうかではなく、時間が重要だったのね。 ワタシニポンゴヨクワカラナイヨ
>>980 まああれだ。文章は読むな、空気を嫁。と。
もっと容量のいい頭がほしいー(><。)
電脳化をオススメする。 それと、もっと早くプログラムを打ち込みたいなら 手の一部を擬態化するといい。
×擬態 ○義体
>>982 要領のいい頭じゃないことはよくわかった。
次スレよろ
次スレあるなら漏れ激しく頑張るからおせーて下さいね ここの問題4,5問やっと解けるようになってからのレベルがテラタカス
ム板にしては消費早いな
次スレ立ててもこの過疎り様じゃあな。
あとは宿題スレとかでいいんじゃないか? Cスレ立ちすぎ。
次スレほしいお…(´・ω・`)
次は猿スレで行います(^^) みんなきてねーwwwww
猿スレは断られただろ 移動するならおまえが説得してこい
猿スレは講師、生徒随時募集中なのでまったく問題ありませんよ(^^) なんでも反対したがるアフォは無視してみんなでもりあげてくださいね(^^)
いっぱいスレあるんだから各自好きな場所へ行けばいい。 解散。
>>994 関係者ならコテだせよ
あと断った奴を誤りに来させろ
キモイーなにそれー いやだねーあたまのおかしい人は(^^) こんなキモいヤシにコテ出したらつきまとわれるの確実wwww
埋め。
結局ポポ巣はC言語できるようになったのか?
おはようー! あたいのスペックは 26歳フリーター、パソコン歴インターネット歴は6年 しかしそれ以外の事は何もできにゃーい… というわけで今日から参考書を買ってがんばります! 今まさに私みたいに、これからCを勉強するぞって人いたら よろしくね!!! 前スレが一杯になりそうなので新しく作りました☆ 今日でC言語歴約2週間です^^; 簡単な文字の表示はできるようになったんですが 進むペースは亀さん並に遅いので、ゆっくり見守ってね(><。) もっと容量のいい頭がほしいー(><。)
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。