ぼるじょあがC/C++の宿題を片づけますYO! 19代目
1 :
ぼるじょあ ◆yBEncckFOU :
04/01/08 21:52 (・3・)アルェー 引き続きC++房のぼるじょあですYO!
わからない宿題を片づけますYO!
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2-10 】
2
3 :
デフォルトの名無しさん :04/01/08 22:47
またか
4 :
デフォルトの名無しさん :04/01/08 22:48
よろしくお願いします。c言語です 試験の点数を読み込んで、 出現度数をヒストグラムで出力する プログラムを作成しなさい。 出力例 00 - 09: 3 *** 10 - 19: 0 20 - 29: 2 ** 30 - 39: 0 40 - 49: 5 ***** 50 - 59: 7 ******* 60 - 69: 10 ********** 70 - 79: 2 ** 80 - 89: 4 **** 90 - 99: 3 *** 100 : 1 *
5 :
ぼるじょあ ◆yBEncckFOU :04/01/08 22:50
(・3・)エェー 名前欄にぼるじょあ#ぶるじょあって入れれば 君も今日からぼるじょあですYO!
6 :
ぼるじょあ ◆yBEncckFOU :04/01/08 22:52
(・3・)アルェー
>>4 には「試験の点数」がどこにあって、どんなフォーマットなのか書いてないYO!
これじゃ誰も問題が解けないNE!
すいません 「試験の点数」はキーボード入力です。 >どんなフォーマットなのか書いてない フォーマットの意味が分からないです。すいません とりあえず、この出力結果が出るやり方を一つ教えて下さい 4 :デフォルトの名無しさん :04/01/08 22:48 よろしくお願いします。c言語です 試験の点数を読み込んで、 出現度数をヒストグラムで出力する プログラムを作成しなさい。 出力例 00 - 09: 3 *** 10 - 19: 0 20 - 29: 2 ** 30 - 39: 0 40 - 49: 5 ***** 50 - 59: 7 ******* 60 - 69: 10 ********** 70 - 79: 2 ** 80 - 89: 4 **** 90 - 99: 3 *** 100 : 1 *
8 :
デフォルトの名無しさん :04/01/08 23:15
9 :
デフォルトの名無しさん :04/01/08 23:18
>>7 書式だよ。
コンマで区切るとかスペースでくぎるとか
>>9 さんへ
出力結果ですか? それなら先に示した出力結果
が出るようにお願いしたいです
プログラム内容なら
#include<stdio.h>
main()
{
int i=0;
printf("%d",i);
}
という感じですか。
すいません違ってたらまた教えて下さい
2分探索木における追加(挿入)、削除、検索のプログラムを作成せよ。 ただし、追加(挿入)、削除、検索はそれぞれ再帰を用いた関数でプログラムを作ること。 をお願いします。_| ̄|○
12 :
デフォルトの名無しさん :04/01/08 23:30
>>10 あっすいません。
それでは、
___ファイル___
4
12
45
89
____ファイル終り___
というふうに改行して
他の点数と区別するということで
お願いします。
_, ,_ パーン ( ‘д‘) ⊂彡☆))3・)
15 :
ぼるじょあ ◆yBEncckFOU :04/01/08 23:45
読み込みファイルオープン while(ファイルが終わるまで){ fgets(一行分読む); switch(atoi(バッファ)){ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: v00++; break; 以下省略 } }
case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: v10++; break;
18 :
デフォルトの名無しさん :04/01/09 00:07
>>4 エラーチェック無し しかもテストしていないのであしからず
#include <stdio.h>
int main()
{
FILE *fp=fopen("shiken_no_tensu","r");
char buf[1024];
int hist[11]={0};
int n,i,j;
while(fgets(buf,sizeof buf,fp)){
n=atoi(buf);
if(n==100)
hist[10]++;
else
hist[n/10]++;
}
for(i=0;i<10;i++){
printf("%d - %d: %d ",i*10,i*10+9,hist[i]);
for(j=0;j<hist[i];j++)
putchar('*');
putchar('\n');
}
printf("100: %d ",hist[10]);
for(j=0;j<hist[10];j++)
putchar('*');
putchar('\n');
return 0;
}
#include <stdlib.h>を忘れた
/* 入力は、改行区切りの数値。EOFまで任意の数を読み込む。 エラーチェック皆無*/ #include <stdio.h> #include <stdlib.h> int main() { int i,score[11] = {0}; char buf[80]; while(fgets(buf,sizeof buf,stdin) != NULL) { i = atoi(buf); if (i < 0 || i > 100) { printf("invalid value\n"); continue; } score[i/10]++; } putchar('\n'); for(i=0;i<10;i++) { printf(" %02d-%02d : %4d ",i*10,(i+1)*10-1,score[i]); while(score[i]-- > 0) putchar('*'); /* 出力例がこうなってるんだもん */ putchar('\n'); } printf("100 : %4d ",score[10]); /* スマートじゃないが面倒くさい */ while(score[10]-- > 0) putchar('*'); putchar('\n'); return 0; }
かぶっとった・・・・・・・
22 :
デフォルトの名無しさん :04/01/09 02:14
---- キーボードから入力した数値・数式を計算するプログラムを作成しなさい。 ただし、加減乗除算、三角関数、平方根は必ず入っていること。 さらに、最低一つはほかの機能を追加すること。標準関数は使用しないこと。 ---- C言語、GCC 入院していた関係で大学の授業について行けず。ぬぬぬ。 作成して頂ける方には、これを機に遅れを取り戻そうと思うので、 是非各処理に簡易的な説明のコメントをつけて頂けるとありがたいです。
標準関数使わないでデータ入力できるのだろうか…
24 :
デフォルトの名無しさん :04/01/09 03:20
確かに標準関数を使うなというのは意味不明。 数式を計算するってことは簡単ながらパーサを書けってことか。 たとえば、'1999 + 3' とテキストで入力すると、その答えが出てくる。
( ・3・) エェー 標準関数を作るのが課題の一部なんだYO 最近のUNIX USERの連載記事を読むといいNE
たぶん25さんの仰る通りなんじゃないかと思います。 printfやらscanfやらを使わずには不可能だと思いますし。 読み返してみましたが、やっぱり実際にそう書いてあるので 是非お願いいたしますm(_ _)m
もしかしてシステムコールやBIOSを直接呼び出して作るのか? すげーな…。
要するに標準でない関数は使ってよいわけだ。 適当なライブラリを持ってこよう(*^o^*)
>>22 の解釈
1)システムコールを使え
2)「他の機能」を実現するのに、標準関数は使うな
宿題だったら2)と解釈するかな。
あと、ツッコミ。
別段、理解したいと思わないのなら、遅れを気にすることは無い。
理解したいのなら、人に解いてもらってうのでは、遅れは取り戻せない。地道に時間をかけないとダメよん。
30 :
デフォルトの名無しさん :04/01/09 11:17
プログラムのフローチャートの作成方法がわかりません。 下記のようなプログラムのはどうつくればよいですか? パラメータとして2つの関数を与える。 2つの数値を比較し、大きいほうをコンソールに出力する。 大小比較部は、関数を使用する printf atoi 以上宜しくお願いします。
31 :
デフォルトの名無しさん :04/01/09 11:19
アーギュメントなどででてくる引数とは何をするものなのですか? 教えてください。
>>31 int main(int argc, char *argv[]) のことか?
通常は実行時のパラメータだね
argumentという単語に「引数」という翻訳を当てる。 よって「アーギュメントで出てくる引数」は「ベースボールで出てくる野球」。 一般論なら引数とは関数に値を渡すもの。 int sum(int a, int b){ return a+b; } ならば、c = sum(1,4); とするとcに5が入る。 main関数に対する引数は>33の通り。
>>22 の解釈
char cmd[512],eval[256];
printf("けいさんするよ>>"); gets(eval);
sprintf(cmd,"gawk 'BEGIN{print %s}'",eval);
system(cmd);
awkがだめなら、何か他を使え
36 :
デフォルトの名無しさん :04/01/09 13:41
>>26-29 パーサを書いたときに文字列を数値にするのにsscanf()とか使うなってことじゃないの?
25は違うと思う。
とりあえず「再帰的下向き構文解析」でぐぐれ。
より正確には、
アーギュメント(argument)=実引数
パラメータ(parameter)=仮引数
>>34 の例で言うと、
int sum(int a, int b){
return a+b;
}
このaとかbとかが仮引数。
c = sum(1,4);
この1とか4とかが実引数。
>>22 標準関数ってのは計算部分 ( math.h ) に限定してってことじゃないのかな?
数値変換部分はどのみち sscanf 相当の機能を作ることになるけど、
たとえば文字の判別に isdegit とかも使えないってのは横暴なような。
isdigitくらいなら作っても大した手間にもならんけど、mallocとか使うなと言われれば、それはそれで辛い。
やっぱり関数を自分で作れっていうことなんじゃないかと思います。 逆に標準関数を使用してよいなら簡単にできてしまいますので…。 いずれにせよ、此とは別にテストもあるので地道に頑張っています。
bisonのinfoに電卓のつくりかたが書いてあったような。
42 :
デフォルトの名無しさん :04/01/09 18:01
画像ボードからの画像情報をsimulinkブロックとして組み込みたいのですがどうも・・・ ボードの関数はCなのでs-functionを使ってDLLファイルまでは作成できたのですが、 実際(外部モードで)ブロックを動かそうと思うとうまくできません。RTWの設定?なの か・・・ こんな感じのデバイスドライバ,s-functionやA/D変換等にくわしい方はいますでしょうか?? よろしくデス!!
>>42 本当に「宿題」なのか?
どっちにしろ、意味不明瞭で何ともいえんが。
44 :
デフォルトの名無しさん :04/01/09 18:38
>>42 ( ・3・) アルェー 画像処理スレにも書いてあるYO
47 :
デフォルトの名無しさん :04/01/09 22:57
AVL木を作成したいと思ってますが、肝心の回転の操作が全然分かりません。 どなたか詳しい御説明を御願い致します。若しくは、良いサイトを教えて下さい。 宜しく御願いします。
48 :
デフォルトの名無しさん :04/01/10 00:14
14
49 :
デフォルトの名無しさん :04/01/10 00:14
◇鉄道関係者D氏の独白 私は,某鉄道会社に勤務する者でありますが...... 今回,どういう因果か情報システム部門に配置換になりまして。 ところが私は,ソフトだプログラムだ,まったくチンプンカンプンでありまして まずは練習がてら,座席の予約のソフトを考えてみなさいと上司から言いつかった分けでありますが.... まったくどこから手をつけてよいのか分からないのであります。 大変,当惑しておりましたところ,私の元の上司, いえ,私は元々,運転士なのですが..... のご令息が,名門A興大の情報で,ソフトウェアを研究なさっておられるとか。 この度,ぜひ,ご指南をいただきたく,参上したしだいであります。 はあ,教えるのは難しいので,ともかくご一緒に作っていただけると..... ありがたいお言葉 (; ;) はっ,まずどのような条件のものであるかですか。 はい。次のようなものであります。 まず,列車ですが,新幹線のような車両を想像していただきます。 一両のみの座席予約を考えることにいたします。 一両は,席が前から20列並んでおりまして,左側に2席,通路を挟んで右側に3席。 つまり全部で100席ございます。 同一車両内では,禁煙または喫煙のどちらかであります。 さて,予約でございますが,お名前と人数をお聞きして,席に余裕があれば,予約いたします。 席の名前は,前から1〜20列,左からA列〜E列となります。 そして,予約できた席番号をお知らせいたします。
50 :
デフォルトの名無しさん :04/01/10 00:15
これだけなら,私にもできそうでございますが,ここからが厄介なのでございます。 1人で来られた方は,ともかく座れればよいでしょうが,目的地によっては,窓側がよいか,通路側がよいか変わってきます。特に,3人がけの真ん中に座るのは,大変いやですね。 お2人で来られた方は,右側しか空きがない時や,通路を挟んでしまう場合が問題になります。 お3方(かた)の場合は,右側3列が連続でとれればよいが,そうでないと大変なことになります。 おお,こうやって考えていくと,どんどん眠れなくなりそうです。パズルのようです。 あまり大人数の団体は,考えないことにして,せいぜい10迄のグループであれば,なんとか希望を聞きつつ配置できるようにしたいのです。 乗車する人が,大変不利益になるような場合,たとえば3人掛けの真ん中になってしまうような場合は,△等を表示して,「それでもいいですか」と尋ねるようにしたいのです。 もちろん,席の予約状況は,ファイルに保存しておいて,いつでも参照できるようにしたいわけなのです。 おぼっちゃま,こんなに難しそうなことって,人間でも頭が破裂しそうなのに,コンピュータだとできるんでしょうかねえ。 だんだん,目の前が真っ暗になってきましぁ。トホホ。
無理でしょうか?
>>52 =22
絶対に無理ってことはないが、かなーり難易度が高く面倒くさいので、誰も手をつけたがらないよな。。。(俺も含めて)
標準関数を使うな、が一番のネック。
>>49-50 で、何が問題なわけだ?
座席予約システムは、現実に商売として成り立っているほどなので、
こんなところでどうにかしようとするのはお勧めできない。
一応、人間でもできる簡単な考え方を示すと、
2+3の5席に人数を割り当てる方法を考える。
2人なら2の席、3人なら3の席、4人なら1+3の席、5人なら2+3の席のように埋めていく。
5人以上は、5+n人に分割する。
これを、片側から1列ずつ埋めていく。
1人の場合、反対の方から埋めていくが、1列に1つの隙間があれば、そちらを優先する。
例:
1人→反対側1席、2人→1列目2の席、4人→2列目1+3の席、3人→1列目3の席、
1人→2列目1の席、で都合の良い例だが、片側から2列が埋まる。
>>49-50 何だこれ?
この手の出題方法を取るなら、問題に関わる条件 "全て" を
さり気なく且つエレガントに出題文に埋め込むべきものだと
相場が決まっているのだが、それが全く出来ていない。
0点だな。
>>53 後期の授業からプログラミングが始まったのでそれほど難しいことはさせないと思うのですが…。
どなたかいると信じてちょっとROMしてます。
初心者にライブラリ使うなっていうのも ある意味、学習には弊害だよな ライブラリの使い方から学ぶこといっぱいあると思うのに
すごい問題文の宿題ですねぇ。 社会人の宿題w
とっととクビに(ry いやいや、まあ勝手に頑張ってくれ。
>>56 >後期の授業からプログラミングが始まったのでそれほど難しいことはさせないと思うのですが…。
勿論ここにいる誰もが皆、そう思っている。
では逆に何故そんな「難しい」問題が出たのかと穿ってみれば、
おそらく
>>22 が問題を読み間違えたのだろうという推測に突き当たる。
「難しい」というよりは「砂を噛む」ような作業を延々と行って回答を作ったところで、
どうせ後から
>>22 が
「すみません、私の読み間違いでした。(藁
もう一度お願いします♥」
と言ってくるのは目に見えている。
一体誰がそんな問題にわざわざ手を付けようとすると思う?
いや、つけない♪(反語)
62 :
デフォルトの名無しさん :04/01/10 01:28
>>56 ところでOSはなに?
システムコールを使うとなるとOSがなんなのか知る必要があるんだけど。
63 :
デフォルトの名無しさん :04/01/10 01:31
もう22の問題の解答となるリンクは張られていると思うのだが。 たぶん標準関数を使わないは何かの間違い。
( ・3・) エェー 実はC++だったからcin,coutを使うんだYO
数値・「数式」ってあるから、トークン解析とか数値化とか そのへんに標準関数を使うなってことなのかも。
68 :
デフォルトの名無しさん :04/01/10 02:51
>>62 OSはVine Linux2.5とSolaris9です。どちらのOSを使用しても良いということになっています。
自宅の環境ではWindows上でcygwinを利用しています。
ファイル操作や構造体の講義の後にシステムコール使えとは考えにくいよなぁ。
それにシステムコール使わせるならOSも指定するでしょ。
>>22 友達はどういう見解?
標準関数を使用してはいけないのに、printfでdebugはいいの? 12/19にやった標準関数が気になる。 あと、12/12にやった平方根の計算は、自分で数値計算の プログラムを書いたの?
>>69 それを読んで分かった。
これは
>>22 が読み間違ったのではない。
出題者がアフォなだけだ。。。
(ま、やっぱり問題文は下手にいじらずに全て公開するのが解決への近道だな)
多少でもものを知っている人間なら、間違っても "printf文" なんて言葉は使わんよ。
とりあえず実践的な対応として、 12/19 に講義を行ったであろう
その先生独自の定義の「標準関数」とは何かを調べることだな。
ここの連中は「標準関数」 と言われれば ANSI などで定義された
「標準ライブラリ」を真っ先に思い浮かべるから。
>>22 また、他の推測として 12/19 に√の計算方法の講義を
行っているようだから、その点についてだけは "標準関数" を使うな、
という意味と解釈することも出来なくも無いな。
・授業でやった関数は標準のものを使うのではなく、自作する
・
>>22 は授業に出てないから何が授業出たものなのか知らない
もうだめぽ
>>75 まあ、待て。提出は 1/13 だ。
>>22 の情報収集(何が標準関数かを調べる)能力さえ高ければ、
その後のプログラム作成にかける時間は十分残されている。
・クラスメイトに講義で言及された数学関数について聞き出す
・
>>22 には、そういった情報を聞きだせる機会や友人がいるかどうかわからない
( ・3・) もうだめぽ
聞いてみたところ、 ・標準関数を利用しない電卓を作成 ・デバッグのみ標準関数可 √計算は標準関数を利用して作成。 ただし、今回の課題については標準関数を使用不可だそうです。 標準関数の定義はやはり60さんのいうANSIで定義されたものと同じようなことをいっていました。 友人曰く関数のプロトタイプ宣言あたりを使うのかもしれないといっていましたが…。
3つの山がありますね。 ・入出力関数 ・字句スキャン、パーサ ・数値計算 はぁ…。 関数のプロトタイプ宣言は何の関係もないよ。
ふむ、274教室で情報処理演習2か・・・芝浦工業大学? 誰かここに卒業生とかいないか?(w
81 :
デフォルトの名無しさん :04/01/10 04:53
あの先生みたいに降臨してくれないかな。
ふーん、講師はどうやらネットワーク屋みたいだな。 言語自体についての知識は足りないのかも。
83 :
デフォルトの名無しさん :04/01/10 05:09
LinuxかSolarisなんだよね。 まぁ!標準関数が使えないなら、cursesを使えばいい by マリー・アントアネット
read()やwrite()やsbrk()を使う宿題なのですか?>22
>>22 手間がかかるな・・・。
抜け道。
・どんなタイプの計算式か指定されていない。
・キーボードから入力する方法は指定されていない。
んだったら、
コマンドライン引数を逆ポーランド式として認識するプログラムを作成する。
これなら、規模も小さくできるのじゃないかな。
過去スレにも多くソース乗ってるし。
数学関数とstrcmp()くらいでしょ・・・代替の関数が必要なのって。
がんばれっあと、3日だ。(十分時間がある)
・字句解析(というかメイン)は、
>>44 を見れば作れる。
・自作の三角関数については、「近似 三角関数」でぐぐれ。
88 :
デフォルトの名無しさん :04/01/10 11:49
89 :
デフォルトの名無しさん :04/01/10 11:54
>>88 はぁ・・・
問題文に、
<条件>
1、分割コンパイルを行う(ファイルは3つ以上) <<<<<
と書いてあるから、わざわざファイル分割してくれてるじゃんよ。
/* main.c */から、/* list.h */までをmain.cというファイル名で、
/* list.h */ から /* list.c */ までをlist.hというファイル名で、、、
というように、ファイルを分割せよ。
分割コンパイルの方法が解りません、とか訊くなよ。
>>68 おまえも日本語ちゃんと読めるようになれよ♪
>>22 >>86 氏の方法が手っ取り早いと思う。
数学関数はどっかから拾ってきて勉強汁。
表示はcurces使う、ってところだな。
>>90 ためいきつきたくなる気もわからんことないが、ここは宿題丸投げスレだしな。
C言語を授業でやっただけだったりすると、分割コンパイルとかヘッダに何を書くべきかとか
わかってないやつが多かったりするよ。
>>92 ということで
>>90 の補足説明とかしてみるテスト。
書いてあるコードを、main.c, list.h, list.c, input.h, input.c に分割する。
分割する区切りは /* ファイル名 */ と書いてあるところ。
これらを同一のディレクトリに配置して、
cc main.c list.c input.c とする。
(cc は使用しているコンパイラのコマンドに置き換える)
で、できるはず。
書き忘れたが、単項の-には対応していない。 -7 と書く代わりに (0-7) と書いてくれ。
getchar(), putchar() が無かったら int getchar(void){ char buf; return read(0, &buf, 1) ? c : EOF; } int putchar(int c){ char buf = c; return write(1, &buf, 1) ? c : EOF; }
getcharのとこ訂正 return read(0, &buf, 1) ? buf : EOF;
まてまて、もちつけ
もれの
>>69 の解釈だが
追加する機能についてはsinとかsqrtとかの"標準関数"ではない何かを作れって話なのであろう?
例えばsum()とか
99 :
デフォルトの名無しさん :04/01/10 18:40
>>91 >おまえも日本語ちゃんと読めるようになれよ♪
意味不明、ばか?
>>94 コサインがまずくない?
double my_cos(double d)
{
return my_sin(d + PI/2); /* cos x = sin (π/2 ± x) */
}
あと結果が10000000000越えたらクラッシュするのは心臓に悪かろう…。
while(d > unit)
unit *= 10;
みたいにするとか…。
またお前らけんかしてるのかよ。 俺がいなくなるとすぐけんかなんかしちゃって おまえら恥ずかしくないのかよw いいかげん大人になれよこの adult children
>>100 突っ込みサンクス
済まんが、誰か治しておいてくれ。
103 :
デフォルトの名無しさん :04/01/10 20:23
_| ̄|○お助けください Cの問題です・・・ 「文字列の中の空白の位置で必ず改行するようにせよ」 という問題なのですが 以下で出来ません。エラーが出ているのですが原因が分からず。 #include<stdio.h> void print_string(char *p) { while(*p!=0){ if(*p==' ') printf("\n"); else putchar(*p); p++; } } int main(void) { char q; q="this is a pen"; print_string(&q); return 0; }
int main(void) { char *q; /*qは"this 〜"の先頭アドレス指すためにつかうんだろ? ならポインタ型だろうが。*/ q="this is a pen"; print_string(q); /*"this 〜"の先頭アドレスを入れたいんだろ? return 0; ならそのアドレスが入ったqを渡すんだろうが。*/ }
(*´д`*)皆さんどうもありがとうです ポインタに慣れるよう精進します
今なんで二人が争っているのかみたけど
>>109 が悪いな。
ビットシフトの問題なのですが #include <stdio.h> #define TEISU 5; void main(){ int a,b,c; a = (TEISU << 8) | 16 ; b = a >> 8; c = a & 0x00ff; } を実行すると「構文エラー : ';' が '<<' の前に必要です。」とエラーになってしまいます TEISUをそのまま5に置き換えるかあらかじめaに代入すれば通るのですが・・・ なぜエラーになるか説明できなくて困ってます どうかお力をお貸しください。
( ・3・) アルェー #define の末尾に ; がついているYO
ネタか ? プリプロセッサは、TEISUをそのまま5に置き換えるんじゃなくて 5; に置き換えるぞ。
真性?
>>112 を見ると、
>なぜエラーになるか説明できなくて困ってます
と書いてあるから、
>>112 の文書構成能力が非常に劣っているため。
が解答だな。
114は俺じゃないようわーん・゚(つД`)・゚。 でもありがとう
>22の宿題 conio.hの関数は非標準だし、gccでサポートされてるんでしょ? それ使っても無理?
>>122 なるほど。おかげで流れが読めたよ。
ちなみに漏れはどっちもどっち、に一票。
66が自分が言われたと勘違いして激昂したか 67がまちがって66を名乗ったか。 または確信犯(まちがって使われている意味で)か。 68にして見れば同感と、支持を示した相手から 煽られるというわけのわからん目にあってるんだから 正直、むかついたのだろう。
>>125 そのコードがコンパイルできたのがおかしい。
129 :
けい ◆mL2ZRk1cK. :04/01/11 16:28
130 :
けい ◆mL2ZRk1cK. :04/01/11 16:35
>>129 構造体習ってないの?
21..26について、任意の回数の入力をさせるには、
例えば、-1などのありえない入力を入力の終了と見なす方法がある。
で、11..16を関数化していれば、それを呼び出すだけですむ。
41..45の順位を計算するには、「自分より点数の高い者の数」を数えて、
それに1を加えるとかいう方法がある。
>>130 case 'A': は、大文字についてしか比較しないので、
case 'a': として、小文字についても比較してやる。
ここで、
case 'A': /* FALLTHRU */
case 'a':
と、breakを記述しないことで、直後のcase文の処理を行うことができる。
あと、アルファベットの入力とは関係なく、任意のコマンドが実行できるのだが、、、
133 :
デフォルトの名無しさん :04/01/11 17:52
正の整数nを与えるとそれを正の整数の和に表現する方法が何通りあるかを答えるプログラムで 1+1+1+5 1+1+5+1 1+5+1+1 5+1+1+1 はすべて同じとして数えます。 5と入力すると 7と出力されるのですが(7通り、 5, 1+4, 2+3, 1+2+2, 1+1+2, 1+1+1+1+1) 再起でやるにはどうやったらいいのか方針が立てられず…。 教えてください。よろしくお願いします。 C言語です。
135 :
デフォルトの名無しさん :04/01/11 18:45
同じです!ありがとうございました。感謝感激です。キタ━━━━━━┌(_Д_┌ )┐━━━━━━ !!!!!
>>119 ありがとうございました。おかげ様で課題に間に合いそうです。
あとはレポートとテストに向け、頑張りたいと思います。
>>120 >>94 のままではgccではなぜか不可でした。私自身のミスかもしれませんが…。
>>119 ではgccを含め、何れの環境でもところ問題なくコンパイルできるようです。
139 :
デフォルトの名無しさん :04/01/11 22:38
はじめまして、一人で考えてて頭が発煙してきたので知恵をいただきたいと思います。 ※ソースが長いと怒られたので、この後に投稿します。 このソース、結構似たり寄ったりな記述が多いのですが もっと無駄な部分を省いてコンパクトに出来ないでしょうか? どうかおながいします。
140 :
デフォルトの名無しさん :04/01/11 22:40
void CTask::HitCheck( CTaskInfo *p, eTaskPriority nPriority, bool getdamage ){ list< CTaskControlBase * > *task = p -> GetTaskController() -> GetTaskList(); CHitCheck<> hitchecker; for( list< CTaskControlBase * >::iterator it = task -> begin(); it != task -> end(); it++ ) int nMyPriority = ( *it ) -> GetPriority(); if( nMyPriority > nPriority ) break;// priorityに関して整順を仮定できるので超えていればそこでおしまい ef( nMyPriority == nPriority ){ if( hitchecker.CircleCircle( ( *it ) -> GetX(), ( *it ) -> GetY(), ( *it ) -> GetHitArea(), GetX(), GetY(), GetHitArea() ) ){ ( *it ) -> Damage(); if( getdamage ) Damage(); } } } } void CTask::HitCheckReverse( CTaskInfo *p, eTaskPriority nPriority, bool getdamage ){ list< CTaskControlBase * > *task = p -> GetTaskController() -> GetTaskList(); CHitCheck<> hitchecker; for( list< CTaskControlBase * >::reverse_iterator it = task -> rbegin(); it != task -> rend(); it++ ) int nMyPriority = ( *it ) -> GetPriority(); if( nMyPriority < nPriority ) break;// priorityに関して整順を仮定できるので超えていればそこでおしまい ef( nMyPriority == nPriority ){ if( hitchecker.CircleCircle( ( *it ) -> GetX(), ( *it ) -> GetY(), ( *it ) -> GetHitArea(), GetX(), GetY(), GetHitArea() ) ){ ( *it ) -> Damage(); if( getdamage ) Damage(); } } } }
141 :
デフォルトの名無しさん :04/01/11 22:40
long CTask::GetTargetAngle( CTaskInfo *p, eTaskPriority nPriority, long defaultangle, UINT num ){ list< CTaskControlBase * > *task = p -> GetTaskController() -> GetTaskList(); for( list< CTaskControlBase * >::iterator it = task -> begin(); it != task -> end(); it++ ) int nMyPriority = ( *it ) -> GetPriority(); if( nMyPriority == nPriority ){ double x = ( *it ) -> GetX() - GetX(); double y = GetY() - ( *it ) -> GetY(); return 512 * SinTable.Atan( abs( y ) < 1 && abs( x ) < 1 ? 1 : y, x ) / 65536; } } return defaultangle; } long CTask::GetTargetAngleReverse( CTaskInfo *p, eTaskPriority nPriority, long defaultangle, UINT num ){ list< CTaskControlBase * > *task = p -> GetTaskController() -> GetTaskList(); for( list< CTaskControlBase * >::reverse_iterator it = task -> rbegin(); it != task -> rend(); it++ ) int nMyPriority = ( *it ) -> GetPriority(); if( nMyPriority == nPriority ){ double x = ( *it ) -> GetX() - GetX(); double y = GetY() - ( *it ) -> GetY(); return 512 * SinTable.Atan( abs( y ) < 1 && abs( x ) < 1 ? 1 : y, x ) / 65536; } } }
142 :
139-141 :04/01/11 22:42
うは、今気づいたけどforの末尾の{が抜けてる… 各自脳内補完してください。
ef( nMyPriority == nPriority ){
C++でn!を計算するプログラムで、反復型と再帰型があるみたいなんですが、再帰型ってどういうものなんでしょうか?反復型はfor文で作れたのですが、再帰型というものがわかりません(><)ご指導お願い致しますm(__)m
int kaijou(int num) { if(num <= 1) return 1; return num * kaijou(num - 1); }
初心者を売りにしないでね。 再帰型 int func(int n) { if (n <= 1) return 1; else return n * func(n-1); }
151 :
デフォルトの名無しさん :04/01/11 23:48
>>150 ほうほう、ラオックスコンピュータ館にはりついていればあの人に会えるのか
152 :
デフォルトの名無しさん :04/01/11 23:50
すみません質問なのですが、以下のようなソースで クラス内のメンバ関数へのポインタを取得してそれを別のメンバ関数に渡し、 そこでポインタの指定先の関数を実行することって出来るのでしょうか? また、その際どういったソースを書けばいいのでしょうか? サンプルソース #include <iostream> using namespace std; class A{ public: void he( int i ){ for( int l = 0; l < i; l++ ) cout << "へぇ〜" << endl; } void main( void ){ ???? p ここでpへheへのポインタを代入 pを引数にexを呼び出す } void ex( ???? p ){ ここでpのさす関数(he)を呼び出す } };
153 :
デフォルトの名無しさん :04/01/11 23:53
>>152 そういうのはC++スレに逝った方が・・・
ありがとうございます^^。 あと、voidは返却値が無いという意味だと習ったんですが、どういう意味ですか?voidと打った後の文の所で終了ということですか?
前スレ839です 前回の問題 「10人分の電話番号を登録 そのデータ(名前と電話番号)を並び替えて2分探索で検索できるようにしてください 」 この宿題を提出したら、次はこの電話帳作成プログラムを次のように改良せよという宿題を出されました 1.電話番号、名前をファイルへ登録する 2.ファイルからデータを読み込む 3.データ構造として構造体を使うこと 4.データの形式はバイナリデータであること どうかお願いします
<・3・> Pascalでいえば、procedureだYO
>>156 お前、そうやって一生過ごしていくつもりか?
>>156 逐次処理で、書き込んでから読み出すのか。意味不明だな。。。
まあ、頑張ってくれ。
>>156 えーっと。提出したものとか、ベースになるもののソースをくれ。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX_NAME 255 #define MAX_TELNO 24 #define NUM_RECORD 10 typedef struct { char name[MAX_NAME]; char telno[MAX_TELNO]; } RECORD; int compar(const void *p1,const void *p2) { RECORD *r1=(RECORD *)p1,*r2=(RECORD *)p2; return strcmp(r1->name,r2->name); } int main(void) { RECORD key,rec[NUM_RECORD] = { {"Claude","*1"},{"Robert","*2"}, {"York","*3"},{"Walter","*4"}, {"Karen","*5"},{"Andy","*6"}, {"Zen","*7"},{"Nancy","*8"}, {"Donald","*9"},{"Erie","*10"}}; RECORD *result; qsort(rec,NUM_RECORD,sizeof rec[0],compar); printf("Input search word = "); gets(key.name); if((result = (RECORD *)bsearch(&key,rec,NUM_RECORD,sizeof rec[0],compar)) != NULL) printf("%s %s\n",result->name,result->telno); else printf("%s not found\n",key.name); return 0; } これです
>>161 相変わらず粘り強いなぁ。
キミは営業向きかも。まじで。
ぼるじょあスレは荒れるのぉ。 さてと・・・あたりまえだが、答える人たちには答える義務はない。 質問する側は、答えをもらえるように、うまく聞くこと。
164 :
デフォルトの名無しさん :04/01/12 04:43
>>152 staticじゃないメンバ関数のポインタは普通得られないよ。
staticなメンバ関数を経由して呼び出すとか抜け道はあるらしいけど。
>>164 >普通得られないよ。
例外的に得る方法があるの? < 非static メンバ関数
>>164 嘘言うな。
typedef void (T::*mfunc)(void);
mfunc p = &T::hoge;
(this->*p)( );
168 :
デフォルトの名無しさん :04/01/12 05:27
>>166 Tってクラス?
インスタンスを作っていないのにメンバ関数だけ呼べるの?
169 :
デフォルトの名無しさん :04/01/12 05:34
>>165 http://www.sun-inet.or.jp/~yaneurao/intensive/ggg/log2.html C++で、あるクラスの非staticなメンバ関数にコールバックしようとすると、
thisポインタが必要になってきます。
このthisポインタとセットで関数ポインタを渡しておかなければなりません。
おまけに、メンバ関数ポインタのサイズは、一般に固定ではありません。
(スーパープログラマへの道 第94回を参照のこと)
よって、これを汎用型にキャストするようなことは出来ないのです。
このような汎用型が無いから、
無駄にテンプレートを持ち出さなくてはならなくなるのが、
C++の悪いところです。
だそうです。
thisポインタがあればいいみたい。
>>168 つーか、インスタンス作っていないなんて仮定はどっからきたんだ ?
あ、ちなみに辞書順とは”アルファベット順”という意味です。
うーむ。文字列のソートだと、
char *array[] = {"a", "b", "c"};
てな、配列でやりたくなるんだが・・・
二次元配列ってどーゆー感じなんでしょ?
>>171
>>173 char array[][20] = {"aida", "adachi", "amano", ... }; って感じじゃないの ?
文字列ごと移動させるのは、効率悪いからどうしても各々の文字列の先頭を指す配列を用意してそれをソートしたくなるけど、まあ宿題だから。
このスレ見てて思うんですけど、C++少ないですよね。 学校でC++って扱わないんですかね。
C++をならったけれど、結局講義ではクラスはおろか、構造体までいかんかったよ。 std::stringすら習ってねぇ。 大学でならったが、オレの年度と次の年度入学のやつだけだったな<C++
実際問題としてあれだけ肥大化した言語仕様だと 半年の講義では扱えないし。 C言語知っている前提ならともかくね。 大学で Java が教えられるのもわかる。
「"Programming Language C++ 3rd ed."買え!」とか言って 演習問題も流用して1年で終わらせたりとか、無理?
現実の大学その他の講義の形態を多少なりとも想像してみろ。 世の中お前のお気に入りの言語を わざわざ広めるようにはできてない。
182 :
デフォルトの名無しさん :04/01/12 23:15
あのー、しゅくだいで、 あなたの携帯電話のアドレス帳機能をC++言語にしなさい。 ってのがあるんですけど。とりかかることもできません。 これってかんたんですか? ちなみに、詳細なきのうは”あなたの携帯電話のアドレス帳機能” としか、ないのですが。
わたし、携帯電話持ってません。・・・って人はどーすりゃいーの?
>>182 手順
1.お前の持ってる携帯電話のアドレス帳に登録できる情報を書き出してみる。
2.お前の持ってる携帯電話のアドレス帳の機能を書き出してみる。
大きく分けて、登録系の機能と検索系の機能があるはずだ。
3.お前が適切と思うクラス構成を考える。
4.お前が思うようにコーディングする。
登録された電話番号に電話をかけることは、 C++標準の機能ではできません。
187 :
デフォルトの名無しさん :04/01/12 23:51
182ですが、通信系の機能はいりません。 番号もアドレスも3件あって、名前に住所に生年月日は最低入れたいです。 検索もできて、一覧の表示もしたいです。
ShellExecute("address.xls");
それが簡単かどうかはあなたのスキルよります。 ちなみに同一の属性に複数のアイテムを詰め込む場合は そうでない場合に比べて(実装よりインターフェイスが) あなたが思っているより厄介になります。
>>187 >>184 読んだ?
煽りっぽく書いてあるけど、最低限1.および2.の項目を「具体的に」示さないと、
やってみようという奇特な人も現れないよ。
検索したい、じゃなくて、メモリ番号による検索、とかいろいろあるでしょうが。
>>191 あとマージソート作れば完成というところで、ほったらかし。
>>192 そうか。
放置されてたから俺やってみようと思ったんだけど面倒くさいなこれ…。
>>192 すみません.参考にさせてもらいたいので,どこかにうpしていただけませんでしょうか?
195 :
デフォルトの名無しさん :04/01/13 00:49
>>196 夜分遅くにありがとうございました.とても参考になりました.
int merge(char (*tbl)[DATASIZE], int numOfTbl) { char (*x)[DATASIZE]; int p,i,l_cnt,r_cnt; int l,r,n; if(tbl==NULL || numOfTbl<=0) return 0; /* ←念のため */ if(numOfTbl==1) return 1; n=numOfTbl/2; l_cnt=merge(tbl,n); r_cnt=merge(tbl+n,numOfTbl-n); x=malloc(numOfTbl*sizeof(char [DATASIZE])); for(l=r=p=0; l<l_cnt && r<r_cnt; ++p){ if(strcmp(tbl[l],tbl[n+r])>0) memcpy(x+p,tbl+n+(r++),DATASIZE); else memcpy(x+p,tbl+(l++), DATASIZE); } if(r<r_cnt) for(;p<numOfTbl; ++p) memcpy(x+p,tbl+n+(r++),DATASIZE); else for(;p<numOfTbl; ++p) memcpy(x+p,tbl+(l++), DATASIZE); for(i=0; i<numOfTbl; ++i) memcpy(tbl+i,x+i,DATASIZE); free(x); return numOfTbl; }
199 :
デフォルトの名無しさん :04/01/13 06:54
>>199 ああ、すごくわかりやすいページであるな・・・。
「理解させようとして教えている」センセだね・・・。いいなぁ。
さて。課題がいっぱいあるんだが、どれをやればいいのかな?
できれば12-a1,12-a2,12-a3,12-b,12-cをやっていただきたいのですが・・・。 甘えてしまってすみません。
ttp://www.j.dendai.ac.jp/~mouri/prog2/writing/index.html ttp://www.j.dendai.ac.jp/~mouri/prog2/consulting/index.html ふむ。東京電気大の子は、この程度も自分でやろうとしないと。
甘えてるとわかってても、引かないわけね。
(大学の評判落とす→自分の評判を落とすと、なぜわからんのだろう・・・)
いちおうこの回答を毛利センセにちくっとくね。
int wa(int n) {return (n+1)*n/2}
int wa(int n) {int i, sum; for (sum = 0, i = 1; i <= n; i++) sum += i; return sum;}
int wa(int n) {if (i <= 1) return 1; else return i + wa(i-1);}
void inttoBin(int x, int b) {if (b) {inttoBin(x, b << 1); putchar(x&b ? '1' : '0');}}
int tekitou(int x, int n) {if (x < 0) {putchar('-');tekitou(-x, n);} else if (x < n) {
putchar('0'+x);} else {tekitou(x/10, n);putchar('0'+x%n);}
ふと思い出した。 昔、転職したてのCの経験ありのプログラマに力試しを兼ねてちょっとした関数を作ってもらった。 そうしたら、初心者としてはそこそこの時間でそれなりに使えるものを書いてきた。 安心して今度は一日分くらいの分量を渡してみた。 丸二日かかって頓珍漢なものができあがってきた。 何より奇妙なことに、コーディングスタイルが一定していなかった。 結論から言うと、最初の関数も含めてメールで(彼女曰く)友人たちに質問し捲くった結果だった。 別の事情と併せて、お帰り願った。 できないものをできないと言ってくるのなら教えることもできるが、 それさえしないのであればできることはなにもないと痛感した。 #長文愚痴スマソ
大金センセのこともあるし、冗談に聞こえんな。
>>202 学校名がバレるよーなことはしないよーにね。
>>199 んー。居ますね、そーゆーヒト。よくわかる愚痴だ。
>>203 できないものを、質問するのは当たり前だけれど。
答えが得られないときに、ダダこねるやつも最低だよねぇ・・・。
ぐぐれ、とか、この本に載ってるっていったら、ぶーたれるやつの多いこと。
オレも愚痴すまん。
205 :
デフォルトの名無しさん :04/01/13 10:15
おいおい、PGも含め仕事ッ注文は、人脈を含め、どんな手を使ってでも、 期日内にモノを仕上げる気骨が第一だろ? 変化の激しい業界で、知っている、知っていないなんて、大した問題じゃ ないと思うが。 どうせ、教える肝ね円だろ?あんた、ウニックス気取り猿か?
>>205 そーゆーあなたは、人に有益な情報を提供してるか?
出来ないやつがダダこねるときのへ理屈そのままだぞ?
マ板でやれ
>>208 1/20 13:30らしい。一週間もあれば自力でどうにでもできそうな問題だが。
>>209 ぱっと見かなりめんどくさそうと思った俺は情報系学部のM2・・・
「ファイルから読み込み」と「ファイルから読み込み&ファイルへ書き出し」 という二つの課題があるんですが、何をどうすれば良いのかさっぱりわかりません
>>210 別に情報系学科はプログラマ養成所じゃないから恥じることはない
216 :
デフォルトの名無しさん :04/01/13 18:10
218 :
デフォルトの名無しさん :04/01/13 18:41
Digital Mars C++の コンパイラをダウンローをしたけど 使えません。どうやって使うんですか
スレ違いです。 それから、ダウンロードした方が良いと思います。
220 :
デフォルトの名無しさん :04/01/13 18:48
すれ違いすみません。 で、どうやってすればいいんすか?
223 :
デフォルトの名無しさん :04/01/13 19:02
↑手本見せろよ
225 :
デフォルトの名無しさん :04/01/13 19:17
ある集団の試験の結果を配列に入力した後,以下を出力するプログラムを作成せよ. 平均点と標準偏差 各個人の得点とその偏差値得点 ただし,負の数値を入力したときに実行を終了するものとせよ. データ x に対する偏差値得点(deviation score) y は平均をμ,標準偏差をσとしたとき以下で計算できる y = 50 + 10(x – μ)/σ n得点は,予め20個程度のデータが入っているファイル (たとえばinput.txt)を作成して,キーボードの入力の代わりとせよ.
226 :
デフォルトの名無しさん :04/01/13 19:17
↑すみません・・・。 おねがいします。
>>212 「ファイルから読み込み」
プログラム < ファイル
「ファイルから読み込み&ファイルへ書き出し」
プログラム < inファイル > outファイル
>>226 まだいたのか・・・
Borland C++ compilerでいいから落とせ!
で、programing studioっつーシェアウェアあるから金払え!
・・・釣られてるような気がしてきたよ・・・
230 :
デフォルトの名無しさん :04/01/13 21:23
>>228 ヒントは必要ない場合無視して良いそうです。
大変助かりました、ありがとうございました。
>>224 ありがとうございました。
勉強になります(`・ω・´)
unlha32.dll, unzip32.dllを使用し圧縮、回答プログラムを作製せよ ソフトはVC++です。お願いいたします
>>205 そうだよ、
>>203 は「今度は一日分くらいの分量を渡してみた。」の結果に満足できないからそいつにお引取り願ったんだよ。
そいつがもっといい友人を持ってたら、よかったのにね。
>>225 作るには作ったが、、、前スレで根本的に解らんとか書いてるしな。。。
いや根本的でもある程度は知っていると思う。
授業は一応うけているのである程度はわかってます。
>>233 int main()
{
system("compress unlha32.dll");
system("compress unzip32.dll");
return 0;
}
あ、VC++だった…まーいーや。
>>225 こんなもんで。
#include <stdio.h>
#include <math.h>
int main() {
int i,sum = 0,count = 0,score[100]; /* とりあえず100人でお茶を濁す */
double d,ave,sd = 0.0;
while(scanf("%d",&i) == 1 || count < 100) {
if ( i < 0 ) break; score[count++] = i; sum += i;
}
if (count > 0) {
ave = (double)sum / count;
for(i = 0;i < count; i++) { d = score[i] - ave; sd += d * d; }
sd = sqrt(sd / count);
printf("平均 = %f\n標準偏差 = %f\n",ave,sd);
for(i = 0;i < count; i++) printf("No.%d = %f\n",i,(score[i]-ave)/sd*10+50);
}
return 0;
}
240様!感謝でございます。
レスくださった方々ありがとうございます 自分は諦めて留年します またどこかでお会いしましょう
>>242 まあ、そう言わずに。
どういうファイルをどういう形式で読み込むのか、
読み込んだファイルをどういう形式で書き出すのかを
書かなければ誰も解けませんよ?
あの〜
>>212 さんの問題凄く心当たりがあるんですが僕もその課題でてるし^^;
プリントに問題があって内容は仕様 授業中に説明とか記してある
例えば、 ・C++を使ってよい ・ただのテキストファイルを読み込んでそのままただテキストファイルに書き出す と仮定すれば、 #include <algorithm> #include <fstream> #include <iterator> int main() { using namespace std; fstream in("in.txt"), out("out.txt"); copy((istreambuf_iterator<char>(in)), istreambuf_iterator<char>(), ostreambuf_iterator<char>(out)); return 0; } で要件を満たすと思うけど…だめ?
ヘンな時間に目覚めてしまった。 朝飯前に解いてやるから、問題よこせ。
Addicted to C++氏に質問。C++のオススメ本とかオススメサイトあります?
ああ、結局、メシ作って喰ったよ。 これから、出かけるんで。期待に添えない。
250 :
デフォルトの名無しさん :04/01/14 12:32
ニュートン法を用いてX/2-sinX=0 X-logeX=0 X^3-3X+2 を解け すみませんお願いします
logeは底がeの対数かな。
ああ、後スマンが、3つの式それぞれの微分を教えてくれ
>>250
>>251 >logeは底がeの対数かな
はい。そうです。
1/2-cosX=0 1-1/X=0 3X^2-3
どうかよろしくお願いします。
いやらしい問題だねぇ。
ってのは、解が複数ある場合や、解なしのときがあるから。
そういうとき、どうするか、指示がありましたか?
>>250
解が複数見つかる場合は2つまたは3つまで探し当ててから値を表します。 そして、解の捜索範囲の打ち切り誤差は0.001で行い有効数字は6桁で見つからない場合は解なしと判断してよいとの事です。
>>250 結構、条件だされているみたい。
授業で例題やってると思うんだけれど、そういうものがあったら、見せて。
こんなのなんですが作ってくださいませんか? 配列のデータを昇順に並び替える関数を作りなさい。 ただし配列のデータは誕生日とし、月と日を2つの配列に入力してから 関数を呼び出して並び替えなさい。 関数についてはまだまだ未熟なんでお願いします。
>>258 「月と日を2つの配列に入力して」っていうのは
「n番目のデータはmonth[n]月 day[n]日」
みたいな形式にするってことですか?
260 :
デフォルトの名無しさん :04/01/14 22:35
/*list.h*/ truct ADDRESS ↑つりか?
ワロタ
宿題丸写しなら、しっかりうつそーね。
>>258 void sort(int *m, int *d, int numOfTbl)
{
int i,j;
int tmp;
for(i=0; i<numOfTbl-1; ++i)
for(j=i+1; j<numOfTbl; ++j)
if(m[i]*100+d[i]>m[j]*100+d[j]){
tmp=m[i]; m[i]=m[j]; m[j]=tmp;
tmp=d[i]; d[i]=d[j]; d[j]=tmp;
}
}
どなたかお願いします。 英文が書かれたテキストファイルを入力として、 テキスト中の英文を元とは逆順に、一行ずつ改行して出力するプログラム。 例えば 入力: The other one? Ah, yes here it is, but it's in the top pocket. You'd better put some on, too, and then we can start getting the vegetables ready. 出力: You'd better put some on, too, and then we can start getting the vegetables ready. Ah, yes here it is, but it's in the top pocket. The other one?
(Q1) 一行ずつ? 一文ずつ(.と?を区切りとする)か? (Q2) クオテーション("")は含まない?
>>267 出力は一行ずつです。.!?が区切りです。
""は考えなくても大丈夫です(問題には余力があればとのことなので)。
お願いします。
×一行ずつ ↓ ○一文ずつ
リンクリストを使うがよい
サイズ上限とかグローバル変数とか使ってるけど 課題のレベルだとこの程度で良さそうだな。 #include <stdio.h> #define TEXTSIZE 4096 #define SENTSIZE 128 char text[TEXTSIZE];// 文章バッファ int size; char* sentences[SENTSIZE];// 文リスト char* mystrtok(char* str){ while( *str != '\0' ) { switch(*str){ case '\n': *str = ' '; //元の改行は空白に変換 break; case '.': case '!': case '?': return str; } ++str; } return str; }
void printline(char* f, char* l){ while( f != l && *f != '\0' ) { putchar(*f); ++f; } putchar('\n'); } int main(void) { int i; //読み込み fgets(text,TEXTSIZE,stdin); //リスト化 sentences[0] = text; for(i=1; *sentences[i-1] != '\0' && i<SENTSIZE;++i) sentences[i] = mystrtok( sentences[i-1] ) + 1; size = i; //書き出し for(i=size-1;i>0;--i) printline(sentences[i-1],sentences[i]); return 0; }
273 :
デフォルトの名無しさん :04/01/15 07:47
>>261 すいませんlist.hのほうのスペルミスは分かったんですが
main.cの方はなぜおかしいんでしょう?
274 :
デフォルトの名無しさん :04/01/15 08:04
>>273 スペルミスによりADDRESS構造体の定義が存在しない状態だから。
275 :
デフォルトの名無しさん :04/01/15 16:04
ファイルを読み込んで、2分探索を行う課題がでました。よろしくお願いします。 ファイルの中身は 氏名 TEL 住所 誕生日 の欄が10人分あります。 実行結果は、このようにしてください。 誕生日の月日を入力してください。10 10 池田 090-5555-5555 10月10日 と出力するプログラムです。お願いします。
277 :
デフォルトの名無しさん :04/01/15 16:18
>>276 書式は自由です。
ただ、誕生日の数字を入力し、氏名などをだすだけですので。
おねがいします。
>>277 qsort、bsearchって使っちゃダメ?
だめぽ。
>>279 態度でけーな。そんなら自作するぞ?
おぅ?
そんな〜、
>>279 は漏れじゃないですよ。
・。゚(゚´Д`゚)゜。
お前らツマンネ
xのy乗を計算する関数powerを作成せよ、ただし、 変数x、yと関数の型はともにint型とし、yには生の数を指定することにする。 この問題おねがいします。。
#define raw signed int power(int x, raw int y) { int ret = 1; while(y) ret *= x; return ret; }
#include<stdio.h> int power(int x,int y){ int v=x,i; if(y<1){ printf("yは生ね。\n"); return -1; } for(i=1;i<y;i++) v*=x; return v; } int main(void){ printf("%d",power(3,4)); return 0; }
>>285 だよな。
やっぱ、クリームは生クリームに限るよな。
プリンの上にのっている生クリームなんて最高!!
#define raw unsigned int power(int x, raw int y) { int ret = 1; while(y--) ret *= x; return ret; } ごめんこっちが正しい。
290 :
名無しさん@Vim%Chalice :04/01/15 18:46
>>284 これで2の10乗が出る.但し Y は負の数には出来ないという弱点アリ
#include <iostream>
template <int X, unsigned int Y>
struct Power { enum { value = X*Power<X, Y-1>::value }; };
template <int X>
struct Power<X, 0> { enum { value = 1 }; };
int main()
{
std::cerr << Power<2, 10>::value << "\n";
return 0;
}
ゲ、なんだ、yは生の数で良かったのか(w
int power(int x, int y) { #include <math.h> return (int)pow(x, y); }
293 :
デフォルトの名無しさん :04/01/15 19:01
こういう問題なんですが、、 文字列aの中にtheというつづりが何個あるか調べるプログラムを作れ。 単語のつづりの一部分に含まれている場合も考える。 ただし、単語のくぎりは「アルファベット以外の文字」で判断できるとする。 助けてください!!今日の23時までなんです。
295 :
デフォルトの名無しさん :04/01/15 19:09
ポインタ変数をもちいて char*a="hello c word"; により初期かされた文字列定数に格納された文字列のうち'h'の文字と8文字を大文字に変換せよ。 この問題お願いします。
>>293 hoge thethe piyo
これは1つとして数えるの?
それならだめだけど
単純にtheの数だけでいいなら
#include<stdio.h>
#include<string.h>
int main(void){
char s[1024],*pat="the",*p=s;
int count=0;
printf("文字列入力\n");
fgets(s,1024,stdin);
while((p=strstr(p,pat))!=NULL){
count++;
p+=strlen(pat);
}
printf("count:%d",count);
return 0;
}
>>293 >ただし、単語のくぎりは…
とあるが,単語の区切りを判別する必要なんてないじゃん。
本当にそれで問題あってるのか??
>>293 その定義からすればtheという文字が
複数の単語をまたいで現れることはありえないんで
単語の区切りって意味ないような気がするんだが
問題文は本当にそれだけか?
>>295 まずchar *a="mojiretu";
では配列の書き換えはだめ。
あと8文字を大文字変換ってなに?
300 :
デフォルトの名無しさん :04/01/15 19:31
問題前全文かきますね。 文字列aの中にtheという綴りが何箇所あるか調べるPROGRAMを作れ。 まず最初は then father のように単語のつづりの一部分に含まれている場合 を除いてtheという単語だけを数えるPROGRAMをつくれ。ただし単語の 区切りは「アルファベット以外の文字」(や記号、符号)で判断できるとする。 入力の長さを制限しない。改行を含む文章を入力できる。(どうしても無理な場合のみ、文字数を制限してよい) 「単語の区切り」は、スペース(' ')又は改行('\n')のみ考えればよいとする。 strcmp等は使用しない。
301 :
デフォルトの名無しさん :04/01/15 19:32
行列のはきだし法をプログラム化せよという宿題が出ますた a[4][5]で 4 4 6 8 8 6 2 -4 4 12 4 6 8 12 8 0 -4 -4 4 6 のはきだしを実行せよ ただし使えるのはstdio.hのみ 神様仏様2chさま…おながいします
つまり 1 単語"the"を数えるプログラム 2 単語の一部に"the"という綴りが現れた回数を数えるプログラム と2つあるわけだな。 教官は2の方が単語の区切りを考えない分かえって楽ってことに気づいてないのだろうか? それと単語の区切りの定義が問題文中で変化しているんだがどっちだ?
>>300 string.h使っちゃダメなのかよじゃあ漏れの
書いたのだめか・・・
まあ
char *my_strstr(char *s,char *p){
char *cs=s,*cp=p;
while(*s){
while((*cs==*cp)){
cs++; cp++;
}
if(*cp=='\0') return s;
s++;
cs = s; cp = p;
}
return NULL;
}
これをつけたしゃできるんだが、だめだろうな。
一応、文中の the を無差別に数える。 #include <stdio.h> void func_0(char); void func_t(char); void func_th(char); void func_the(char); int count = 0; void (*next_func)(char) = func_0; void func_0(char c) { next_func = (c=='t')? func_t : func_0;} void func_t(char c) { if(c=='h') next_func = func_th; else func_0(c); } void func_th(char c) { if(c=='e') next_func = func_the; else func_0(c); } void func_the(char c) { count++; func_0(c); } int main(void) { int ch; while( (ch = getchar() ) != EOF ) (*next_func)(ch); printf("count=%d\n",count); return 0; }
305 :
デフォルトの名無しさん :04/01/15 19:39
>>301 です。携帯で書いたら、とっちらかったみたいで… 帰ってから書き直します
306 :
デフォルトの名無しさん :04/01/15 19:43
2 単語の一部に"the"という綴りが現れた回数を数えるプログラム 「単語の区切り」は、スペース(' ')又は改行('\n')のみ考えればよいとする。 というのが優先のようです。
まあ1も実際は <デリミタ>,t,h,e,<デリミタ> というパターンを文章中から検出ことに相当するわけだが。
遅そうだが。 #include<stdio.h> int main(void){ char s[1024],*p; int ch,i=0,count=0; while((ch=getchar())!=EOF){ s[i++]=ch; } s[i]='\0'; for(p=s;*(p+2);p++) if(*p=='t'&&*(p+1)=='h'&&*(p+2)=='e') count++; printf("count:%d",count); return 0; }
遅くないか別に。
こんな問題がでました 整数型配列の中に10人分の得点データ(0〜100)を初期値代入し、50点以上 の点数の人だけの人数、およびそれらの合計と平均値を求めて出力せよ ただし、全人数(10)はマクロ定義を用い、平均値は実数値で求めなさい
その合計と平均って50点以上のやつの?全体の?
312 :
theをかぞえる :04/01/15 20:53
あのーすいませんが教えてもらったプログラムを実行してみると 28:prase error at end of input と出るのですが、、、
50点以上の合計と平均値です。
一つのテキストファイルに4096個の数字のデータがります。 これを64個(8×8)の数字データを一まとまりとして、4096のデータを DCT変換したいんです。DCT変換を行う関数はできています。 *下のは64個のデータをDCT変換したプログラム例なんですけど、 これに手を加えて、完成させたいんですけど、どなたか、お願いします。 for( i=0; i<64; i++ ) scanf( “%d” , &input[i ] ) ; dct ( input, dct_data ); /*dct変換を行う*/ for( i=0; i<64; i++ ) printf( “%d” , dct_data[i] );
>314 ひとまとまりの64個は連続して並んでるの? 8x8のDCTというと、Jpegのような区画処理を連想するんだけど、 それなら、一行当たりのデータ個数が必要だよ。
>>275 のやつ
/* ファイル書式:氏名 電話番号 住所 0115\n */
#include <stdio.h>
struct DATA { unsigned char name[80];unsigned char tel[24]; unsigned char addr[80];unsigned int birthday;};
int main() {
struct DATA data[10],work;char *filename = "hoge"; /* 適当に変えれ */
FILE *fp; unsigned int i,j,key,m,d,mid;
if((fp = fopen(filename,"r")) != NULL) {
for(i = 0; i < 10; i++) fscanf(fp,"%s%s%s%d",data[i].name,data[i].tel,data[i].addr,&data[i].birthday);
fclose(fp);
/* バブルソート */
for(i = 0;i < 9;i++) for(j = 1;j < 10;j++)
if(data[j-1].birthday > data[j].birthday) { work = data[j]; data[j]=data[j-1]; data[j-1] = work;}
printf("誕生日の月日を入力してください(月 日) >"); scanf("%d%d",&m,&d); key = m * 100 + d;
/* 二分探索 */
i = 0; j = 9;
while(i < j) { mid = (i + j) / 2; if(data[i].birthday < key) i = mid + 1; else j = mid; }
if(data[i].birthday == key) printf("%s %s %s %d月%d日\n",data[i].name,data[i].tel,data[i].addr,m,d);
else printf("見つかりません\n");
} else { printf("%sが開けません\n"); }
return 0;
}
>314 連続なら for( j=0; j<64; j++) { for( i=0; i<64; i++ ) scanf( “%d” , &input[i ] ) ; dct ( input, dct_data ); /*dct変換を行う*/ for( i=0; i<64; i++ ) printf( “%d” , dct_data[i] ); } 区画単位なら、 #define NLINE 64 //一行あたりのデータ個数 int input[4096],brick[64]; //一括して読んでおく。いやならファイルポインタを使うが遅いし面倒。 for( i=0; i<64; i++ ) if(scanf( “%d” , &input[i ] )==NULL) break; for( j=0; j<64; j++) { for( i=0; i<64; i++ ) brick[i]=input[j*8+j/(NLINE/8)*NLINE*7+i+i/8*(NLINE-8)]; dct ( brick, dct_data ); /*dct変換を行う*/ for( i=0; i<64; i++ ) printf( “%d” , dct_data[i] ); }
>>315 4096個が一個ずつ縦に並んでます。
で、関数の中が64個しか扱えないんです。
日本語下手ですいません。これで理解して、いただいたでしょうか??
たびたびすいません。最初こうしたいんですが・・ for( i=0; i<4096; i++ ) scanf( “%d” , &input[i ] ) ;
問1 キーボードから金額として数値を入力し、その数値をドルに換算し結果を表示する
プログラムを作成しなさい。main関数の他に、次の仕様を有する「関数exchange」を含めなさい。
関数exchangeの仕様
日本円での金額(int型yen)を引数で与え、ドルでの金額をdouble型で返す関数
(為替レートは1ドル108.98円とする)
プロトタイプ宣言は double exchange(int yen);
実行例
日本円を入力
>>20000 20000円は、183.52ドルとなります。
press any key to continue
>314
連続なら、
>>318 の上のでおっけー。
ただ、下の例のように、scanfの戻り値のチェックを入れないとたぶん減点されるよ。
標準入出力にリダイレクトでいいんだよね?
問2 前問の関数exchangeを米国ドル('$')の他に英国ポンド('P')、スイス('F')、ユーロ('U')
について計算できるように拡張しなさい。switch-case分など多岐分岐構造を利用する事。
(これ以外の文字を与えた場合は、関数値は「0」とする)
関数exchangeの拡張仕様
各国の通貨を明示するために文字型の引数regionsを追加する。文字の大文字と小文字は区別
しないように工夫しなさい。なお、為替レートは以下の表を参照のこと。
プロトタイプ宣言はdouble exchange(int yen,char regions);
main関数もそれに合わせて、どの国の通貨で計算するかを選択できるようにすること。
※scanf文の副作用があるため、処理の順序は「国種別の文字」→「計算する金額(数値)」の
順とする。
為替レート
米国('$')108.980000 英国('P')185.200612 スイス('F')83.560804 ユーロ('U')129.827874
実行例
どの国の通貨で表示しますか?
米国('$'),英国('P'),スイス('F'),ユーロ('U')>>P
日本円を入力
>>80000 選択された国では
80000円は431.96(P)となります。
press any key to continue
324 :
お願いします :04/01/15 21:44
↑この二つの問題をどなたか解いてください。 宜しくおねがいします。
>>310 課題ならこれでいいだろ。
#include<stdio.h>
#define N 10
int main(void){
int seito[N],i=0,k,count=0,sum=0;
double ave;
printf("入力\n");
while(i<N&&scanf("%d",&seito[i])!=EOF){
i++;
}
for(k=0;k<i;k++){
if(seito[k]>=50){
count++;
sum+=seito[k];
}
}
if(count)ave=(double)sum/count;
printf("50以上人数%d 合計%d 平均%f",count,sum,ave);
return 0;
}
>314 int *ip; for( i=0; i<4096; i++ ) if(scanf( “%d” , &input[i ] )==EOF) break; for( j=0; j<64; j++) { ip=&input[j*64]; dct ( ip, dct_data ); /*dct変換を行う*/ for( i=0; i<64; i++ ) printf( “%d” , dct_data[i] ); //dct_data[64]の場合 // printf( “%d” , dct_data[i+j*64] ); //dct_data[4096]の場合 } OSによっては、配列は、途中でアドレスが飛ぶ事があるので気をつけてね。 そんなOSには、固定かつ連続なエリアを確保するための関数があるはず。
>>321 #include<stdio.h>
double exchange(int yen);
int main(void){
int money;
printf("日本円を入力>>"); scanf("%d",&money);
printf("%d円は、%.2f円になります。",money,exchange(money));
return 0;
}
double exchange(int yen){
return (double)yen/108.98;
}
("%d円は、%.2f円 ↑後半円じゃなくてドルな。
>>315 さん
ありがとうございました。
さっそく明日学校いって、やってみます。
>>328 さんありがとうございます。
問1の方は無事できました問2の方どなたかおねがいします。
>>331 こっちも一応やった。
#include<stdio.h>
#include<ctype.h>
double exchange(int yen,char regions);
int main(void){
int money;
char tuka;
printf("どの国の通貨で表示しますか?\n");
printf("米国('$'),英国('P'),スイス('F'),ユーロ('U')>>");
scanf("%c",&tuka);
printf("日本円を入力>>"); scanf("%d",&money);
printf("選択された国では\n");
tuka=toupper(tuka);
printf("%d円は、%.2f(%c)になります。",money,exchange(money,tuka),tuka);
return 0;
}
double exchange(int yen,char regions){
switch(regions){
case '$': return (double)yen/108.980000;
case 'P': return (double)yen/185.200612;
case 'F': return (double)yen/83.560804;
case 'U': return (double)yen/129.827874;
default: printf("regions error\n");
}
return -1;
}
333 :
301でつ :04/01/15 22:18
行列のはきだし法をプログラム化せよという宿題が出ますた 変数はa[4][5]で、行列は 4 4 6 8 8 6 2 -4 4 12 4 6 8 12 8 0 -4 -4 4 6 において掃き出し法を実行せよ ただし使えるのはstdio.hのみ 神様仏様2chさま…おながいします
問 do文を用いて、10個の要素を持つ整数型配列の中に適当な値を初期値代入して 配列の要素の平均と合計を求めよ という問題が出ましたどなたかわかる方がいましたらお願いします
>>328 さんありがとうございました。
問2の方も無事にできました。
>>334 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i, sum;
int value[10];
srand(time(NULL));
i = 0;
do {
value[i++] = rand();
} while (i < 10);
sum = i = 0;
do {
sum += value[i++];
} while (i < 10);
printf("合計は %d です。平均は %lf です。\n", sum, (double) sum / 10);
return 0;
}
>>334 自分で入力、要素数固定
#include<stdio.h>
int main(void){
int s[10],i=0,sum=0;
do{
scanf("%d",&s[i]);
sum+=s[i];
i++;
}while(i<10);
printf("合計%d 平均%f",sum,(double)sum/10);
return 0;
}
サンクスです
10個の数を整数型配列に(適当な値)を初期値代入した後、配列の要素の値を 最初から順に加算していって配列の要素の値に負または100を超える値が 現れたときに加算をやめて、それまでの合計値と加算した個数を出力せよ ただし負や100を超える値には加算を加えないこと このプログラミングを作成してビルト→実行してみると100を超えてから加算を やめてしまいます(負のときも)どなたか教えていただけたら助かりますです。
for(i=0,sum=0;sum=<100;i++){ sum+=data[i] } sum-=data[i--];
#include <stdio.h> int main() { int i,sum=0,a[10]; /* aを適当に初期化 */ for(i=0;i<10;i++) { if(a[i] < 0 || a[i] + sum > 100) break; sum += a[i]: } printf("sum: %d, count: %d\n",sum,i); return 0; }
342 :
(129)けい ◆mL2ZRk1cK. :04/01/16 00:33
お返事遅れて申し訳ありません、、、
>>131 構造体は習ってません。。。今、初めて聞きました。
21〜26はどのように行えばよいのでしょう?
41〜45も意味がよく分かりません、、、
すいませんT_T
>>132 出来ました!!!!!!
助かりました。ありがとーございます!
もしよろしければ他の方も質問の方を見ていただいてくれると嬉しいです。
>>129 です。
失礼します。
>>333 こんな感じでいいのか?
#include<stdio.h>
main()
{
floata[4][5],b,c;
inti,j,k;
a[0][0] = 4; a[0][1] = 4; a[0][2] = 6; a[0][3] = 8; a[0][4] = 8;
a[1][0] = 6; a[1][1] = 2; a[1][2] = -4; a[1][3] = 4; a[1][4] = 12;
a[2][0] = 4; a[2][1] = 6; a[2][2] = 8; a[2][3] = 12; a[2][4] = 8;
a[3][0] = 0; a[3][1] = -4; a[3][2] = -4; a[3][3] = 4; a[3][4] = 6;
for ( i = 0; i <= 3; i++ ){
b = a[i][i];
for ( j = 0; j <= 4; j++ ){
a[i][j] /= b;
}
for ( k = 0; k <= 3; k++ ){
c = a[k][i];
if ( i != k ){
for ( j = 0; j <= 4; j++ ){
a[k][j] -= (a[i][j] * c);
}}}}
for( i = 0; i <= 3; i++ ){
for ( j = 0; j <= 4; j++ ){
printf("%f ",a[i][j]);
if( j == 4 )printf("\n");
}}}
344 :
デフォルトの名無しさん :04/01/16 01:05
>>339 #include<stdio.h>
int main()
{
int i,temp,sum=0;
int n[10];
for(i=0; i<10; i++) // 初期化
scanf("%d", &n[i]);
for(i=0; i<10; i++){ // 合計+診断
temp = n[i];
if(temp > 100 || temp < 0)
break;
sum += temp;
}
printf("sum = %d, count = %d\n", sum, i);
return 0;
}
345 :
301でつ(1) :04/01/16 01:20
#include<stdio.h> show(float x[4][5]){ int i,j; for(i=0;i<4;++i){ for(j=0;j<5;++j){ printf("%4.2f ",x[i][j]);} printf("\n");} printf("\n");} main(){ float a[4][5]={{2,2,3,4,4},{3,1,-2,2,6},{2,3,4,6,4},{0,-2,-2,2,3}}; float b[4][5],c[4][5]; int i,j,m,n; for(i=0;i<4;++i){ for(j=0;j<5;++j){ b[i][j]=a[i][j]/a[i][i];} for(m=0;m<5;++m){ for(n=m;n<6;++n){ if(m!=i){ c[m][n]=a[m][n]-b[i][n]*a[n][n]; }}}} } じぶんなりに作ったんですがこんなんしかできなかったです。(もちろん間違い)
346 :
301でつ(2) :04/01/16 01:21
掃き出し法とは… 2 4 6 6 …(1) 2 2 2 4 …(2) 2 2 4 6 …(3) ↓((1,1)(2,2)(3,3)成分を1に、それらと一番右の3つの数字意外を0にしたい) 1 2 3 3 …(4)((1)を(1,1)成分である”2”で割る) 2 2 2 4 …(2) 2 2 4 2 …(3) ↓ 1 2 3 3 …(4) 0 -2 -4 -2 …(5) ((2)−2×(4) 一番左の値を0にしなくてはならない) 0 -2 -2 -4 …(6) ((3)−2×(4) 上に同じ) これで一番左の3つ値は完成 ↓
347 :
301けーたい :04/01/16 01:24
343氏、ありがとうございます
348 :
301でつ(3) :04/01/16 01:24
1 2 3 3 …(4) 0 1 2 2 …(7) ((2,2)成分の”−2”で(5)を割る) 0 -2 -2 -4 …(6) ↓ 1 0 -1 -1 …(8) ((4)ー2×(7)) 0 1 2 2 …(7) 0 0 2 0 …(9) ((6)−(−2)×(7)) これで左から2列目の3つの値は完成 ↓ ここまでくれば気づかれるかとおもいます 次は(9)を2で割った上で、(7)(8)の右から2番目の値を0にします この答えは 1 0 0 -1 0 1 0 2 0 0 1 0 このながれでお願いします
349 :
301でつ(4) :04/01/16 01:27
何度もスレ汚しすみませんでした 343氏、重ねてありがとうございます
掃き出し法くらいいまさら解説されんでもかまわんが (つか有名すぎてぐぐればサンプルくらいあると思うが) とりあえず、int同士の除算の結果は切り捨てられたint値になるんで a[i][j]/a[k][l]はよろしくない。
>>339 >配列の要素の値に負または100を超える値が現れたときに加算をやめて、
(ry
>100を超えてから加算をやめてしまいます(負のときも)
ってことは
>>340 と
>>341 は求めてるものと違うんだよな?
>>351 あ、ホントだね。
>>344 のコードは、その要件を満たしてる(読み違えてなければ、だが)。
>>344 見てて思ったけど、
Cの処理系で、// コメントに対応してるのは少数派?
// ってC++
>>344 のコードは、その要件を満たしてる ? おいおい(w
んー。困った。多分木の表現方法がわからない。 おまいら、多分木のサンプルどこにあるか、知らないですか?
358 :
デフォルトの名無しさん :04/01/16 05:57
配列の要素がdata[4][2]のとき 降順に並び替える処理をしたいのですが、 data[0][0]に一番大きな値が入り、 data[0][1]に二番目に大きな値が入り… data[3][1]に一番小さな値が入るようなプログラムを教えてください。 お願いします!
#include <stdlib.h> int cmp(const void *va, const void *vb) { int a = *(int *) va; int b = *(int *) vb; if (a < b) return 1; else if (a == b) return 0; else return -1; } int main(void) { int data[4][2] = { {1, 2}, {3, 4}, {5, 6}, {7, 8}}; qsort(data, 4*2, sizeof(int), cmp); /* 確認は自力でどうぞ */ return 0; }
>>353 最近のやつはほとんど対応してると思うよ。
>>357 多分木は2分木で表現できます。
左は自分の第1子、右は自分の一つ下の兄弟をつなぎます。
left/rightっていうメンバ名は変えた方が吉ですが。
>>357 んー。やっぱ、そういう手になりますかねぇ。
要素の登録/削除が定数オーダーってのを求めてたんですが(^^;;
汎用で版権フリーのがあればなぁと思ったんですけど、
ちょっと甘かったですかね。
わざわざありがとうございます。
C++だと要素にベクターを持たせるのも手かしら。
Cだと・・・自前で伸長させる配列(いやだなぁ)か、子の双方向リスト・・・?
んー・・・自分がどんな処理/データを求めてるかもうちっと整理してみます。
>>362 用途がよくわからないけど、O(1)で登録/削除って、
十分すきまのあるハッシュしかないんでは?
多分木を使うって、構文解析かなにか?
データベースでディスクアクセス数を減らしたいなら、
B木とかになったりするけど。
C宿題スレ違い
課題? 4人分の身長と体重のデータを2次元配列に初期代入して身長と体重それぞれの 平均を求めよただし2重ループのfor文(身長と体重に関する繰り返し)を用いること
>>364 int main(void){
float data[5][2];
int i, j; data[5][0] = 0.0;data[5][1] = 0.0;
for(i = 0; i < 4; i++){
printf("%d人目の",i);
puts("身長入れる");
scanf("%f", &data[i][0]);
puts("体重入れる");
scanf("%f", &data[i][1]);
}
for(j = 0; j < 2; i++){
for(i = 0; i < 4; j++){
data[5][i] += data[j][i];
}
printf("身長 %f, 体重 %f\n", data[5][0] / i, data[5][1] / i);
return 0;}
}
>>366 質問の仕方が失礼極まりないから答えたくないんだよね
>>367 が、お前もっとバカ。出来ないなら出来ないと言え。
ちなみに、失礼さなどみじんも感じない。否、これは俺がバカだからなのか。
370 :
デフォルトの名無しさん :04/01/16 17:36
/* 読み込んだ正の整数値までカウントアップ(1から) */ #include <stdio.h> int main(void) { int i, no; printf("正の整数を入力してください:"); scanf("%d", &no); i = 1; while (i <= no) printf("%d ", i++);/* iの値を表示した後にインクリメント */ if (i - 1 == no && no == 0) putchar('\n'); return (0); } 1から読み込んだ数までカウントアップさせ、読み込んだのが0以下なら改行しないのですが、ifの中がうまく使えません。 お願いします。
if (i - 1 == no && no != 0) にすることで解決できたようです。
なんかよくわからないコードだね。
1+2+5+10+17+… の順番に足していき、100万を超える値まで繰り返す。100万を超えた値を 初期値し、引き算を行い、0以下になるまでを表示する。 です。お願いします
10 L=0 20 M=L+K*2-1 30 L=M 40 GOTO 30
10 L=0 20 M=L+K*2-1 30 L=M 40 GOTO 20 _| ̄|○ こんなんで間違えるなんて・・・
>>373 どんな引き算をするの?
>>373 総和の一般式はΣ1+(n-1)^2で間違いない?
「初期化」とは何?
「引き算」とはどういう処理を繰り返すの?
>>373 1+2+5+10+17…
これが分からん。ここも問題?
「初期値し」っつか「初期値とし」か
>>377 とし、とりあえず前半。
int main(void) {
int n;
int a = 1;
for( n = 1 ; a <= 1000000 ; n++ )
a += 1 + n * n;
}
階差すら取ってみない
>>378 はアレだが
>>375 も各項しか求められてないぞ。必要なのはその総和だ。
すいません。引き算を行いってところが抜けていました。 この式はある法則に従って足されていってるんです。その計算の答えが 100万を超えたときの答えから1−3−6−10−15−・・・←この部分が抜けていました。 これも法則なんですけど、これを行ってもらいたいんです。すみません
386 :
デフォルトの名無しさん :04/01/16 20:14
次のプログラムは,10個の点数データーを読み取り、60点以上のデーターが何かあるか教え、それを出力するものである。 @内に適切なものを記入してプログラムを完成させなさい。 C言語(*゚ー゚)<私はしぃ #include<stdio.h> void main(void) { int c,d,i; c=0; for(i=1;i<=10;i++){ printf("Dを入力"); scanf("%d",&d); if(d>=60){ @; } } printf("個数=&d",c); } 教えて♥
一般項を素直に足していけってことなのかもしれんが 一応、総和の式は s_n = n/6(2n^2-3n+7)
書き方がまずかったかな (2n^2-3n+7)*n/6
390 :
デフォルトの名無しさん :04/01/16 20:19
>>386 60点以上のデーターが何かあるか数えって
おかしな表現だね。
まあ多分c++だろうがね。
伊庭先生がこのスレを監視しています...
>>385 だからその法則をきちんと書け。
それが正しいかの保証も得られんのだからわざわざ推測させるな。
引き算の最初の 1 は -1 のミスタイプなのか? ということになる。
for(n=1; a <= 0; n++) {
a -= n*(n+1)/2;
printf("%f\n",a);
}
>>387 ある値を超える最初の値だから一般式はいらないんじゃない?
(あれば反復法類似の方法で高速に絞り込んでいけるようになるだろうけど)
>>388 その式は探索的な手法じゃないとよう求められないわけだが
伊庭先生ならGAを使えって指示はなかった?
もしくは特定の演算子と括弧の組み合わせだけ全部調べろみたいな指定は?
正直講義の流れがないと方針が立てづらい。
加えて探索や式の符号化表現まで1から作るのは面倒なんで
オール丸投げは回答者を減らすぞ
ひょっとして。伊庭ちんて灯台の人?
>>378 IQテストにありそうな問題。差が1、3、5、7・・・・・と増えているだけ。
申し訳ないです。
高校のとき偏差値55以上はないと 階差の総和の一般式を求めることは できないと思われ。
時間の問題だと思うが、通報されるんでないかい?
大金センセ、毛利センセの例もあるし。
学校のURLを出さんほうがいいぞ・・・。
>>400 偏差値ねぇ・・・
とりあえずコード全体。 返答がないんで漸化式が正しいかは保証外 #include <stdio.h> int main(void) { int n; int a; for( a = 1, n = 1 ; a <= 1000000 ; n++ ) a += 1 + n * n; for(n=1; a > 0; n++) { printf("%d\n",a); a -= n * (n+1) / 2; } return 0; }
404 :
デフォルトの名無しさん :04/01/16 21:05
>>386 スルーですか・・・・
明確な答えお願いしたいのですけどぉ・・・・
>>403 int が 16bit のときのことは
考えなくていいのかな。
>>403 どうも有難うございました。本当に助かります。
>>388 解けたんだけれど、こっちに書いちゃっていいの?
/*
>>388 $B=PNOCf(B sqrt()$B$OJ?J}:,!"(Blog()$B$NDl$O(Be */
#include <stdio.h>
int main(int argc, char *argv[])
{
int i, j, n;
if (argc != 2)
exit(2);
else
n = 4;
n = atoi(argv[1]);
for (i = 1; i <= n; i++) {
printf("%5d = log(log(", i);
for (j = 0; j < i; j++)
printf("sqrt(");
printf("4");
for (j = 0; j < i; j++)
printf(")");
printf(")/log(4))/log(log(sqrt(4))/log(4))\n");
}
return 0;
}
バケラッタ。まあ・・・コメント無くても大丈夫でしょう・・・。
レベル1とレベル2はおいらには難しいので、出来るひとに任せます。
あ、0を作るの忘れちった・・・まあ、あとはがんばってくれ。
>>388
412 :
デフォルトの名無しさん :04/01/16 23:09
文字列バトラープログラム教えてください。 詳細 武器など決め手プレイや2人で戦うプログラム。 わからなかったらいいですw
>>412 #include<stdio.h>
#include<string.h>
int main(void){
char s1[100],s2[100];
printf("*****文字列バドラー!!************\n");
printf("*****熱い戦いにしよう************\n");
printf("player1の武器の名前はなんですか?\n");
fgets(s1,100,stdin);
printf("player2の武器の名前はなんですか?\n");
fgets(s2,100,stdin);
if(strcmp(s1,s2)<0)printf("player1 win\n");
else if(strcmp(s1,s2)==0) printf("double ko\n");
else printf("player2 win\n");
return 0;
}
414 :
デフォルトの名無しさん :04/01/17 00:10
>>182 なんですけどー。
これって難しいんですか?
>>414 「あなたの携帯電話のアドレス帳機能」が判らないので難しいかどうかさえ判りません。
#vodafoneが東京デジタルホンの頃のアドレス帳ならシンプルなんだよね。
418 :
デフォルトの名無しさん :04/01/17 01:17
>>415 >>416 メモリは0〜499の500件
五十音順に配列される。
1件あたり、メモリ番号、電話番号、アドレスが2件ずつ、
住所、誕生日、趣味があります。
検索は、名前とメモリ番号の両方でできます。
「具体的」の意味がわかってない以前に説明がなってないな。 プログラムに必要な情報を曖昧さのないように書けって言ってるの。 根本的なことを聞くが、データ項目に「名前」はもちろんあるんだよな? で、並びの「五十音順」の基準は当然「名前」だよな? さらに、それは名前のデータそのままの順なのか 読み仮名もいっしょに登録していて、そっちを用いているのかどっちなんだ? その「メモリ番号」とはどういう基準で振られるんだ? 「2件ずつ」が適用されるのはどの項目までだ? 各項目の内部での型(データ形式)どころか それを決めるための制約すら一切書いてないし。
いい加減めんどくなってきたんで とりあえず結んでやる。 互いに依存関係にないデータ項目がいくつ増えようが 難易度には影響しない。やることが増えるだけ。 検索基準を複数用意する場合だと データの並び順を利用した二分探索の素直な適用の妨げになるが、 逐次探索でかまわないのならそれも上記といっしょで別個に組み込めばよい。 したがって核になる部分でいえば 一項目のデータを登録し検索するプログラムが作れれば 問題なく作れる難易度と言える。 こんなところで満足か?
C言語です 二次配列を使って、100までの階乗(n!)を求めるプログラムを作りたい。 数を入力し、"nの階乗は、mです"と出力したい 100以上の数を入力すると、"100以上の数が入力されました"と出力したい for文を使って、階乗を求めていきたい 以上の説明で分かるでしょうか… よろしければお願いします
階乗のどこに二次元配列が必要? オンデマンドで計算するのか あらかじめ答えを全部計算してテーブル化して見せるだけなのか 対話部分をもう少し詳しく書いてくれないと判断付かん とりあえずsizeof(int) >= 4 と仮定して int factorial(int n) { int retVal = 1; int i; for(i=2;i<=n;i++) retVal *= i; return retVal; }
前の結果をテーブル化して参照するのなら int table[100]; int i; i = 0; table[i] = 1; for(i=1;i<100;i++) table[i] = table[i-1] * (i+1); でいい。
えぇと、二次配列を使って [1][1] [2][1*2] [3][1*2*3] ・ ・ ・ [100][1*2*3*・・・99*100] といったように、先に数を代入させておいて、printfで出力するという感じです。
おまえらそれで100の階乗が計算できると思ってるのか。 課題は2次元配列を用いて多倍長ライブラリを作ることだぞ。
多倍長は2次元で表現しませんが
>>424 無理です。配列の添字にそんな大きな値の使える(100!ものアドレスがある)
コンピュータは無いと思います。
>>424 配列の添え字の意味わかってるか? 値が入るんじゃないぞそこは
もう一度聞くが本当に二次元配列は必要なのか?
>>426 そんなものは実装次第。GMPでも使うかね:)
100! = 933262154439441526816992388562667004907159682643816214685929638952175
99993229915608941463976156518286253697920827223758251185210916864000000
00000000000000000
#include <stdio.h>
#include <assert.h>
多倍長は任せた
>>425 #include <limits.h>
#define TBL_SIZE 100
unsigned long factorial(unsigned n) {
unsigned long ret = 1;
unsigned i = 2;
while (i<=n) { ret *= n; n++; }
return ret;
}
unsigned init(unsigned long* tbl) {
unsigned i=0;
tbl[i] = 1;
for( i = 1 ; i < TBL_SIZE && tbl[i-1] <= ULONG_MAX / i ; ++i)
tbl[i] = tbl[i-1] * (i+1);
return i;
}
ちなみに冒頭のfactorialは今回は使わないみたいなんで削ってくれw int main(void) { unsigned long table[TBL_SIZE]; unsigned n; unsigned nmax = init(table); printf("Input a number in the following range [1,%d]:",nmax); scanf("%d",&n); if( n >= 1 && n <= nmax ) printf("%d! = %d\n", n, table[n-1] ); else printf("range error!\n"); return 0; }
432 :
デフォルトの名無しさん :04/01/17 18:23
#include <iostream.h> using namespace std; class myclass{ private: int data1; double data2; public: void iinput(int num1); void dinput(double num2); int ioutput(){return data1;} double doutput(){return data2;} }; void myclass::iinput(int num1){ data1 = num1; } void myclass::dinput(double num2){ data2 = num2; } int main(){ myclass a; int x1; double y1; cout << "整数の数字を入力してください。\n"; cin >> x1; cout << "小数の数字を入力してください。\n"; cin >> y1; a.iinput(x1); a.dinput(y1); cout << "結果は以下の通りです。\n"; cout << a.ioutput() << "\n" << a.doutput() << "\n"; return 0; } ↑x1に小数の値、例えば2.8とか入力したら、2と0.8が出力されるのですが・・・ どこを直せばいいでしょうか?
入力が不正なんでその挙動はバグではなく仕様。 一言で言えばどう直したいのかによる。 そのまま終了するとか もう一度入力させるとか あるいは整数部分だけ取り出して後は捨てるとか そういうのでないと答えられない。
int型の数値(side)を引数として与え、その個数分の'*'を以下の平行四辺形となるように
表示する関数line_parallel(戻り値はない)を作成し、main関数に用いなさい。
なお、個数の入力はmain関数で行うこと。
(関数の実行は、line_pararell(side);となる)
実行例
辺の個数は
>>4 ****
****
****
****
press any key to continue
>>434 は
*が平行四辺形に並ぶようにしたいのです。
四角に表示するわけではないですよ。
長方形も平行四辺形ではあるな。
for(i=0;i<side;i++){ for(j=0;j<i;j++) printf(" "); for(j=0;j<side;j++) printf("*"); }
>437 改行しなされ。
439 :
デフォルトの名無しさん :04/01/17 19:04
>>433 例えば、
整数の数字を入力してください。
2
小数の数字を入力してください。
3.75
結果は以下の通りです。
2
3.75
となるようにしたいのです。
>439 だーかーらー 「整数の数字を入力してください。」に対して、 「2.8」と入力されたら、 どうなってほしいんだよ!
希望出ないようなので一例書いとくな。あとは自分で応用してくれ do { cout << "整数の数字を入力してください。\n"; cin >> x1; } while( cin.fail() ); //failbit, badbit のチェック
442 :
デフォルトの名無しさん :04/01/17 19:59
>>440 整数の数字を入力してください。
2
小数の数字を入力してください。
2.8
結果は以下の通りです。
2
2.8
ってなるようにしたいんですけど、
整数の数字を入力してください。
2
小数の数字を入力してください。
結果は以下の通りです。
2
0.8
ってでてくるんです。
>>442 そのままコピペして、コンパイルしたらちゃんと動いたぞ。 (Windows XP cygwin)
$ ./a
整数の数字を入力してください。
2
小数の数字を入力してください。
2.8
結果は以下の通りです。
2
2.8
環境の問題じゃないか?
>>442 言ってることがめちゃくちゃだぞ。
最初の主張だと、
--------------
整数の数字を入力してください。
2.8
小数の数字を入力してください。
結果は以下の通りです。
2
0.8
--------------
だったように思えるんだが
445 :
デフォルトの名無しさん :04/01/17 20:18
>>443 そうですか・・・じゃあ環境の問題なんですね。
ありがとうございます。
今度別の端末でやってみます。
「端末」変えても...
447 :
デフォルトの名無しさん :04/01/17 22:26
「キーボードから20文字以下の文字列を入力し、それを出力するプログラムを ポインタを使用して作成せよ」という課題です。初心者なんで全然分かりません。 どうかお願いします。C言語です。
ポインタはどこに使えばいいんだ? #include <stdio.h> #define BUFMAX 21 int main(void) { char buf[BUFMAX]; fgets(buf,BUFMAX,stdin); printf("%s",buf); }
どこにって
配列の引数渡しは確かにポインタだがそんなんでいいのか? 一文字ずつ自作puts作って出力するのかな。
451 :
デフォルトの名無しさん :04/01/17 22:50
C言語の宿題です。 2次元配列va[3][4]の各要素を2次元配列vb[3][4]にコピーする。 ただし、va[3][4]の要素の中に'0'が出てきたらコピーを中断する。 最後にva[3][4],vb[3][4]の内容を全て表示し終了する。 (va[3][4]は下記のように初期設定すること) int va[3][4] = {{1,1,1,1),{2,2,2,2},{3,0,3,3},{4,4,4,4}}; 宜しくお願いします。
>>451 途中で中断するのに
vbの初期化とコピーする順番に指定はないのか?
それと '0' は文字定数の '0' じゃなくて数値の 0 だよな?
void show(int* ary, int size) {
int i;
for ( i = 0 ; i < size ; ++i )
printf("%d\t", ary[i]);
putchar('\n');
}
void cpy(int* dst, int* src, int size) {
int i;
for ( i = 0 ; i < size && src[i] != 0 ; ++i )
dst[i] = src[i];
}
int main(void) {
int va[3][4] = {{1,1,1,1},{2,2,2,2},{3,0,3,3},{4,4,4,4}}, vb[3][4];
cpy(vb,va,3*4);
show(va,3*4);
show(vb,3*4);
return 0;
};
ああ、stdio.hはきちんとincludeして、 showやcpyに渡す場合は&va[0][0]みたいにしてくれ。 上のままじゃたぶん警告が出る それと配列の要素数と初期化子が不整合なのは俺の知ったことじゃない
va[4][4]な
要素数とか間違ってたのに答えてくださってありがとうございました。 vbの初期化の指定はありませんでした。 参考にして作ってみます。
コピーは一次元とみなしていいけど 表示は二次元で矩形に表示してやらないとまずいかねえ まあforループ二回回すだけだし自力で頑張ってくれ
汎用性のない書き方だが。 #include<stdio.h> int main(void){ int va[4][4] = {{1,1,1,1},{2,2,2,2},{3,0,3,3},{4,4,4,4}}, vb[4][4]={0,}; int i,j,flag=0; for(i=0;i<4,!flag;i++){ for(j=0;j<4;j++){ if(va[i][j]==0){ flag=1; break; } else vb[i][j]=va[i][j]; } } for(i=0;i<4;i++){ for(j=0;j<4;j++){ printf("va[%d][%d]=%d",i,j,va[i][j]); } puts(""); } for(i=0;i<4;i++){ for(j=0;j<4;j++){ printf("vb[%d][%d]=%d",i,j,vb[i][j]); } puts(""); } return 0; }
458 :
デフォルトの名無しさん :04/01/18 00:47
C言語です。 0〜15までの数字を1つキーボードから入力させ、16進数として表示する。 ただしビットのシフト演算子を使用すること。 0〜15以外の数字を入力した場合はエラーと出力する。 ビットのシフト演算子を使用するという所がわかりません。 printf関数で%Xで出力させる方法しか思いつきませんでした。 どうかお願いします。
変な問題だなぁ
2進数に変換とかなら解るが。。。
int n; if (scanf("%d", &n) != 1 || n < 0 || n > 15) { fprintf(stderr, "エラー\n"); exit(1); } putchar("0123456789ABCDEF"[(n >> 4) & 15]); putchar("0123456789ABCDEF"[n & 15]); putchar('\n');
462 :
デフォルトの名無しさん :04/01/18 01:12
>461 ばか?
>>461 ありがとうございます。
考え方わかりました。
一桁目消したらシフト演算子使ってない事になるな・・・
変だよなあ。 一桁で収まるんならビットマスクすらいらないし(符号ビット除く)
超高速アッカーマン関数計算プログラム どなたかお願いします。
>>458 int n,ptn[]={0x7D,0x60,0x37,0x67,0x6A,0x4F,0x5F,0x61,0x7F,0x6B,0x7B,0x5E,0x16,0x76,0x1F,0x1B};
for(;;){
if (scanf("%d", &n) != 1 || n < 0 || n > 15) {
fprintf(stderr, "エラー\n"); break;
}
print(ptn[n]);
}
void print(int ptn){
char *p,str[]=" 00000 \n3 5\n3 5\n 11111 \n4 6\n4 6\n 22222 ";
int i;
for(i=0; i<=7; ++i)
while(p=strchr(str,'0'+i)) *p=((ptn>>i)&0x01)?'*':' ';
puts(str);
}
[補足]str[]の"3 5"と"4 6"の間にあるスペースは5文字だ
>>468 「超高速」
・実行環境不明
・パフォーマンスの計測基準が無い
・「超」って何
答え: 曖昧すぎる宿題は講師もしくは
>>468 のネタ
C言語の宿題です。問題全文載せます。 キーボードから任意の長さの文字列を入力した後、その文字列を一度配列にポインタを用いて保存する。 その後、その文字列を表示するプログラムを作れ。 宜しくお願いします。
本当に任意の長さを入力するには事前に最大長指定しないとできないんだけどなあ…… ポインタを利用する意味もよくわからんし。 もしかして文字列はプログラムの引数として入力するのか? #include <stdio.h> #include <string.h> #define BUF_MAX 1024 int main(void) { char buf[BUF_MAX]; #if 1 fgets(buf,sizeof(buf),stdin); #else const char* pc; if( argc < 2 ) return 1; pc = argv[1]; strcpy(buf,pc); // not safe. #endif puts(buf); return 0; } 好きな方を
>>473 適宜reallocしたりして延ばすんじゃないの?
>>472-474 こういうのはどうだろう。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int bufsize = 10;
char *p = malloc(bufsize);
int i = 0;
for (int c; (c = getchar()) != EOF; ++i) {
if (i >= bufsize - 1) {
if (p = realloc(p, bufsize = 2 * bufsize)) {
// fprintf(stderr, "Bufsize is increased to %d.\n", bufsize);
} else {
fprintf(stderr, "No more memory is available.\n");
break;
}
}
p[i] = c;
}
p[i] = '\0';
printf("%s", p);
}
>>473-475 レス遅くなってすいません。
わけわかんなくて困ってたんでとても助かりました。
ありがとうございますですm(_ _)m
478 :
デフォルトの名無しさん :04/01/18 12:05
C言語の問題です。 キーボードから入力した整数値を表示する。 ただし、main関数では2つの整数型変数の宣言と表示をし、 キーボードからの入力は副関数で行うこと。 [実行結果例] INPUT : 34 (入力) INPUT : 873 (入力) a = 34, y = 873 (システム表示) お願いします。
>>478 副関数・・・
#include <stdio.h>
int input(void) {
int i;
printf("INPUT : ");
scanf("%d",&i);
return i;
}
int main() {
int a,y;
a = input();
y = input();
printf("a = %d, y = %d\n",a,y);
return 0;
}
>>479 ありがとうございました。
助かりました。
481 :
ぼるじょあ ◆H6wikgcXIU :04/01/18 12:26
strcpy関数のクローン、strcopy関数。 void strcopy(char *to,char *from){ while(*to++=*from++); *to='\0'; return; } 配列版StrCopy関数。 void StrCopy(char *to,char *from){ int cnt=0; for(cnt=0;to[cnt]=from[cnt];cnt++); to[cnt]='\0'; return; }
ファイル中に含まれる文字列を出力するプログラムを作れ。 難易度1:4文字以上の印字可能文字が続いている文字列を出力するフィルタプログラム作成せよ。 難易度2:4文字固定ではなく、コマンドラインオプションから文字数を指定可能にせよ。 難易度3:日本語も考慮に入れよ。文字コードはシフトJISまたはEUC限定でよい。 お願いします。難易度3は、難しいので出来なくてもかまわないそうです。 (逆に出来たら、評価凄く高いそうです)
とりあえずSJISは 2バイト文字の1バイト目 (0x81〜0x9F、または 0xE0〜0xFC) であるか否かを判定 だが... n-1文字キープするエリアを確保 キープ文字数=0 出力状態=OFF while(ファイルの最後まで){ if(出力状態==OFF && キープ文字数<n-1 && 印字可能文字){ 今読み込んだ文字をキープ ++キープ文字数 continue; } if(出力状態==OFF && キープ文字数==n-1 && 印字可能文字){ 出力状態=ON for(n-1文字分) キープ文字を印字 今読み込んだ文字を印字 continue; } if(出力状態==ON && 印字可能文字){ 今読み込んだ文字を印字 continue; } キープ文字数=0 出力状態=OFF }
486 :
デフォルトの名無しさん :04/01/18 14:24
2つの文字列を入力し、数値化したものを比較、勝敗を表示する。但し文字列と数値データは構造体で扱う。又、文字列、→数値変換はmoji_ten()関数を処理する。準備するもの @構造体定義より {文字列列用・・・char型(20バイト以上) {点数用......int型A数値変換はmoji_ten関数を使用する。名前を入力させ攻撃用文字列と防御用文字列と体力など攻撃力と防御力設定する。 画面のイメージ↓ ///////////////////////////// /player1の名前を入力して下さい→ /player2の名前を入力して下さい→ /player1の武器を選んでください→ /player2の武器を選んでください→ /player1の防具を選んで下さい→ /player2の防具を選んでください→ / 戦闘開始 / player1体力500player2体力500 / 1ターン目player1に100のダメージplayer2に200のダメージ / 2ターン目player1400のダメージplayer2に300のダメージ / 引き分けです。 /////////////////////////////////////////// こんな感じで表示させたいです。player1かplayer2のダメージはランダムであと引き分けありで 表示させたです。 最初のこんなしかわりません。w #include struct BATTLER { char name[20] int ten }; void moji_ten(struct BATTLER *); void main(void) { 次からよくわりません教えてください。文字列バトラーの応用です。お願いします。
487 :
デフォルトの名無しさん :04/01/18 14:27
ちなみ上はC++ですお願いしますw。
つっこみどころが多すぎて開いた口が塞がらない。 本当にC++で構わないのか? Cで頼んだ方がいいぞ。 ……まあ本当に頼む気なら点数化のルールくらい明文化して 各ステータスの意味もはっきりしてくれ
> 本当にC++で構わないのか? Cで頼んだ方がいいぞ。 C++じゃなくてCで頼むと、なにがいいの?
>>489 単にできる奴が多いから、ではないかと。
いや、Cも閻魔級にひどいがC++はまるでわかってなさそうだし。 自分でやる気もないなら制限ない方がいいかってくらい。
>>492 上から、
struct fraction (または、任意の名前。この場合、bunsuuとかか)
struct fraction
&a.bunbo
&a.bunsi
&b.bunbo
&b.bunsi
a.bunsi*b.bunbo+b.bunsi*a.bunbo;
a.bunsi*b.bunbo-b.bunsi*a.bunbo;
a.bunsi*b.bunsi;
a.bunsi*b.bunbo;
計算部分の考え方は、小学校の教科書でも読んでください。
「超高速アッカーマン関数」というアルゴリズムがすでに存在するのです。
無事にできました。 みなさんどうもありがとうございました。
>>499 int main(void){
struct seiseki data[5];
int i;
for(i=0;i<5;i++){
printf("%d番目のデータ\n",i+1);
printf("name>>"); scanf("%s",data[i].name);
printf("英語>>"); scanf("%d",&data[i].eigo);
printf("数学>>"); scanf("%d",&data[i].suugaku);
data[i].goukei = data[i].eigo+data[i].suugaku;
data[i].heikin = (double)data[i].goukei/2;
}
for(i=0;i<5;i++){
printf("%d %s %d %d %ld %f\n",i+1,data[i].name,data[i].eigo,
data[i].suugaku,data[i].goukei,data[i].heikin);
}
return 0;
}
エラーチェック全くやってないが、課題ならいいだろ。
構造体のnoをどう使うのかがわからない。 もし数字をいれる必要があるなら自分で適当にいじってくれ。 あとdata→t_dataに直しといて。
502 :
デフォルトの名無しさん :04/01/18 18:11
main関数で2つの配列を、それぞれ5,2,3,5と4,3,8,4で 初期化し、相対する値の積を第3の配列に代入し表示する。 積は関数sekiで求める。関数mainと関数sekiの間の値の受け渡しはポインタを用いて一組ずつ行う。 この問題をよろしくお願いします。
503 :
デフォルトの名無しさん :04/01/18 18:32
質問です。 大学の宿題で以下の問題が出題されました。 1.下記に記すデータで、優、良、可、不可をとった学生の学籍番号をファイル出力せよ。 入力ファイル名:in1.dat 出力ファイル名:out1.dat データ(学籍番号:得点) 1:75 2:92 3:63 4:48 5:95 6:82 7:68 8:56 9:62 10:71 実際に入力ファイルに記述する場合は初めに学生の人数を入力し、その後に 「学籍番号 半角スペース 得点」と入力するようになっています。 続く
そこで私は以下のプログラムを作成しました。 しかし、エラーが発生し、プログラムをコンパイルすることができません。 どこが違うのかが、全くわかりませんので、お手数ですが、ご指導よろしくお願いします。 #include<stdio.h> main() { FILE *fr,*fw; int kekka[100][2],i,ninzuu; fr=fopen("a:\in1.dat","r"); fw=fopen("a:\out1.dat","w"); fscanf(fr,"%d",&ninzuu); for(i=1;i<ninzuu;i++) { fscanf(fr,"%d %d",&kekka[i][0],&kekka[i][1]); if(kekka[i][1]>=80) fprintf(fw,"%d 優\n"kekka[i][0]); else if(kekka[i][1]>=70) fprintf(fw,"%d 良\n"kekka[i][0]); else if(kekka[i][1]>=60) fprintf(fw,"%d 可\n"kekka[i][0]); else fprintf(fw,"%d 不可\n"kekka[i][0]); } fclose(fr); fclose(fw); }
int seki(int *a, int *b){ return *a * *b; } int main(void){ int a[]={5,2,3,5}; int b[]={4,3,8,4}; int i,c[4]; for(i=0; i<4; ++i) c[i]=seki(&a[i],&b[i]); for(i=0; i<4; ++i) printf("a[%d]:%d * b[%d]:%d = c[%d]:%d\n",i,a[i],i,b[i],i,c[i]); return 0; }
エラーの内容です。 cpp1.cpp(12) : error C2059: 構文エラー : ')' cpp1.cpp(13) : error C2146: 構文エラー : ')' が、識別子 'kekka' の前に必要です。 cpp1.cpp(13) : error C2059: 構文エラー : ')' cpp1.cpp(14) : error C2146: 構文エラー : ')' が、識別子 'kekka' の前に必要です。 cpp1.cpp(14) : error C2059: 構文エラー : ')' cpp1.cpp(15) : error C2146: 構文エラー : ')' が、識別子 'kekka' の前に必要です。 cpp1.cpp(15) : error C2059: 構文エラー : ')'
>>502 わざわざ関数を作る理由もポインタを使う理由もわからんが。
#include<stdio.h>
int seki(int *x,int *y){
return *x * *y;
}
int main(void){
int a[4]={5,2,3,5},b[4]={4,3,8,4},c[4],i;
for(i=0;i<4;i++){
*(c+i)=seki(a+i,b+i);
}
for(i=0;i<4;i++){
printf("c[%d]=%d ",i,c[i]);
}
return 0;
}
fprintf(fw,"%d 良\n"kekka[i][0]); ↓ fprintf(fw,"%d 良\n", kekka[i][0]); 同様のミス多数あり。
>>506 つーか、エラーメッセージの行番号はだいたい信頼してもいいと思うぞ。
(特にこういう簡単なプログラムでは)
ポインタ使うのは受けわたしだけでよかったのか。
511 :
デフォルトの名無しさん :04/01/18 18:53
ぼるじょあどこ?
(・3・)アルェー
514 :
デフォルトの名無しさん :04/01/18 19:38
CreateWindowExで作ったボタン。 BMP画像を用意し、それをボタンのグラフィックスにする方法が分かりません。 どなたか、ヒント下さいませぬか。
>>514 それって宿題か?
オーナードローで検索。
516 :
デフォルトの名無しさん :04/01/18 20:07
遅くなってすいません486も物ですが Cでもかまいません。w
517 :
デフォルトの名無しさん :04/01/18 20:37
点数化ルールはアバウトでいいですw
>>515 ありがとうございます!
メドつきました、宿題片付けられそうです。
C言語の宿題ですた 実数型変数aとbに適当な実数値をキー入力し、それらの積を計算した結果を実数型変数xに 代入した後、aとbとxの値をそれぞれ全体で10桁(小数点を含む)小数第3桁で出力せよ (1行に1つの値「全部で3行」で求めること) お願いします
>>519 #include <stdio.h>
int main() {
double a,b,x;
scanf("%lf",&a);
scanf("%lf",&b);
x = a*b;
printf("a=%10.3f\nb=%10.3f\nx=%10.3f\n",a,b,x);
return 0;
}
>>503 の大学っそのレベルから勉強を教えてどの程度まで教えるんだろう?
俺、プログラミングを専攻する人は経験者ばかりだと思ってた。
大学は"専攻"と違うと思われ
今日びの工学部はこの程度のプログラミングはほぼ必須なところも多い。
525 :
デフォルトの名無しさん :04/01/19 01:52
C言語の問題です。 3つのファイル、1data、2data、3dataを作り(次元は10×1、データは適当に入れる) 3つのファイルの各々に対し、平均と分散を求めそれをファイル 4data に出力せよ。 1つのファイルからの平均と分散の求め方ならわかるんですが、3つになると どうすればいいのかわからなくなります。誰か教えて下さい
>>526 同じことを3回繰り返すプログラムを作っても、コンパイルできなくなるんですが…
やり方が間違ってるだけなんでしょうか?
1 + "data"とかやってそうだ。
#include<stdio.h> #include<math.h> main() { floatdata[20]; FILE*fp; intn,i; floatS,av,vari; if((fp=fopen("1data","r"))==0) { printf("FILE CANNOT OPEN\n"); return; } fscanf(fp,"%d",&n); for(i=0;i<n;i++) { fscanf(fp,"%f",&data[i]); } fclose(fp); for(i=0;i<n;i++) { printf("data[%d]=%f\n",i,data[i]); } S=0; for(i=0;i<n;i++) { S=S+data[i]; }
av=S/n; lprintf("av=%f\n",av); S=0; for(i=0;i<n;i++) { S=S+data[i]*data[i]; } vari=S/n-av*av; printf("vari=%f\n",vari); if((fp=fopen("4data","w"))==0) { printf("FILE CANNOT OPEN\n"); return; } fprintf(fp,"%d\n",n); for(i=0;i<n;i++) { fprintf(fp,"%f\n",data[i]*3); } fclose(fp); } 1つの場合はこんな感じでできてるんですが、もうどうやったらいいのかさっぱりわからなくて… 528さんの言う、1+"data"もわからないんです。本当に無知ですみません。
どういうエラーがでるの?
fileio_hw1.c:56: 構文解析エラー が "if" の前にあります
fileio_hw1.c:61: 文字列定数の前に 構文解析エラー
fileio_hw1.c:61: 警告: データ定義が型や記憶クラスを持っていません
fileio_hw1.c:66: 警告: 関数宣言中に(型の無い)仮引数名があります
fileio_hw1.c:66: 警告: データ定義が型や記憶クラスを持っていません
fileio_hw1.c:67: 構文解析エラー が "for" の前にあります
fileio_hw1.c:71: 警告: データ定義が型や記憶クラスを持っていません
fileio_hw1.c:72: 構文解析エラー が "for" の前にあります
fileio_hw1.c:77: `n' がここでは定義されていません (関数の中ではない)
fileio_hw1.c:77: 警告: データ定義が型や記憶クラスを持っていません
fileio_hw1.c:78: 文字列定数の前に 構文解析エラー
fileio_hw1.c:78: 警告: 組み込み関数 `printf' と型が矛盾します
fileio_hw1.c:78: 警告: データ定義が型や記憶クラスを持っていません
fileio_hw1.c:79: `S' が再定義されました
fileio_hw1.c:71: `S' previously defined here
fileio_hw1.c:79: 警告: データ定義が型や記憶クラスを持っていません
>>531 これが3回ぐらいループする感じです
1を開き、データ読み込み、閉じる 1の平均、1の分散を計算し変数に格納 2を開き、データ読み込み、閉じる 2の平均、2の分散を計算し変数に格納 3を開き、データ読み込み、閉じる 3の平均、3の分散を計算し変数に格納 4を開き、1の平均、1の分散、2の平均、2の分散、3の平均、3の分散を書き出す これが基本形。 1,2,3の平均と分散は最後に使うので、別々の変数を6つ用意して格納しておく必要がある。 この処理が書けたら、同じ形の処理をforを使って使いまわす事を考える。 平均、分散を格納する変数を配列にし、3つのファイル名は配列に最初に格納してしまう。 文字列の配列はfloatと違ってちょっと扱いが特殊なので調べれ。
>532 まず、宣言は最初の一度だけ。 同じ変数を二度宣言するとエラー。 あと、型名と変数名の間にスペースを入れたほうがいい。 float data[20]; とか。
>>533-534 ありがとうございます!大分つかめてきました。
ただ変数の宣言がどうすればいいのか良くわかりません。
avやvari、data[i]とかはどうしたら良いんでしょうか・・・
>>514-515 スタイルに BS_BITMAP を入れて、BM_SETIMAGE で設定した方が簡単。
って、こんな時間に書いても読んでくれないような…。 オーナードロー使って、押したときにずらす処理とかフォーカスがきたときの枠の描画とか 面倒くさい処理も既に書き終わったのかなぁ…。
問題文が長いですが・・・C++でお願いします。 1. double型とint型の2つのプライベート変数をもつmyclassというクラスをつくれ。 そして、各変数について、データを入力する関数と出力する関数を作成せよ。 さらに、引数を2つ取り、2つの変数に一度に入力する関数を作成せよ。 main関数の中で、作成したmyclass型のオブジェクトを生成して 実際にデータを出し入れするプログラムを作成せよ。 2. 氏名、生年月日、血液型、性別を格納するクラスcardを作成せよ。 ・血液型はA:0,B:1,C:2,AB:3として、それぞれ対応した数値を変数で扱う。 ・性別も、血液型同様に数値を変数で扱う。 ・生年月日は、年・月・日の3つの要素に分けて扱う。 そして、一度に全ての情報を引数として受け取り、各変数に格納する関数setdataと、 格納されている内容を綺麗に整形して表示する関数showを作成せよ。 show関数では血液型や性別は数値でなく対応した文字に変換して表示する。 そして、cardの動作を確認する為の簡単なmain関数を作成せよ。 3. 引数のうちで最大値を返す関数maxを、引数として数値を2つ、3つ、4つ受け取るものを オーバーロードを使って作成せよ。 そして、main関数で適当な数値に対して、作成した関数を実行して動作を確認するプログラムを作成せよ。
>>538 class myclass
{
public :
myclass(int i,double d) : i(i),d(d){}
myclass(double d,int i) : d(d),i(i){}
~myclass(){ printf("%d %lf",i,d); }
private :
int i;
double d;
};
int main()
{
myclass(10,10.22);
myclass(10.22,10);
return 0;
}
>>538 スコープの問題ではまったので名前空間で括らせてネ
namespace My{
template<class T>
T max(T Parm1,T Parm2)
{
return Parm1 < Parm2 ? Parm2 : Parm1;
}
template<class T>
T max(T Parm1,T Parm2,T Parm3)
{
const T& temp = max(Parm1,Parm2);
return temp < Parm3 ? Parm3 : temp;
}
template<class T>
T max(T Parm1,T Parm2,T Parm3,T Parm4)
{
const T& temp = max(Parm1,Parm2,Parm3);
return temp < Parm4 ? Parm4 : temp;
}
}
int main()
{
printf("%d",My::max(1,3,8,4));
return 0;
}
>>538 の問題に疑問が。。。
・血液型はA:0,B:1,C:2,AB:3として、それぞれ対応した数値を変数で扱う。
C型って何ですか?
543 :
デフォルトの名無しさん :04/01/19 13:09
遺伝的アルゴリズムを使って Ax=b(A:5×3(10>3)の行列、x:3×1の列ベクトル、b:10×1の列ベクトル) 1 2 3 1 2 3 4 x1 2 3 4 5 x2 = 3 4 5 6 x3 4 5 6 7 5 例えばこんな感じの方程式を解きたいんだけど どうすればいいんですか? 普通は最小二乗法で解くんですけど 今回は遺伝的アルゴリズムでx1 x2 x3を求めなければなりません。 誰か教えてください(´・ω・`)
544 :
デフォルトの名無しさん :04/01/19 13:10
訂正 Ax=b(A:5×3の行列、x:3×1の列ベクトル、b:5×1の列ベクトル) でした
模擬テストの採点結果のファイルの任意の行に、自分のデータ を(3科目とも100点にする)muleを使って追加修正した ものを入力データとして使用し、以下の設問に答えるプログラム を作成せよ。 (1)科目毎に得点のベスト10の受験者のリストを出力する。 (2)3科目合計点のベスト20の受験者のリストを出力する。 (3)一科目でも40点以下の科目がある受験者のリストを出力する。 なお、受験者リストは、入力データを見易く編集してください。 注意 ! 入力データの最後は、オールゼロになっている。 1人分のデータを入力する変換仕様は、"%6s%3d%3d%3d%16s"を 使用すればよい。この意味することは、左端から6桁の文字列 の受験番号、英語、数学、国語(いずれも100点満点)、 最後は氏名で8文字(jisかな漢字コード)以内のかな漢字 で記録してあるので、かな漢字1文字を表現するのに2バイトが必要 ですので、%16sという仕様にする。 123456100050075小泉純一郎 012385024095064三田圭介 288975051030084黒沼サキ ←こんな感じのデータです
分割数を求める関数を書け たとえば整数5は次の7通りに分割出来るので5の分割数は7である 5 4+1 3+2 3+1+1 2+2+1 2+1+1+1 1+1+1+1+1 これを再起呼び出しを使って解くとの指定なんですが、 上の場合だとn以下の数を用いて足して5に出来る場合が何通りあるか、 数えるアルゴリズムが分かりませぬ。 再起呼び出しで足すのは分かるのですが何通りあるか数え方が分からないので進めなくなりました・・・ 。・゚・(ノД`)・゚・。誰かアルゴリズム教えてください お願いします
2つの整数をユーザーレベルで受け取り、ユークリッドの互除法によって 最大公約数を求めるプログラムを作成せよ。 要求仕様 1、ユークリッドの互除法で実際に最大公約数を求める部分はユーザレベル関数とせよ。 つまりメイン関数から2つの値、xとyを受け取り、 ユーザレベル関数内で最大公約数を求めるようにせよ。 2、最終的な結果として”xとyの最大公約数はzである。” という主旨の結果表示を、画面表示とファイル"gcm.txt"に書き出すこと。 3、最大公約数が求められないような値が入力された場合には、警告を発し、再入力を促すようにせよ。 また、この警告メッセージも画面表示とファイル"gcm.txt"に書き出すこと。
次の解を得るためのプログラムを作成せよ 身長170cmの人が水平距離で30m離れている、垂直に伸びる木の頂点部分を見上げている。 見上げる角度(degree)を入力することにより、この木の高さを求めるプログラムを作成せよ。 ただしこの木は観測者の前方にあるものとし、高さは1.7mより大きいとする。 要求仕様 1、高さを求める部分は、角度(degree)を引数として、高さの値を返す関数を作成して行う。 2、実現しえない角度が入力された時は、警告メッセージを発し再度入力を促すようにせよ。 3、計算は5回実行し、入力値とあわせて"result.txt"に書き出す形にせよ。 fopenの時の属性を"w"ではなくて"a"にすれば便利ではないか? 出力例 見上げる角度がX度のとき、この木の高さはYmである。 (5回これが続く)
>>546 #include <iostream>
int partition(int n, int x)
{
return (0 < n && 0 < x) ? (x == n) + partition(n-x, x) + partition(n, x-1) : 0;
}
main()
{
for(int i = 0; i < 30; ++i)
std::cout << i << ":" << partition(i,i) << std::endl;
return 0;
}
>>549 申し訳ありませんCしか分からないもので
std::cout << i << ":" << partition(i,i) << std::endl;
この部分Cだとどうなりますでしょうか?
先に言わなくてスイマセン(*´д`*)
>>546 再帰の底から戻るとき,return 1 にして,それを足し算していく。
こんな感じ。
int recursive(){
int sum=0;
if(....) return 1;
for(;;){
sum += recursive();
}
return sum;
}
(・∀・)サンクスコ 頑張りま!
下請けにx以下の数字を使って足してyになる場合の数を求めるような気がする。 hoge(x, y) = hoge(x, y - x) + hoge(x - 1, y)みたいに。
555 :
デフォルトの名無しさん :04/01/19 18:45
>547 int gcd(int m,int n) { int r; while(n != 0){ r = m%n; m=n; n=r; } return m; }
>535 533の方針で行くなら float av[3]; float vari[3]; あたりか。 ファイル名も配列に格納し、filename[0]のデータをav[0]とvari[0]に記録する感じ。 dataはavとvariを求めたら用無しになるので使いまわして問題ないと思う。
最後の問題で、よく意味のわからない問題が出題されて困り果ててます。 問 10個の要素(配列の大きさが10)を持つ整数型配列a,b,cがある。最初に配列aに 適当なデータを初期値代入したあとそのデータを、配列bには順方向に、配列cには逆方向に 代入し、最後に配列a,b,cの要素を出力せよ(for文を用いること) 順方向とは、a[0]をb[0]、a[1]をb[1],......a[9]をb[9]に代入すること 逆方向とは、a[0]をc[9]、a[1]をc[8],......a[9]をc[0]に代入すること この問題が解ける方がいましたらぜひお願いします
もれでも出来るかな・・・・ #include<stdio.h> int main(void) { int a[10],b[10],c[10]; int i,gyaku; for(i=0;i<10;i++) { printf("atai irena- a[%d]\n",i); scanf("%d",&a[i]); } //a[]に代入しますた for(i=0;i<10;i++) { b[i]=a[i]; } //b[]に代入しますた 続くっと
i=0; //i初期化 for(gyaku=9;gyaku>=0;gyaku=gyaku-1) { c[gyaku]=a[i]; i=i+1; } //これで逆順ですよっと for(i=0;i<10;i++) { printf("a[%d]=%d ,b[%d]=%d,c[%d]=%d \n",i,a[i],i,b[i],i,c[i]); } //確認しますタ これでデケルはず return (0); }
>>557-559 for(int i = 0; i < 10; i++)
{
b[i]=a[i];
c[10 - i + 1] = a[i];
}
のほうがよい。
> i=i+1;
++i or i++ と書くべし。
> c[gyaku]=a[i];
> i=i+1;
これをまとめると c[gyaku] = a[i++];
c[10 - i + 1] = a[i];→c[9-i]ですね int main(void) { int a[10],b[10],c[10]; int i,gyaku; for(i=0;i<10;i++) { printf("atai irena- a[%d]\n",i); scanf("%d",&a[i]); } //a[]に代入しますた for(i = 0; i < 10; i++) { b[i]=a[i]; c[9-i] = a[i]; } for(i=0;i<10;i++) { printf("a[%d]=%d ,b[%d]=%d,c[%d]=%d \n",i,a[i],i,b[i],i,c[i]); } //確認しますタ これでデケルはず return (0); }
>>546 分割数の方はうまくいった?
解答を載せてみるテスト。
int bunkatu(value,limit){
int sum=0;
int element;
if( value == 0 || value == 1 || limit == 1) return 1;
for(element=(value>limit)?limit:value; element>0; --element){
sum += bunkatu(value-element, element);
}
return sum;
}
int main(){
int ans = bunkatu(5,5);
}
>>539 printf()に%lfなんて指定子はない。
えーっと。過去ログ。 printf() float "%f", double "%f", long double "%Lf" scanf() float "%f", double "%lf", long double "%Lf"
>>565 標準ではないけど、「あまりにも間違える人が多すぎる」って
理由で"%lf"を許可している処理系は少なくない。
>>568 > そして、main関数で適当な数値に対して、作成した関数を実行して動作を確認するプログラムを作成せよ。
これが不完全ではあるが、あってるんじゃないか。
以下のプログラムをC, C++, Javaの何れかで書け。 100 INPUT "X,P,N"; X,P,N 110 B= X-INT(X/N)*N 120 A=1 130 FOR K=1 TO P 140 A=A*B 150 A=A-INT(A/N)*N 160 NEXT K 170 PRINT A 180 END これってBASICってやつなんですか? BASIC自体知らないから移植のしようがないんですけど・・・
>>570 見れば、おおよそ見当がつくだろう。
つーか、何を聞きたいのだ?
移植したものを書いてほしいのか?
そのBASICプログラムの解説を聞きたいのか?
センター試験ということで、その解答欄を埋めてほしいのか?
int x, p, n; printf("(x, p, n) = "); scanf("%d, %d, %d", &x, &p, &n); int b; b = x - (x / n) * n; a = 1; for(int k = 1; k <= p; k++) { a *= b; a -= (a / n) * n; } printf("a = %d\n", a); return 0;
>555 ありがとうございます! >548のほうもお願いします
問題2.(問題本文は
>>538 )について作ったのですが、長いので↓にはってみました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=45 しかし、結果は
-------------------------------------------
名前を入力してください。
CHINKO
生年月日を入力してください。
年、月、日の間では改行して次の行に入力してください。
(例)
1998
7
12
2994
2
20
血液型の番号を入力してください。
0:A 1:B 2:AB 3:O
2
性別を入力してください。
0:男(male) 1:女(female)
0
CHINKO 2994/2/20 ABmaleA maleA
----------------------------------
関数showでおかしな出力をしてしまうのですが、
どこがおかしいのでしょうか?
結果が下のようになるようにしたいのですが・・・
----------
CHINKO 2994/2/20 AB male
----------
strcpy()を使わないのは宗教上の理由か? 文字列は最後に明示的にヌルを入れないといかんぞ。 出力するときに止まらなくなる。 いじってないところは自動的にヌルだと思ってないか?
char name[20],blood[2]; → char name[20],blood[3]; それから文字列の最後に'\0'を入れておけよ。
1も各変数について「データを入力する関数と出力する関数を作成せよ。」というところまでやってみました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=46 ↑がソースなんですけど、結果が、
-------------↓成功例-------------
数字1を入力してください。
(小数点以下は出力されません)
5
結果は以下の通りです。
5
数字2を入力してください。
(小数点以下は出力されます)
7.6
結果は以下の通りです。
7.6
----↓わざと間違って入力した例---------
数字1を入力してください。
(小数点以下は出力されません)
2.67
結果は以下の通りです。
2
数字2を入力してください。
(小数点以下は出力されます)
結果は以下の通りです。
0.67
-----------------------------
と、こうなってしまうのですが、どういうことなのでしょうか?
>>579 ストリームは、入力されなかった部分がバッファに残る。
フラッシュすれ。
>>579 ( ・3・) アルェー またお前かYO
>>575 C++なのになぜ文字列にchar配列を…
>>581 std::cinに対するフラッシュは、標準C++ではCのstdinに
対するフラッシュと同じく、未定義。動く処理系もあるが
(VC、BCCなど)。
だからCと同じようにcharの配列に文字列として読み込んで、
std::atoi()を使うか、std::stringstreamに読み込んでint型の
分だけ取ったら後はstd::stringstream.str("");でストリームを
クリア。
>>584 未定義というより、std::istreamに初めからflush()というメンバ
関数もマニピュレータも用意されてないのが普通だけどね。
>>583 え?みんなString使ってんの?
ボスがCしか使えない職場では、charしか使っちゃダメなんだぞう!
ファイルの入出力なんか、ストリームすっ飛ばして低レベル入出力
(Win32SDK)なんだぞう!
オブジェクトのシリアル化を_write()とかで書いてるやつ、
オレ以外に見たことないぞ!チクショウ!
>>586 VBの話ですか?C++ではstd::stringかstd::ropeですよね・・・・念のため。
BCBにはAnsiStringなんてキモいクラスもありますけど。直接sprintf()
なんてメンバ関数を呼べる変態文字列クラス。
いや。まあ・・・「課題」ではしょうがないとはいえ・・・ 柴田望洋センセの本では、std::stringは使わないで話が進んでたな。確か。
>>588 std::stringを使うとどうもして文字列の扱いがBASICっぽく
なっちゃいますからね。あくまでもポインタ!という姿勢
が柴田先生はお好きなのでしょう。
590 :
デフォルトの名無しさん :04/01/20 01:27
C++の宿題です。 学籍名簿ファイル(gakuseibo.dat)から、データを読み出して、画面に表示するプログラムを作成しなさい (プログラムをレポート用紙に記述しなさい) クラス名:Student データメンバ:@学生番号、A(学生)名前、B入学年度 メンバー関数:@データをファイルから読み込む関数 Aデータを画面に表示する関数 どなたかできませんか?
>>587 ManagedCでString。
MFCでCString。
ATLではbstr_tを使ってたなぁ。
どうでもいいけどね。
せっかくのC++なんだから、文字列ごときにクラスを使うなって話もある。
そのへんは組むプログラムによって重要度が違うからなんともいえんが、
標準C++の課題をこなすのにstd::stringなんか使ってても埒が明かないのは確か。
#include <fstream> #include <iostream> class Student { int snumber; char name[50]; int enteryear; public: void readData(char* fname) throw (const std::ios::failure) { std::ifstream ifs(fname); ifs.exceptions(std::ios::failbit); ifs >> snumber >> name >> enteryear; } void printData() const { std::cout << "学生番号 = " << snumber << "\n名前 = " << name << "\n入学年度 = " << enteryear << std::endl; } }; int main() { Student s; try { s.readData("gakuseibo.dat"); } catch (const std::ios::failure&) { std::cerr << "ファイルが開けません。" << std::endl; throw; } s.printData(); }
これは
>>590 への答え。
例えば名前にスペースが混ざっていても読めるようにとか
何人でも読めるようにとかの条件があったら書いて下さい。
起きていたら答えます。
594 :
デフォルトの名無しさん :04/01/20 02:04
ファイルのコピーを行うプログラムを書け このプログラムは、二つのコマンド引数を受け取る。第一引数は入力ファイルの名前、 第二引数は出力ファイルの名前である。 _| ̄|○モードとかサッパリです・・・
>>594 int main(int argc, char **argv)
{
char buf[1000];
sprintf(buf, "/bin/cp %s %s", argv[1], argv[2]);
return system(buf);
}
C++?C?
main(int,char* argv[]){argv[0]="/bin/cp";execv("cp",argv);}
Cでございます
>>598 どうぞ。常にバイナリモードで開いておくとどの処理系でも
安全。
#include <stdio.h>
#include <stdlib.h>
int main(int ac, char *av[])
{
FILE *fi, *fo;
char buf[512];
if (ac < 3) exit(1);
if ((fi = fopen(av[1], "rb")) == NULL) exit(1);
if ((fo = fopen(av[2], "wb")) == NULL) exit(1);
while (fgets(buf, 512, fi))
fputs(buf, fo);
fclose(fi);
fclose(fo);
return 0;
}
>>590 何人でも読めるようにした(MAXSを変更。ifstreamの関係で
MAXSは最大データ数+1にしてくれ)。で、もう寝る。後は明日。
#include <fstream>
#include <iostream>
const int MAXS = 100;
class Student {
int snow;
int snumber[MAXS];
char name[MAXS][50];
int enteryear[MAXS];
public:
Student() : snow(0) {}
void readData(char* fname) throw (std::ios::failure) {
std::ifstream ifs(fname);
if (!ifs)
throw std::ios::failure("ファイルが開けません。");
while (true) {
if (snow == MAXS)
throw std::ios::failure("データ数が多すぎます。");
ifs >> snumber[snow] >> name[snow] >> enteryear[snow];
if (!ifs) break; // ファイルの終わり
snow++;
}
}
void printData() const {
for (int i = 0; i < snow; i++)
std::cout << "学生番号 = " << snumber[i] << "\n名前 = " << name[i] << "\n入学年度 = " << enteryear[i] << std::endl;
}
};
int main() { Student s; try { s.readData("gakuseibo.dat"); } catch (const std::ios::failure& ift) { std::cerr << ift.what() << std::endl; return 1; } s.printData(); }
>>599 dクス!
質問ですが第一引数のint ac が入力ファイルなんでしょうか?
>>602 違うよ。acはargument countの略で、引数の数を表す。
実行形式のパスも含むから、実際の引数はac - 1。
で、av[0]が実行形式のパス、av[1]が入力ファイル、
av[2]が出力ファイルってわけだ。
>>605 出来たには出来たんだけどさ
tanの値がおかしいんだよね
ああ、度数→ラジアンへの変換が必要だな。 d度→rラジアンへの変換方法 r = (2 * π * d) / 360 だ。
tanの入力はラジアンなのか・・・ 一応うp #include<stdio.h> #include <conio.h> #include<math.h> double return_takasa(double degree) { double takasa,T; T=tan(degree); printf("tan is %f",T); takasa=30*T+1.7; printf("takasa %f \n",takasa); if(takasa<=(1.7)) { printf("arien mokkai irero gora!\n"); return 0; } return (takasa); }
訂正 キレイに動作したくさい #include<stdio.h> #include <conio.h> #include<math.h> double return_takasa(double degree) { double takasa,r; r = (2 *3.14*degree)/ 360; degree=r;//変換しますたよっと takasa=30*tan(degree)+1.7; printf("takasa %f \n",takasa); if(takasa<=(1.7)) { printf("arien mokkai irero gora!\n"); return 0; } return (takasa); }
int main(void) { double a[5],x,b[5],degree; int i; for(i=0;i<5;i++) { printf("input degree \n"); scanf("%lf",°ree); a[i]=return_takasa(degree); if(a[i]==0) continue; b[i]=degree; } for(i=0;i<5;i++) { printf("a[%d]:%f,b[%d]:%f\n",i,a[i],i,b[i]); } FILE *fp; fp=fopen("result.txt","a+"); for(i=0;i<5;i++) { fprintf(fp,"見上げる角度が%f度のとき、この木の高さは%f mである \n",b[i],a[i]); } fclose(fp); getch(); return 0; }
16代目の354と問題全く一緒だ・・・ 同じ学科なのか・・・
>>611 君はえらい。ちゃんと過去ログものぞいて。でも、質問する前にするのが吉。
1から1000までの整数のうち素数をすべて挙げて、ファイル sosuu.datに書き出せ。
要求仕様
1、求められた素数は横並びに表示し、素数を7個書き出すごとに改行を行うこととする。
(出力例)
2 4 6 8 10 12 14
16 18 20 22 24 26 28
これのほかにも
>>548 もお願いします。
614 :
デフォルトの名無しさん :04/01/20 14:46
593
>>600 >>
ありがとうございます!!かなり助かりました。
キーボードから読み込んだ実数値の小数点以下を、表現するプログラム をC++で作成したいのですが教えてくれませんか?
617 :
デフォルトの名無しさん :04/01/20 16:01
大学のレポートです。 キーボードから一桁の整数を二つ%cで入力し、各々の数字を数値に変換して それらの和を求めるプログラムを作成せよ。文字コード表から分かるように 数値の0は0011 0000即ち、10進数で48になっている。即ち、文字コード表現 の数字は48だけゲタをはいている。 以上です。どうかお願いします。
>>613 http://www.cis1.c.dendai.ac.jp/c_master/C_6.htm のプログラム例6−2ほんの少し改造して配列に記憶させる
FILE *fp;
fp=fopen("sosuu.dat","a+");
for(i=0;i<n;i++)//nは素数の数ですよっと
{
if(sosuu[i]%7==0)
fprintf(fp,"\n");
fprintf(fp,"%d ",sosuu[i]);
}
fclose(fp);
こんな感じで動くと思います。検索したら電大にいいソースあったんで
619 :
デフォルトの名無しさん :04/01/20 16:21
620 :
デフォルトの名無しさん :04/01/20 16:31
>>617 char a,b;
scanf("%c %c",&a,&b);
printf("%d", (a-48) + (b-48));
でよいのでは。
n個のデータのヒストグラムを表示する、C++のプログラムの作成を教えてくれませんか?
>618 素数を7で割った剰余が0になるわけない。 誤:if(sosuu[i]%7==0) 正:if( (i +1)%7 == 0) >616 500.05を入力されたら0.05を返すとか? それなら、元の数値から、元の数値の小数点部分を切り捨てたものを引けばいい。
floatの行のスラッシュが不足してる_no 参考までに書き加えた行だから突込みどころはそこでなく。。。
624 :
デフォルトの名無しさん :04/01/20 19:10
#include <stdio.h> int main(void) { int no, i; int x = 1; printf("整数を入力してください:"); scanf("%d", &no); for (i = 1; x <= no; ++i) printf("%d", i); x++; if (i == 9) i = 0; return (0); } 入力したno回0〜9(9の次は又0から)まで表示するのですが、うまくいきません 表示例 整数を入力してください:25 1234567890123456789012345
>>623 newで確保したらぁ〜?
チミのみみっちい情報じゃ,適当なことしかいえんよ。
#include <stdio.h> int main(void) { int no, i; int x = 1; printf("整数を入力してください:"); scanf("%d", &no); for (i = 1; x <= no; ++i) { if (i != 10) printf("%d", i); x++; if (i == 10) i = 0; } return (0); } なんとか自力でできましたが、ものすごく汚くなってしまいました。
for (x=1; x <= no; ++x) printf("%d",x%10);
>>626 for (i = 0; i < no; ++i) {
#if 0
printf("%d", i % 10);
#else
printf("%d", x++);
if (x == 10) x = 0;
#endif
}
簡単なカードゲームの関数仕様書を 書かねばならないのですが 何か参考になるソースがあったら教えてほしいです
カードゲームって 「俺のターン!ドロー」ってやつですか? 最近の学生はたいへんですね
2項係数(n個の中からr個を選ぶ組み合わせの数)を、計算するC++プログラム から、最大数との割合を、各々について求めよ。という問題なのですが、教えてくれませんか?
いえいえ、 ポーカーとかその程度のレベルでございます(;´Д`)
>>632 おまいさん,ポーカーの役判定(単純作業)の面倒臭さを知らんな。
ブラックジャックにしとけ。
ある集団の試験の結果を配列に入力した後,以下を出力するプログラム。 ・平均点と標準偏差。 ・各個人の得点とその偏差値得点。 負の数値を入力したときに実行を終了するもの。 ・得点はリダイレクションで入れる。 →C言語でのプログラムでおながいします。
>>638 だめ!!
#include <iostream.h>
これはいただけない。
#include <iostream>
C++ならこっち。
あ゛。言葉変だった。 今のC++はこっち。←この言葉を採用して。
641 :
デフォルトの名無しさん :04/01/20 21:05
UNRAR.DLLとUNRAR32.DLLを使用するRarUtyのような D&Dするとアーカイブ内のファイル構造を表し、 処理ボタンを押したり単解凍したりできるプログラムを MicroSoft Visual C++ 6.0でお願いします。
>>642 すごい宿題だな。おれ、VS.NETだからだめだな。
>642 抽象的だし、しかもGUIかよ… ほんとに宿題か?
宿題でRARなんか扱うかなあ?
新卒使えないプログラマが無理矢理作番ふられて 困って書き込みしてたりして。
>>642 大学の一般教養でVC++の講義の1年の総決算レポートというか課題です。
同じく講義をとっているプログラミングの得意なたわけが
生徒のレベルもよくわかってない先生に上記課題を提案・即決しました。
ちなみに1年間やっていたのはVB→VC++6.0のMFCプログラミングの基礎です。
さらに勘違いされては困るのですが私たちの専攻は臨床心理学です。
もちろん文系で、私も含めてほかの生徒はすべて今年の初めに初めてプログラミングを
してみた人ばかりです。
いろいろやってみたのですが、複雑すぎてわかりません。
>>647 とりあえずunrar32.dllを使って良いのかどうか聞いておこう。
使って良いならdllの説明書読めば結構簡単かも。
自作でrar解凍する関数などこんな場に出せるほど短いコードじゃない。
>>647 ・・・ひでぇ世の中だねぇ・・・
GUIはかなり面倒くさいんで、自力で何とかなりませんか?
GUI部分は、ね。
あ、使って良いってもろに書いてるじゃん、須磨祖 とりあえずunrrar.dllは引数でファイル名だけ送れば ルートに解凍するはずだぞ。 D&Dはどこぞのサイトで丸ごとコードが落ちてた記憶があるからそれを ぱくってくるべし。
>>648 unrar32.dllとunrar.dllの二つを動的/静的のどちらかのリンクで(できれば動的リンクで)
という指示でした。
一応、同じ講義を受けている友達3人と図書館で調べ、
dllファイルの動的リンクとD&Dでファイルのフルパス取得はできました。
単解凍とか普通の解凍とかAPIをどのような順番で使っていくのかよくわかりませんでした。
なんかマジっぽいのでしょうがねえ、説明書読むか、、 親戚来てるから期待するなお
unrar32.h または comm-arc.h をインク ルードし LoadLibrary()/GetProcAddress() によりダイナミックにリン クすることが必要です ここまでは出来たのか?
GUI部分はMFCのダイアログベースを使って リストビューとボタン二つ(処理と終了)だけのものですが作りました。
656 :
デフォルトの名無しさん :04/01/20 21:44
>>652 ぱっと見しか見てないから丸飲みしないほうがいいと思うけど
書いてみる。あと、unrar32,dllのAPIの話なんで。
0.ライブラリロード(LoadLibraryとか)
1.UnrarGetVersionでunrar32,dllのバージョンチェック
2.ファイル名取得(D&Dでもなんでもいい)
3.UnrarCheckArchiveで正常な書庫か調べる。
4.UnrarGetRunningで圧縮/解凍などファイルアクセスを伴う操作をできるか
調べる。
5.Unrarにファイル名とか出力ファイル名をあたえて解凍する。
のながれで解凍はできるかもしれない。
あと、全てのUnrar32apiはUnrarQueryFunctionListで本当に
使用できるか確認した方がいいかもしれない。
ためしてないので正しいかわからないのでそのときはすまん。
UNRAR32.DLLのアーカイブ中にCで書かれたサンプル発見。
>>654 はい、今日できました。
rarファイル以外のものをもらったとき
ウィンドウタイトルかステータスバーに「rarファイルではありません」と表示させる方法と
ステータスバー自体をどうやってつけるのかというのがいまいちよくわかりません。
また、単解凍とか普通の解凍をどのようにdllへ送って受け取るのかがよくわかりません。
int WINAPI Unrarに書いてある説明が意味不明でよくわかりませんでした。
szCmdLineの説明だけはわかるのですが、ほかの部分の意味がよくわからないし
このAPIだとたぶん単解凍はむりなんじゃないかというのが友達と出した結論です。
説明書のUnrarOpenArchive以下のAPIをつかうのではないのかと何となく考えているのですが。
1/31の13時までにフロッピーディスクまたはCDまたはE-Mailで提出ということなので
これからも友達とは考えていこうと思っているのですが、どうしても分からなかったら
言い出しっぺのやつに頭下げてコピーさせてもらおうと話していました。
>どうしても分からなかったら 言い出しっぺのやつに頭下げてコピーさせてもらおうと話していました これほど腹が立つことは無いだろうね・・・
>>657 なるほど、ありがとうございます。
UnrarGetVersion [no]→バージョンが古いです
↓[yes]
ファイルフルパス取得 [no]→フルパス取得に失敗しました
↓[yes]
UnrarCheckArchive [FALSE]→対応しているrarファイルではありません
↓[yes]
UnrarGetRunning [TRUE]→unrar32.dllは現在使えません
↓[FALSE]
UnrarQueryFunctionList(順序数?) [FALSE]→できません
↓[TRUE]
Unrar(?, コマンド, ?, ?)
という感じで普通の解凍はなんとかできるでしょうか?
>>660 それがしゃくなんで、なんとか作ってやろうということになったんです。
まさか心理学以外でこんなに頭を使うことになろうとは思いませんでした。
>662 単解凍の場合、 >657の(4)まで進めてたあと、 1.UnrarOpenArchive() でアーカイブを開く。 2.UnrarFindFirst() 〜 UnrarFindNext() で一つずつ情報を取得して 目的のファイルを探す。取得した情報は INDIVIDUALINFO 型 に入るので、 szFileName メンバと目的のファイル名を一致させるなどして判定。 3.ファイルが見付かったら、 UnrarExtract() で dwMode に EXTRACT_FOUND_FILE を指定して解凍。 4.UnrarCloseArchive() でアーカイブを閉じる。 って感じかな。試してないので間違ってたらすまね。
>>662 rarの部分はわからないので俺がわかる範囲内で。
SetWindowTextでウィンドウタイトルを変えれるよ
がんばれ
>>663 ありがとうございます。なんとなく構成がわかってきました。
それで今気づいたのですが、このUnrarExtract()って説明書によると最新版で
まだ未実装って書いてあるのは、、、間違いではないですよね。
>>665 ありがとうございます。
タイトルバーのキャプション変えることができました。
なんかにわかにunrar32.apiに書いてあることが分かってきたのですが 使うことのできるWINAPIではどう考えても単解凍は無理なのではないでしょうか?
>666 [未実装]見落としてた…。 って、今考えたら UnRar() の szCmdLine に 目的のファイル名を入れてやるだけでいけそ。 >663 忘れて_no
>666 で出来そうだけどな。 実際アプリ作るとしたらこれだけど。 UnRar() の szCmdLine 使えばとりあえず解凍出来そう。 とりあえずUnRar(ファイルパス) やってみそ
いま、UnrarExtractをGetProcAddressしようとしたが失敗した。 確かに未実装のようです(ドキュメントに書いてあるから当たり前だな) 目的のRarUty型にするなら、 INDIVIDUALINFOのファイル名をリストビューコントールなり にせっせとほおりこめば、それっぽく出来るかなと。 あとは、リストビューの選ばれたアイテムからそのテキスト を取り出して、Unrarに渡せばいいんじゃないかと。 Unrarの引数は、 const HWND hWnd : 呼び出し側のウインドウハンドル。 どうしてもわからんかったらNULLでもいいかも。 LPCSTR szCmdLine : unrar32.dllにわたすコマンド。 unrar32d.txt を読めばいいと思う。 LPSTR szOutput : unrar32.dllは処理結果なりを文字列で返すみた いなので、それを受けるバッファ。適度に大きけ れば問題ないと思う。最後尾にNULL文字が付く 文字列が帰ってくるようだ。 cons DWORD dwSize : szOutputの大きさ。 こんなところですかねぇ。例によって試してないからまちがってたらすまん。
>>669 >>670 どうも世話をかけます。
つまり
普通に解凍は
Unrar(NULL, e -x ArchiveFilePath);
単解凍は
Unrar(NULL, e -x ArchiveFilePath FileName);
// ArchiveFilePathはrarファイルのフルパス
// FileNameはUnrarFindFirst()〜UnrarFindNext()で見つけた
// 書庫内のファイル名で、リストビューで選択されたもの。
というようにやれば最低限の目的は達成できそうです。
ありがとうございました。
さっそくやってみます。
本当にありがとうございました。
その問題を提起したバカに負けないような機能を実装したいな。 そいつはおそらくすでに自分で一度やってると思われ。 なんか簡単で目を引くもののアイデア無い? プログレスバーとかよさげだけどちょっと手間かかるしな。
D&D 起動時のとき→WinMainの引数にファイル名が渡される ウィンドウのとき→すまん、どーすりゃいーんだ(;_;)
DragAcceptFilesでDnDの許可して、WM_DROPFILESで通知を受けて、 DragQueryFileでファイルの情報を得る。
整数を入力して、その符号を反転するプログラムを書け 入力が5なら-5が答 ただし単項のビット反転演算子~を利用すること 二進数変換がよく分からず、解けません。お願いします
>>676 ほとんどの処理系で使われている「2の補数表現」では、
整数 n に対して
-n == (~n + 1)
話を簡単にするために、整数のビット数を4として説明すると、
4ビット整数では 0 と 10000 (2進表現)の区別が付かない。
(5ビット目の1は消えちゃう)
で、n + ~n は 常に 1111 になるから、
n + ~n + 1 == 10000 (== 0)
よって、
-n == ~n + 1
#include <stdio.h> int main(void) { int n; if(scanf("%d",&n)!=1) return 1; printf("%d",~n+1); return 0; }
>>677-8 ありがとうございます
てっきりビット数(00101)とか整数で入力するのかと思ってました・・
デキナイワケダ
Numerical Recipes in C ダウンロードしますた。
681 :
デフォルトの名無しさん :04/01/21 11:33
/* 配列の全要素に0.0を代入して表示 */ #include <stdio.h> int main(void) { int i; double vd[5];/* 要素数が5の配列 */ for (i = 0; i < 5; i++) vd[i] = 0.0; for (i = 0; i < 5; i++) printf("vd[%d] = %.1f\n", i, vd[i]); return (0); } で for (i = 0; i < 5; i++) vd[i] = 0.0; を抜かしてしまって、実行したらvd[2]だけ間違っていたのですが、これはなぜですか?
確保した領域がたまたまそうなってた。
683 :
デフォルトの名無しさん :04/01/21 12:24
>>682 メモリを初期化や代入をしなかったから、残っていたデータを読み込んでしまったということでしょうか?
>>656 四角錐のような気がするのは漏れだけ??
686 :
デフォルトの名無しさん :04/01/21 17:39
学校のレポートです。 文字コードと文字との対応表を作る。文字コードは16進数で表示し、1行に 8文字分(8で割ってあまりがゼロなら改行する)ずつ出力させる。計算機で 扱う文字は、メモリ上ではすべて数値(8ビット)で表現されるので、画面に 表示する文字コードは、0x20〜0x7fまでとする。 どなたかお願いします。
うpしたやつのコメントに壮大な間違いが。すまね。 訂正箇所 最初のこめんと 正方形 : 立方体
689 :
スロッター30 :04/01/21 18:52
学校の課題です。 Wolframのセルオートマトンのシミュレーションを行うクラス CA::CA(int r,int n);//規則番号r,格子数nで初期化 int CA::update(void);//状態を更新する int CA::operator () (int k);//格子k の状態を返す 規則番号は0から255の整数で与えること。また、境界条件を設定できるメソッドを作成すること。 どなたかお願いします。よろしくお願いします。
>>686 #include <stdio.h>
int main() {
int i;
for(i=0x20;i<=0x7f;i++) {
printf("%02X : %c ",i,i);
if(!((i + 1) % 8)) putchar('\n');
}
return 0;
}
691 :
デフォルトの名無しさん :04/01/21 20:02
整数を入力して、その整数のビット表現の中で1になっているビット数を表示する プログラムを書け。 たとえば入力が11なら3が答えである お願いします・・・
>>692 int countbit(int x) {
if (x == 0) return 0; // 0のビット表現が00...0だとする。
return (0x1 & x) + countbit(x >> 1);
}
>>694 やばいね。
return (0x1 & x) + countbit(*(unsigned int*)&x >> 1)
にしてみる。
ちゃんとsizeof計ってunsigned charで読んで行くのが
ほんとはいいのだろうけど。
0x1←これが何を表してるのかワカリマセン どなたか教えてもらえますか?
この板の下記スレ
今までに見たソースコードで一番感動したのは
の370で面白いのが紹介されてる。一見の価値あり
>>693-695 面倒だから書かないけど
ビットパターンの方をシフトしていって
cnt+=(bit&x)?1:0 ;
みたいなのもいいかも
>>696 十六進数の1。1U(unsigned intの1)と同じ。
700 :
デフォルトの名無しさん :04/01/21 21:30
>>698 なんでunsignedなんだ?
0x1は1(int)だぞ。
>>700 間違えて覚えてました_| ̄|○。ありがとう。
ゴミを書き込んで申し訳ないです。
703 :
デフォルトの名無しさん :04/01/21 21:38
>>702 printfの%xはunsigned intとして表示するから勘違いしたのかもね。
正規表現はどこ? それと仕様なんだけどaBCdeとかも検出していいの? (つーか入力が全部大小揃ってるとは限らないわけだけど) ならそれぞれの文字の等値テストの部分で、 両方とも大文字に直してからテストすればいい。
>>704 正規表現のプログラムの部分は書いてないです。
aBCdeとかも検出してもいいです!
>>ならそれぞれの文字の等値のテストの部分で
具体的に言うと、どのようなプログラムにすればいいんですか?
ご教授よろしくお願いします。・゚・(ノД`)・゚・
c1とc2を大文字小文字区別せず比較 int ccmpi(char c1, char c2) { return tolower(c1)==tolower(c2); } 自分のプログラムの文字比較部分を置き換えろ。 つーか素直にstrcmp使ってりゃstrcmpiに変えるだけで済んだんだけどな
>>706 即レスありがとうです!
strcmpiですか‥・。そっちのほうが便利なら、全部書き直してみようかな。
strcmpiをつかったら何行くらいですみそうですかね?
>>706 strcmpiは環境依存じゃなかったっけか?
709 :
デフォルトの名無しさん :04/01/21 23:30
n人分の名前、性別、年齢、生まれた月のデータを入力し、 生まれた月・アルファベット順に並び替えて出力するプログラム。 参考書を見ても検索してもscanfを使った構造体の方法とソートの方法が 分かりませんでした。 お手数ですがどなたかよろしくお願いします。
一応書いとくけど、もし使うなら strcmpi()じゃなくてstrncmpi() でパターンの文字数を与えるべし
>>709 DOSで入力?
マンドクサー
ファイル読み込みにしない?
>>711 DOSってなんですか?
初心者でごめんなさい…(泣)
今構造体を習っているのでそれを使うのだと思うのですが、めんどくさいのでしょうか。
申し訳ないです。
>>712 開発環境を書いてね。
コンパイルした後の画面どんなの
scanfだと必然的にDOS画面だと思うけど
>>709 scanf()で直接構造体のメンバに代入するのができないわけ?
構造体の中の変数を引数にすればいいだけ。
コンパイルが通るまでやって、体で覚えなさい。
ソートは、構造体の配列を作って、各要素どうしで構造体の中のメンバ変数を比較して、
順番が違ったら構造体の中身を全部入れ替える。それを繰り返すだけだよ。
バブルソートってやつだけど。
まずは文字配列の中の文字を並べ替えるのから。
コンパイルするとBorlandC++〜〜〜と出てきます。 WINDOWSのメモ帳とコマンドプロンプトを使ってます。 こういうことでいいのでしょうか。変な事言ってたらすいません。
>>714 うーむ。バブルソートは使っちゃいかん。せめて挿入ソート。
普通はqsort()。
>>715 まあ、今回は伝わってるからいいが、
コマンドプロンプトのコピーを貼り付ける癖をつけるとよい。
717 :
デフォルトの名無しさん :04/01/22 06:16
悪い、2年になってこんなのも解けないのだが かなり留年しそうだから助けて下さい プログラ1 aとbの数値を入れてaとbの四則演算をするプログラム 小数点切捨てと切り上げの2種類 プログラ2 うるう年も計算に入れて 西暦n年a月b日は、その年の1月1日から数えてx日である と表示するプログラです 金曜まで提出なんだ・・・すまん留年したら学費払えねぇ
プログラなんて勝手な略語を作るな。 まる一日あるなら過去ログを当たれ。 四則演算も日付カウントもここ5スレくらいまでの間で既出。
>>685 四角錐でした・・・
>>687 ありがとうございます。
しかし、そのソースをコンパイルすると、
C:\vc2\gra.c(6) : error C2143: 構文エラー : '{' が ':' の前に必要です。
C:\vc2\gra.c(6) : error C2059: 構文エラー : ':'
↑こんなエラーが出て動かせないんです。。
void CPyramidView::OnDraw(CDC*pDC)←この行です。
687ではないが、突っ込む。 もともと動かないソースを弄って、うごくわけないだろうが!! っていうか、gra.cってなんだよ!! これはVCのプログラムだろ、youのコンパイラを晒せ!! まあ、そういうこった。
721 :
デフォルトの名無しさん :04/01/22 12:34
Wolframのセルオートマトンのシミュレーションを行う CA::CA(int r,int n);//規則番号r,格子数nで初期化 int CA::update(void);//状態を更新する int CA::operator () (int k);//格子k の状態を返す 規則番号は0から255の整数で与えること。また、境界条件を設定できるメソッドを作成すること。 わかりません。お願いします。
722 :
デフォルトの名無しさん :04/01/22 12:36
>>721 何でCスレにマルチしてるの?
つーかどの規則番号がどんな遷移の規則に
対応してるのなんてところまでふつうは知らない。
まともに答えて欲しいならきちんと定義するか参考論文くらい晒してね。
724 :
デフォルトの名無しさん :04/01/22 14:27
#include<stdio.h> int main(void){ int table[2][12]={31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31}; int n,a,b,i,x; printf("n,a,b\n"); scanf("%d%*c%d%*c%d",&n,&a,&b); x=b; for(i=1;i<a;i++) x+=table[(n%4)&&(!n%100)||(n%400)][i-1]; printf("x:%d",x); return 0; }
725 :
デフォルトの名無しさん :04/01/22 14:35
2進数文字列を10進数数値に変換するプログラム わかりません、お願いします!!
728 :
デフォルトの名無しさん :04/01/22 15:00
>>726 マルチってunsignedってやつですか?
最大20桁くらいの2進数文字列が10進数値に変換できれば
いいです。よろしくお願いします。
>>725 #include "string.h"
#include <cmath>
int BitStrToVal( char*p )
{
int res = 0;
int bval = (int)pow(2, strlen(p)-1);
printf("len=%d, bval=%d\n", strlen(p), bval);
for( ; *p ; bval>>=1,p++ ){
int v = int( *p-'0' );//必要なら文字をチェックしてNG処理
res += v*bval ;//または、if(v)res += bval ;
}
return res ;
}
731 :
デフォルトの名無しさん :04/01/22 18:23
cを入力したら時計回り、wなら反時計回りにモーターを回転させるプログラム を作るレポートが出たのですが分かりません。下をどう変えればいいのでしょうか? main() int dnum,nValue,i,n; int b[4] = {1,2,4,8}; system("clear"); printf("Enter the device number :"); scanf("%d",&dnum); PpiOpen(dnum,0); PpiControl(dnum,FBIPPI_8255_CONTROLLER1,FBIPPI_PORT_A,b[i]); printf("Output data:%02x\n",b[i]); for(n=1;n<=20000000;n++) ; } } while(1); PpiClose(dnum); } お願いします。
>>725 C++限定
#include <iostream>
#include <string>
#include <bitset>
int main()
{
using namespace std;
string in;
cin >> in;
cout << bitset<32>(in).to_ulong() << endl;
return 0;
}
733 :
733◇質問です。お願いします :04/01/22 18:52
734 :
間違え箇所がぁ :04/01/22 19:19
735 :
デフォルトの名無しさん :04/01/22 19:26
入力した整数が素数であるかどうかを調べるプログラムをお願いします。 繰り返しはしなくていいそうです。あと1以下が入力したらエラーとでるようにお願いします。
>>733 短いので "END" を例にすると
else if((**str1)== 'E' && (**str1)== 'N'&& (**str1)== 'D'){ /* いま見ている文字がENDだったら */
これは常に偽だと思う
else if( !strncmp( *str1,"END", 3 ))
みたいにすべきではないだろうか?
予約語とそのステータスをテーブルにしておいて、それを返す
サブルーチンを分離しておけば見通しもよくなると思う
>>733 DECLARE を例にとると、
else if(**str1 == 'D' && *((*str1)+1)== 'E' && *((*str1)+2)== 'C' && *((*str1)+3)== 'L' && *((*str1)+4)== 'A'
&& *((*str1)+5)== 'R' && *((*str1)+6)== 'E'){ /* いま見ている文字が'DECLARE'だったら */
strcpy(str2,"DECLARE");
(*str1) += 7;
だね。お勧めは
>>736 の方法だけど。
名前、昔のが残ってた…鬱
>>731 んー、パラレルポートからデータを送信してるのかな?
だとすると、その先の装置に依存するので何とも言えない。
>>734 わけわからん。軸選択追加せんでも動かないと思うんだが。
とりあえず、
double x[256];
...
answer =& x[2];
return answer;
このxの中身は関数から出ると壊れるので、
static double x[256]
にせよ。
# x[2]だけ返せばいいのだろうか。
結論 ガウスの消去法など知らなくても生きていけるし プログラマにもなれる。
誰かお願いします・・。
>>744 =735
#include <stdio.h>
int main() {
int i,d;
printf("input:");
if(scanf("%d",&d) != 1 || d <= 1) {
printf("入力が不正\n");
return 1;
}
/* 頭の悪い単純な力業。もっと最適化の余地はあるのでいろいろ試してみること */
for(i=2;i<=d;i++) if(d % i == 0) break;
if(i==d) printf("%dは素数\n",d);
else printf("%dは素数違う\n",d);
return 0;
}
for(i=2;i<=d;i++) if(d % i == 0) break; は√dまで調べればおけ
>>748 それを言い出すと、2以外の偶数調べてるのも。。。となるから、もっと最適化の余地はあると書いたんだが。
>>737 「開けたら落ちる」は常に行われるのでは?
→つまり、ある引出しを見たとき0でも1つ減っている(かもしれない)
n=0; for(p=0; p<=i; ++p) n+=(tbl[i])?1:0;
。。。ちと違うな
>>750 説明が足りなかったようでスマソ。
いきなりi番目の引き出しを開けたときに0個だった場合は
元のボールの数が1か0かの判断をどうするのか、といこうとが
問題の重要部分っぽい。
>>737 あってると思うよ。(計算機で)実験して確認したら?
755 :
デフォルトの名無しさん :04/01/22 22:34
>>743 助かりました。本当に有難う御座います。
** tbl[5]=5 ** tbl[4]=4 ** tbl[3]=3 ** tbl[2]=2 ** tbl[1]=1 ** tbl[0]=0 look >> tbl[5]=4 look >> tbl[4]=4 look >> tbl[3]=3 look >> tbl[2]=2 look >> tbl[1]=1 look >> tbl[0]=1 ** tbl[5]=4 ** tbl[4]=4 ** tbl[3]=3 ** tbl[2]=2 ** tbl[1]=1 ** tbl[0]=1
int look(int *tbl, int pos) { int n=*(tbl+pos); if(pos>0 && *(tbl+pos)){ n=--(*(tbl+pos)); ++(*(tbl+pos-1)); } return n; }
>>754 確認ありがとうございます。いまいち自信がもてなかったので。
(3)のアルゴリズムがとても長くなりそうで困っています。
(1)のアルゴリズムを利用して上から順番に求めていくと
とても効率が悪い気がします。
何かいいアルゴリズムはないでしょうか。
760 :
デフォルトの名無しさん :04/01/22 23:31
メッセージを右から左に流す電光掲示板風プログラムです これを左から右に流すようにするにはどうしたらいいんですか? #include <time.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { int i,j,cnt=0; char name[]="message"; int nagasa=strlen(name); for(;;){ putchar('\r'); for(i=0;i<nagasa;i++){ if(cnt+i<nagasa) putchar(name[cnt+i]); else putchar(name[cnt+i-nagasa]); } for(j=0;j<100000000;j++){ } if(cnt<nagasa-1) cnt++; else cnt=0; } return(0); }
>>760 #if 1
if(cnt)
cnt--;
else cnt=nagasa-1;
#else
if(cnt<nagasa-1)
cnt++;
else cnt=0;
#endif
>>754 ,756-757
ありがとうございました。
すべて自己解決することができました。
どうも感謝です。
>>719 このまま、コンパイルしたんじゃいかんぜ(そんなことはしてないと思うけれど)
元のソースから考えるとMFCなり使ってるみたいだからそれに併せて作れば動くはずだけど。
Linux上でXWindow使って、描画させてみたが根本的な計算部分はあっているようだ。
(ちゃんと立方体が描画される)
あと、
pDC->LineTo(UD, VD); pDC->LineTo(UE, VE); /* →Aの順で*/
の部分は、
pDC->LineTo(UD, VD); pDC->LineTo(UE, VA); /* →Aの順で*/
の間違いだった。間違いが多いな。すまね。
いろいろ試行錯誤でいじくってたら解決しました。 簡単な間違いでした(・・;) どうもお世話になりました! カンシャです。。。。
765 :
デフォルトの名無しさん :04/01/23 11:12
たぶんこのスレの方々ならすげー簡単に解けるCプログラミングの問題なんですけどうpっていいですか? txtファイルうpるんでお願いしたいんですけど・・・
してみれば。そんな長いのなら 答えが返ってくるかわからんが。
2問あります。 マジでプログラミングの基礎の基礎って問題だと思います。 ハッキリいってクソ簡単だと思います。 俺なんてこのスレの質問と答えをざっと見てもどれもわからんし。 ってわけで問題ファイル作ってうpりますんで暇な方は是非やっていただきたい。。。
ネタなら帰ってね。
(1)クラスも、他の変数型と同様に配列としてオブジェクトを生成できる。 例えば下記のstringクラスの要素数10のオブジェクト配列はstring ob[10]; のように宣言する。 そして、配列の5番目のオブジェクトの関数はob[5].setword("hello"); のように 呼び出すことが出来る。 main関数において、このstringクラス型の要素数10のオブジェクト配列を生成し、 キーボードから入力された単語を一つずつ各オブジェクトに setword関数を使ってセットするプログラムを作成しなさい。 また、各オブジェクトのshow関数を呼び出してデータを確認する処理を main関数に書き加えなさい。stringクラスの関数の内部処理は各自で作成すること。 class string { char w[255]; public: void setword(char *str); // w に文字列をコピーする。 void show(); // 格納している文字列を表示する。 }; (2)double型の値を受け取り、小数点以下を四捨五入する関数myrintを作成しなさい。 myrintへの値の受け渡しは参照渡しで行い、main関数内で生成された要素の値が 直接変更されるようにすること。main関数の中で、myrintによる処理の結果が確認できるように 実行の前後で値を表示するようにしなさい。 なお、myrintの内部処理はmath.hライブラリの関数を使用しても構わない。
(3)次のプログラムは加算の2項演算子をオーバーロードして、 オブジェクト同士の加算ができるように拡張する例題である。 これを入力し、実行結果を確認しなさい。 そして、加算の例を参考にオブジェクト同士の減算と乗算を演算子のオーバーロードで実現しなさい。 #include <iostream.h> class opertest { int x,y; public : opertest(int i=0,int j=0){x=i;y=j;} void get_xy(int &i,int &j){i=x;j=y;} // 以下が演算子のオーバーロードの定義 opertest operator+(opertest ob); }; // opertest クラスに対して加算演算子をオーバーロード opertest opertest::operator+(opertest ob){ opertest temp; temp.x = x + ob.x; temp.y = y + ob.y; return temp; } main() { opertest ob1(5,5), ob2(12,7), ob3; int x,y; ob3 = ob1 + ob2; ob3.get_xy(x,y); cout << "ob1 + ob2 = (" << x << "," << y << ")\n"; return 0; } お願いします。
#include<sdio.h> int main(void) { printf(""); return 0; } ""に入る文字を導き出し、理由を述べよ。 お願いします。
・・・・・。
部分的なものなのですが、 printf("%d>%d",rand()%200+1,rand()????); ^^^^^^^^^^ このようなとき、"一番目のrand > 二番目のrand"にするためには 波線の部分をどのようにすればいいのでしょうか?
774 :
733です☆ありがとうございます :04/01/23 20:22
736さん、738さん有難うございました☆ うまくできるようになりました♪ しかしですが2文字表示することができません… EIを表示する場合したのreturnのあとをどのように変えたら よろしでしょうか?? else if(**str1 == 'E' && *((*str1)+1)== 'N' && *((*str1)+2)== 'D' && *((*str1)+3)== 'I' && *((*str1)+4)== 'F'){ /* いま見ている文字が'ENDIF'だったら */ strcpy(str2,"ENDIF"); (*str1) += 5; return�'E'&&'I';�/*�EIを返す�*/ }
>>773 printf("%d>%d",rand()%200+1,rand()%200-199);
>>775 あ、ゴメンなさい。言い忘れました。
二番目のrandは1以上でお願いします。
rand()%200+1 の段階で、1から200の数値がランダムに得られる。 ここで、上の式の結果が1だった場合、1以下の整数の最大値は0のため、 不可能。
1以下じゃなくて、1未満だね。
>>773 ・1以上200以下の数を2つ選ぶ。このとき、二つの数は異なるように選ぶ。
・2つの数を大きい順に並べる。
ってふうに解釈した。
int a, b;
a = rand() % 200 + 1;
b = rand() % 199 + 1;
if (b >= a) {
b++;
}
/* ここまでで、aとbに1以上200以下の数が入り、かつ a != bである */
/* 以下は大きい順で出力する例、目的によっては、a,bを大きい順になるようにスワップさせる方法がよいかも */
if (a > b) {
printf("%d > %d\n", a, b);
} else {
printf("%d > %d\n", b, a);
}
あ、そうか・・・ 「一番目のrandが1の時は、2番目のrandを1にする」 にすれば出来ますか?
a = rand() % 200 + 1; b = rand() % (200-a) + 1;
間違えた b = rand() % (200-a) + a;
間違えた a,b 逆だ
>>779 ,781,782
なるほど。原理は分かりました。
…が、部分的に付け足すことができない・・・_| ̄|○
ちょっと考えます。
混乱してきたので全部貼らさせていただきます。(少し前からこのスレにいる人は見覚えあるかもしれませんが) 「A+B= C-D= 」というのを表示させるものなのですが、 A+Bの時はどちらが大きくても構わないのですが、 C-Dのときは、C>Dでないと解がマイナスになってしまうので困っています。 #include<stdlib.h> #include<conio.h> #include<stdio.h> #include<time.h> int main() { int i = 0; char filename[64]; printf ("ファイル名="); gets(filename); FILE *fp; srand((unsigned int)time(NULL)); if((fp = fopen(filename,"w")) != NULL) { while(i++ < 200) fprintf(fp,"%d + %d = \t%d − %d = \n", rand()%200+1,rand()%200+1, rand()%200+1,rand()%200+1); fclose(fp); } else { printf("!file %s cannot open!\n",filename); } return 0; }
>>785 ん、俺の書いたやつだな。確かあのときは、ランダムに出題するというやつだったと思ったが。
これなら、交換すればいいような気もする。
int a,b,tを追加。
a = rand()%200+1;
b = rand()%200+1;
if (a<b) { t = a; a = b; b = t; }
787 :
デフォルトの名無しさん :04/01/23 22:28
C言語の実行時エラーで"フレームスタックオーバーフロー"って出てくるんで すけど、まったく意味が解りません。どなたか教えてください。
while(i++ < 200) fprintf(fp,"%d + %d = \t%d − %d = \n", rand()%200+1,rand()%200+1, rand()%200+1,rand()%200+1); ↓ while (i++ < 200) { int a = rand() % 200 + 1; int b = rand() % 200 + 1; int c = rand() % 200 + 1; int d = rand() % 200 + 1; int t; if (c < d) { t = c; c = d; d = t; } printf("%d + %d = %d - %d = \n", a, b, c, d); } こういう書き換えができないと、人に聞いても、答えるヤツが大変だろう。 精進してくれ。
>>787 プログラムを実行するときって、メモリを使う。
規格に書いてあるわけじゃないが、だいたい、次のような区分けになってる。
・コード領域(命令が書いてある)
・グローバル変数領域(関数外にある変数やstatic変数)
・ヒープ(malloc()とかで使うやつ)
・スタック領域(関数内でstaticのつかない変数や、関数呼び出し時に使われる)
んで、スタックを使いすぎると「フレームスタックオーバーフロー」って出る。
考えられる原因は、
・関数内でstaticじゃないでっかい配列を作った
・関数呼び出しを深くしすぎた
って感じかな。
まあ、がんばってくれ。
791 :
デフォルトの名無しさん :04/01/23 22:49
rar形式で圧縮するコードを教えてください。 int rar(){ //ここに圧縮のアルゴリズムを記述 }
>>786 その節はお世話になりました。今回は、200以下の足し算と引き算のプログラムを組んでみることにしました。
・・・が、まだまだまだ技量が足りなかったです。_| ̄|○
>>789 教えてくださったやり方でなんとか完成しました。これからもっと勉強します。
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
int main() {
int i = 0;
char filename[64];
printf ("ファイル名=");
gets(filename);
FILE *fp;
srand((unsigned int)time(NULL));
if((fp = fopen(filename,"w")) != NULL){
while (i++ < 200) {
int a = rand() % 200 + 1;
int b = rand() % 200 + 1;
int c = rand() % 200 + 1;
int d = rand() % 200 + 1;
int t;
if (c < d){t = c;c = d;d = t; }/*この置き換えと同じようなN88のプログラムがセンターの過去問に載ってました。*/
fprintf(fp,"%d + %d =\t%d − %d = \n",a,b,c,d); }
} else {
printf("!file %s cannot open!\n",filename);
}
return 0;
}
>>792 つらいこともあるかもしれないけど
りゆうもなくくるしいことがあるわけじゃない
はがゆいおもいをすることもあるけど
かならずみらいはてにとどくよ
えをえがいてごらん
れっとうかんなんてふっとんでいくよ
かんちがいしないでくださいね。わたしはただ えんこーでぃんぐしたかっただけなんですから。 りゆうもなくこのスレにきたわけじゃないんです。 まさか、そんなふうにうけとられるとは。 つらいものですね。
正直、体で覚えなさいを連発するやつは 何もカキコしなくて良いと思う。 煽るつもりはないけど。 苦しんでる初心者には何の意味も無い言葉だと思た。
どこをたてよみ
798 :
デフォルトの名無しさん :04/01/24 01:26
配列を100万個以上作り出して実行すると 不正な処理を行ったみたいなことを言われ うまく実行できないのですが原因は なにが考えられますか? 教えてください。
int
>>798 ソースと環境書いといて。俺はもう寝るが。
801 :
デフォルトの名無しさん :04/01/24 03:00
>>801 関数の引き数とグローバル変数が同じ名前になっている。
>>798 多分メモリのパンクよん。自動変数だとなおさら起きやすい。
スタック領域が狭いから。staticやmalloc()でヒープ領域に
確保したとしても、百マンコも配列作ったらパンクしがち。
804 :
デフォルトの名無しさん :04/01/24 03:28
>798 そのときはたまたま100万個の連続したメモリを確保できなかっただけではないのかな? 100万個っていうと、char型で1MB int型で4MB。 mallocを使ってどれくらい連続したメモリーがとれるか試してみては?
>>802 おっしゃるとおりでした。これいけないんですね・・・
ありがとうございました。
いけないというか、numberはグローバルだから引数で持つ必要がないってことか・・・・ いずれにせよありがとうございました。コンパイルはできるようになりました。 実行は・・・頑張ります。
>>774 getToken() の型が int だからね。
予めトークンの種類を示す char 配列を作っておいて、
その添字を返すようにしたら?
>>808 んー。本読めば分かるんだが、C++はやりたくないので、パス。
クラスの設計&関数のオーバーロードはC++キモの部分なんで、
興味のある人は必ず居ると思うが・・・。
>>798 ソースをいじらず、回避するにはコンパイラのオプションでスタックサイズをでっかくするってのもアリ。
ちなみに、
>>804 氏の話は
int main() {int table[100万]; /* ... */ }
ってやっちゃダメで、
int main() {int *table = malloc(sizeof(int) * 100万); /* ... */ }
しましょってことね。
>myrintへの値の受け渡しは参照渡しで行い、main関数内で生成された要素の値が >直接変更されるようにすること。 void myrint(double& inNum) { inNum = (int)((inNum)+0.5); } 84行目: myrint(num); 85行目: cout << "四捨五入の結果:" << num << endl; に訂正。
>>810-811 とりあえず、Cの知識(math.h)で。
四捨五入ってば、こんな感じだとおもう。
double x = なにか;
if (x >= 0.0) {
x = floor(x + 0.5);
} else {
x = ceil(x - 0.5);
}
C++向けに直しといて(^^;;
すまぬ。−の処理が抜けてたか。 inNum > 0 ? inNum = (int)((inNum)+0.5) : inNum = (int)((inNum)-0.5);
816 :
デフォルトの名無しさん :04/01/24 22:37
scanf() の使い方なら他で聞け
scanfはアドレスじゃなきゃダメなんですね(?) 失礼致しました。
819 :
デフォルトの名無しさん :04/01/24 22:57
10個のint型変数 a[0] , a[1] , … , a[9] があるときに a[0]から順にチェックしていって、初めて値が0でないa[k]を返す関数 ってどうすればいいですか? また全部0なら0を返すことにします。
if(a[0]) return a[0]; if(a[1]) return a[1]; :
int f(int a[]){ int i; for(i=0;i<10;i++) if(a[i])break; if(i==10) return 0; else return a[i]; }
>>821 ダメだろそれ(w
>else return a[i];
824 :
長いですが・・・ :04/01/24 23:14
tiny ls プログラム 次のプログラムをコンパイルして % ./tinyls /tmp のようにコマンド名の後ろにディレクトリのパスを与えて実行すると, そのディレクト リに存在するファイル一覧を表示できます。 #include <sys/types.h> #include <dirent.h> #include <stdio.h> int main(int argc, char *argv[]) { DIR *dir; struct dirent *entry; if ((dir = opendir(argv[1])) == NULL) { perror(""); exit(-1); } while ((entry = readdir(dir)) != NULL) { printf("%s ", entry->d_name); } putchar('\n'); closedir(dir); return 0; } 問 ファイル名をソート(辞書順に並べ替え)して表示できるようにしなさい。
% ./tinyls /tmp | sort
関係ないけど普通exit(-1)じゃなくてexit(1)だよな。
前スレあたりでも話題になってたが、気にするならEXIT_FAILUREを使っとけ。
>>826 普通は EXIT_SUCCESS と EXIT_FAILURE を使うかな
>>821 プログラムは、短じかけりゃいいとは言わんけど、
int f(int a[]){
int i;
for(i=0;i<10;i++)
if(a[i]) return a[i];
return 0;
}
の方がわかりやすくないか ?
>>826 普通なんて、環境によっていくらでも変わると思うけど。
831 :
デフォルトの名無しさん :04/01/24 23:24
Cでソートするのが課題だとは思うが…
>>831 >問 ファイル名をソート(辞書順に並べ替え)して表示できるようにしなさい。
>>826 難しい。
ツールにもよるが、正常終了時に処理系へ意味を返す場合もあるからな・・
『プログラミング作法』って本には、異常終了を表すときにはexit(2)ってしてた。
コメントつけてこんなふうに書いてた。
exit(2); /* 2は異常終了を表す標準的な値 */
>>832 まあ、そんなこと言い出すと環境によっては
% ls
だけでよかったりするから、少なくとも俺なら
>>825 はバッテンつけるな。
自分にお前バカというのも珍しいかと。
多重人格者
>>824 んー。ほとんど行のソートと同様なんだが・・・
戦略が幾とおりかあって、手が出しづらい。
opendir();
while (ディレクトリの終わりまで) {
行登録;
}
closedir();
ソート;
出力;
戦略っていうのは、メモリ確保に関してなんだが。
固定長バッファをグローバル変数で持っとくのが、わかりやすいが・・・ちょっとね・・・。
動的なメモリ管理&グローバル変数無しってのがいいっていう意見も多いしねぇ・・・。
#include <dirent.h> struct dirent **namelist; int n,i; n = scandir(".", &namelist, 0, alphasort); if (n < 0) perror("scandir"); else { for(i=0; i<n; ++i) { printf("%s\n", namelist[i]->d_name); free(namelist[i]); } free(namelist); } }
>>818 なかなか良い質問だと思うよ
今のそのレベルなら丸おぼえもいいけど。
意味不明だと思うけど一応説明すると。
DOSの標準入力は、裏のほうで頭の良いえらい人が書いた
別のプログラムがごちゃごちゃやってるわけです。
そこからデータを直接変数に入れて持ってきたり出来ないので。
アドレスで渡す訳です。
アドレス、ポインタの理解がもっと進めば何となく意味がわかるかも
>>841 ほほえましいな(w
scanf()関数が一度に1つの値しか取れなかたっらショボイので
複数の値を得られるようにアドレス渡し、だろ?
問題 このスレのレス番号を取得して文章の内容から 質問者、回答者、煽りにソートした上で それぞれのバカ度、スキル、スキルを *の表示数で表せ。 おながいします。
>(・3・)アルェー 引き続きC++房のぼるじょあですYO! >わからない宿題を片づけますYO!
んー。分かりやすい煽りだからいーんだけれどさ。 一時期居た、ただのイチャモンつけが居なくなったみたいだから。 あと、ぼるじょあ次のスレではやめれ。
まだ、はやいんじゃねぇ?
>>843 [煽り]
-----+------------------------------------------------------------------------------
>>843 | バカ度: ***********************************************************************...
| スキル:
| スキル:
-----+------------------------------------------------------------------------------
... (以下省略) ...
849 :
デフォルトの名無しさん :04/01/25 01:09
>>803 ,804,809
ありがとうございました。やってみます。
start = clock(); QSort(num, 0,MAX-1); finish = clock(); こうするとQSortを認識しないみたいなんですが 理由が分かる方いますか?ちなみにQSortは自分が作った関数です。 ちなみに結果は秒数で表示させようとしてるんですが、 ほとんど0.0000秒になってしまいます。
clockの帰り値が1刻みで増えるとは,どこにも書いてないだろ?
>>850 Qsortが早くおわりすぎてるだけだろう。
>>852 いえそれはないです。てか今気づいたんですがQSortの関数内部で
再起処理してるからですかね?ちょっと混乱してきました。
854 :
デフォルトの名無しさん :04/01/25 03:05
>853 どれくらいのサイズでやってるかわからんが、現代の計算機でソートするとあっというまだぞ? 実行時間が0とでてくるのもしばしば。 start finishは clock_t start finish; って宣言せねばいかんぞよ? 計算時間の表示は (double)(finish-start)/CLOCKS_PER_SEC; とすべし。
>>853 俺がSSEで組んだテスト関数は、ループで同じ処理を
"10000000"繰り返すまで、処理時間0秒だったけど?
>>854 >どれくらいのサイズでやってるかわからんが、現代の計算機でソ
>ートするとあっというまだぞ?
MAXは乱数10000と20000で試してます。
他には下記のように似たような関数をつくって試してみました。
start = clock();
kaiten(10000);
finish = clock();
結果はちゃんとでたのでサイズとstart,finishの宣言場所は問題な
いはずです。やはり再起処理が問題なのかな・・
>start finishは
>clock_t start finish;
>って宣言せねばいかんぞよ?
>計算時間の表示は
>(double)(finish-start)/CLOCKS_PER_SEC;
>とすべし。
了解しています。
>>855 今回3種類のソート関数をつくって秒数を計れって宿題で、
他のバブルソート(0.7)、選択ソート(0.3)はちゃんと結果がでてます。
クイックソートが他より早いとしてもclock_tは0.00....まで計算でき
るみたいなのでそれはないとおもうのですが・・
>>856 単に早く終わっとるだけと思うが。
start = clock();
for (i = 0; i < 1000; i++) {
QSort(num, 0,MAX-1);
}
finish = clock();
ちなみに、オーダーの違いはかなり、でかいぜ。O(n*n)とO(n*log(n))は、すごく速度差がでるぜ。
>>856 >clock_tは0.00....まで計算できるみたいなのでそれはないとおもうのですが・・
表現ができるだけでclock()が非常に高い精度で計測できる保証はないでしょ。
>>857 >>858 そのようです・・。timeGetTime()だと計測できました。
ありがとうございました!
んー。
>>858 が言うことを検証するには、
既に動いているバブルソートで、少しずつデータ数を増やすとよい。
ランダムデータではなくって、逆順データを用意するといいかな。
たぶん、計測時間が増えていくと思うが、飛び飛びの値になるでしょ・・・。
それが、clock()の精度ね。
あ、解決したのね、おつかれさん。
862 :
問題文の方が長いですが… :04/01/25 07:49
これの回答をお願いします 最初通帳には10万円の預金があり学生時代の4年間毎月1万円ずつ預金することとした 四年後の元利合計を求めよただし金利は最初の2年間は年率3%、3年目、4年目は年率4%とする ?を埋めて完成させなさい ヒント for文を使う。月単位で計算する 次月の全預金額=(当月の全預金額+当月の受け入れ)*(1+月率)…allyokin=(allyokin+yokin)*(1+r); #include <stdio.h> main() { float allyokin=?,yokin=1,r=3; int n; for(n=0;n<48;n++) { ?ここに式を入力 if(){?プリント文を入力} if(){?プリント文を入力} if(){?プリント文を入力} if(){?プリント文を入力} } }
>>862 ↓みたいに1ヶ月ごとの全預金額を全部表示するプログラム?
1年3ヶ月目 **円
1年4ヶ月目 **円
・
・
・
私には月率ってどうやって求めるかがわかりません.
r=3?
865 :
デフォルトの名無しさん :04/01/25 08:39
すみません、ここ宿題の範囲じゃなかったです ご協力ありがとうございました
866 :
デフォルトの名無しさん :04/01/25 17:23
んー。配布ファイル中に example.cってのと、 libjpeg.docってのががあるんで、それを読め。
>>866 libjpeg.doc 嫁。
最悪でも djpeg.c と cjpeg.c と同じ事ができれば何とかなるよ。
最悪 system() で djpeg と cjpeg 読んでもいいし。
,,,, ∠二`-=-'"~<.,,,,,_ ,,=''"~ = ,/ \ ___,,,,__ _____ lイ ⊂●⊃ ⊂●⊃ 'l, `ヽ=, \/~ ,/ / `iヽ 愛知万博にみんな来てね ,,,.-`l <,_ | ,, .,,人, ,_ ,_ l, ∠,,_ \ レ/ ー'"'" ` `''' '- N / ,l, ,/ | | ・ ・ V / | | ,イ -<>- て,,/ し( (_,,. ┌'"| lヾ l, i / レ| ,, / \_,i-,_,-i_,,/!' \i,_ ,, ,,, , ,/" (/ \) (二二!`ヽ-'''"--'"!二二)
ところで、「自分で調べたけれど、分かりません」って人へ質問。 (ホントに調べたとして)どれくらい時間をかけて自力でできなかったら、質問しますか?
>>867 >>868 さん、レスどうもありがとうございます!
>example.c libjpeg.doc djpeg.c cjpeg.c
を、頑張って読んでみます!
明日は休みなので一晩かければ、読める・・かな?
自分なりに、example.cを見ながらいろいろやってみたのですが
全然うまくいかなったんです。
どこに書けばいいのかが、まったくわからないのです。
僕は、
自分のソースにビットマップを読み書きする関数があるのですが、
そこに、write_JPEG_file ()みたいに書いてゆけばいいものだと思っていたのですが、
全然違うでしょうか?>< う〜ん、本気でわかりません。
>>870 うぅ、僕のことですよね・・・><
僕は4晩ほど考えてみました。4日間なにも進まない・・・あぁ。。
>>871 だからさ、木を見ないで森を見てみたら?
一番簡単な方法だよ。
詳細はそれから追いかけたほうがいいと思うけど。
djpeg は jpeg なんかから bmp ファイルを作るんだよ?
一時ファイルとして bmp に落とせばあとは加工できるんでしょ?
あとは cjpeg を使って加工した bmp を入力ファイルとして、 jpeg に戻せばいいような気もするけど、
なんか食い違ってる?
ぼるしょあさんとHしたい なんて
>>866 そのプログラムの置き方だと、手間がかかりすぎて見る気が起きない。
はぁ、しかし本当に人間って死んだら無になるのかな・・・ まじで怖い。
いや、mallocした領域はfreeしてもOSに戻らない...
戻る実装もあるかもしれない
まじで怖い。
プログラムを終了しても戻らないOSがあるかもしれない。
学校の課題で以下のプログラムを提出したんですが、全部間違ってる、と言われてしまいました。 kijun02は14行目、kijun03は16,18行目、kijun04は15,25行目が間違っているのだろうとは思うんですが、 どう修正すればいいのか皆目見当が付きません。 ぜひご教授ください。 お願いします、単位がやばいんです。
>>882 内容はプログラムの中に書いてあるので書かなかったんですが、
kijun01がラプラス基準、kijun02がフルビッツ基準、kijun03がマキシミン基準、kijun04がミニマックス基準を求める
プログラムです。入力されている数値は4×4で16個です。
正直自信ないが3番目のやつは float kijun(int i) { int j ; float wmin, wmax ; wmin = w[i][0] ; for( j=1 ; j<4 ; j+=1 ) if( wmin > w[i][j])//逆 wmin = w[i][j] ; return wmin; //戻り値がない。 } main for( i=1 ; i<4 ; i+=1 ){ e = kijun(i) ; if( emax < e ) { imax = i ; emax = e ; } } かっこが足りてない。 ではないだろうか。
サーバが見つかりません
2から0xffffffffまでの素数の数を求めるプログラムをお願いします。
9876543210と数字があって 987億7654万3210というように表示させたいのですが これをやる場合の処理を教えてください。
ここは宿題スレ
宿題:(口頭でした) 「32ビット整数の範囲で素数が何個あるかを数えるプログラムを来週までに提出しなさい。 何個あるかと、プログラムを印刷して持ってきなさい」 ・・・というわけで、お願いします。
>>891 思案中・・・
エラトステネスのふるいをやるとして必要なメモリは単純に2の32乗ビット。
2以外の偶数は除外できるから、2の31乗ビット=2の28乗バイト
っていったら、256Mバイトか・・・まあ、最近のマシーンならOKか・・・。
メモリを使わん方法もあるだろうが・・・時間がかかりそうだし・・・。
んー。難しそうだねぇ。がんばれー。
んー・・・他の方法を考える前に「時間がかかりそう」って考えたのよ。
>>894 氏ならどういうアルゴリズムを採用します?
>>893 直感的に考えると基本的に一緒なんだけど、テーブルの持ち方が違うかなぁと。
n が素数であるかどうかは√n より小さい数までの素数だけのテーブルが
あればいいんじゃないかなぁ。
なるほど。16ビットの範囲なら素数もそれほど多くないし(多分1万以下)・・・ テーブル持った後なら素数判定のとき、多くの数はテーブルの頭の方の数で弾かれるだろうし・・・ ふむむ・・・。そっか結構早そうですね。
>>896 ちょっと試してみたYO!
とりあえず、テーブルサイズ固定してやってみたよ。
19ビットで10秒、20ビットで20秒かかりました。
32ビットだと22時間かかりそうだYO!
>>899 やっぱそうでしたか。もつかれさま〜。
かつての素数スレの猛者の方のアドバイスがほしいですね。
今、妄想の中で書くとこんなかんじ。 range = 0xffffffff; count=1; // 2を素数とみなす for(i=3 to range){ if(i % 2 == 0) continue; // sqrtを実行しないため for(j=3 to sqrt(i) step 2){ if(i % j == 0) continue; // 割り切れた=素数でない } count++; // √n以下の整数で割り切れなかった=素数 } result(count);
整数を入力してその値を3桁ごとにコンマで区切って出力するプログラムを書け 例えば4576の時4,576と出力されればよい 助けてクダサイ C言語です
test
>>889 #include <stdio.h>
#include <string.h>
int main(void)
{
int i,l;
const char num[]="98776543210";
const char tani[4][3]={"万","億","兆","京"};
for(i=0,l=strlen(num);i<l;i++)
{
if(i&&(l-i)%4==0)printf("%s",tani[(l-i)/4]);
printf("%c",num[i]);
}
puts("");
return 0;
}
>>902 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
int i,l;
char num[BUFSIZ];
puts("自然を入力してください");
if(fgets(num,sizeof(num),stdin)==NULL){puts("入力エラー");exit(1);}
l=strlen(num)-1;
if(l==0){puts("何か入力しろ");exit(1);}
for(i=0;i<l;i++)if(!isdigit(num[i])){puts("自然数と言ったろ");exit(1);}
if(num[0]=='0'&&l>=2){puts("いきなり0があるぜ");exit(1);}
for(i=0;i<l;i++)
{
if(i&&(l-i)%3==0)printf(",");
printf("%c",num[i]);
}
puts("");
return 0;
}
いろんなやり方があるなあ、俺の書いたの恥ずかしいから ださんとこ、、、 初心者が同じ題材にチャレンジして、恥ずかしいコードを はりまくって 採点したり指導するすれほしい。
ユーザーに配列[a]と配列[b]を入力させ、 配列[a]÷[b]を配列[c]に入力するプログラムを書いているのですが、エラーが出てプログラムが強制終了してしまいます。 何が悪いのか皆目検討つきません。 どうかご教授いただけますでしょうか? 以下、汚いですがソースです。
#include <stdio.h> #include <stdlib.h> main () { char disk[100000] , file[100000] , ref[100000]; int filesize[100] , refsize[100] , result[100]; int i ;
for (i=0; i<=99; i++) { printf("%d 番目のファイルサイズを入力してください。(単位:[MB])\n",i+1); printf("入力を終了するには、999999を入力してください。\n"); gets(file); filesize[i]=atoi(file); if (filesize[i]==999999) { break; } } filesize[i]=0;
for (i=0; i<=99; i++) { printf("%d 番目のファイルの被参照量を入力してください。(単位:[MB])\n",i+1); printf("入力を終了するには、999999を入力してください。\n"); gets(ref); refsize[i]=atoi(ref); if (refsize[i]==999999) { break; } } refsize[i]=0; for (i=0; i<=99; i++) { result[i] = refsize[i] / filesize[i] ; if (refsize[i]==0) { break; } } for (i=0; i<=10; i++) { printf("%d 番目は、%dです。\n" ,i+1,result[i]); } }
ちなみにエラーとは、.exeを実行すると、計算部分でプログラムの強制終了のダイアログで出てしまうと言うものです。 Windowsの窓でダイアログは現れます。
>>907 初期化をしてないので不定値を
不定値でわってるからそうなる。
for (i=0; i<=99; i++)
{
printf("%d 番目のファイルサイズを入力してください。(単位:[MB])\n",i+1);
printf("入力を終了するには、999999を入力してください。\n");
gets(file);
filesize[i]=atoi(file);
if (filesize[i]==999999)
{
break;
}
count++;
}
countでも入れて、次からのfor文の条件をfor (i=0; i<count; i++)
に直したらどうか。あとchar disk[100000]とこんなにとっても意味ないよ。
あと割る数が0のときの処理もしといたほうが いいよ。
>>912 早速のお返事ありがとうございます。
初期化というのは、配列自体の初期化のことですよね?
途中で書き出してみたのですが、初期値が0になっていたので、そのままにしていたのですが・・・。
試しに、1つ目のファイルサイズに50と100を、
2つめの被参照量に100と800を入れたのですが止まります。
結果として、100/50=2 , 800/100=8で、
配列[result]に[2,8]と格納させたいんですよね・・・。
考え方が根本的に間違っているのでしょうか?
1 / 0 = 0じゃないぞ。
すみません、解決いたしましたOTL 理由はわからないのですが、計算用配列の[a][b]の初期値を全部1にしたら、 問題なく終了できました。 あとは、格納配列の[c]を大きい順にソートするだけになりました。 自分でがんがってみて、またダメなら質問することにいたします。 スレ汚し、スミマセンでした。 精進いたします。
>>916 だから元のだと0で割ってるからだって。
>>917 なるほど・・・。ようやく理解しました(汗)
それから、配列[result]を大きい順にソートしたいのですが、構造体もポインタもわかっていません(汗)
ググってみたら、クイックソートやバブルソートを使用すれば良いというのは理解できましたが、
自分のソースの中で、どう使用すればよいかがわかりません・・・。
お教えいただけないでしょうか?
880 名前:デフォルトの名無しさん 投稿日:2004/01/26(月) 16:40
学校の課題で以下のプログラムを提出したんですが、全部間違ってる、と言われてしまいました。
kijun02は14行目、kijun03は16,18行目、kijun04は15,25行目が間違っているのだろうとは思うんですが、
どう修正すればいいのか皆目見当が付きません。
ぜひご教授ください。
お願いします、単位がやばいんです。
881 名前:880 投稿日:2004/01/26(月) 16:41
プログラムです。
ttp://up.isp.2ch.net/up/44167125a93e.zip スイマセン、上のに貼りわすれました。よろしくお願いします。
883 名前:880 投稿日:2004/01/26(月) 16:59
>>882 内容はプログラムの中に書いてあるので書かなかったんですが、
kijun01がラプラス基準、kijun02がフルビッツ基準、kijun03がマキシミン基準、kijun04がミニマックス基準を求める
プログラムです。入力されている数値は4×4で16個です。
886 名前:880 投稿日:2004/01/26(月) 18:14
ちなみに、先生が配ったプログラム(途中何箇所か空白にしてある)はこれです。
ttp://up.isp.2ch.net/up/0f3883bb03fd.zip お願いします。
今の時間帯は鯖が生きてますので。
見るのもじゃまくさいんだよな。
>>1 のところにまとめて書いた方が良かったんじゃない?
921 :
デフォルトの名無しさん :04/01/27 14:57
0でない正の実数rに対してlogx-r=0.0の根を求めるプログラムを作成せよ(底はe) Cです。おながいします(;´Д`)
923 :
デフォルトの名無しさん :04/01/27 17:04
8パズルをC言語でプログラム書いてください 283 123 164→ 804 705 765 にするプログラム。ほんと助けて
924 :
デフォルトの名無しさん :04/01/27 17:11
僕ぼるじょあ。こまってそうだね
925 :
デフォルトの名無しさん :04/01/27 17:16
期限は?
926 :
デフォルトの名無しさん :04/01/27 17:18
1から8までの数字が書いてある8つの正方形のこまが3×3の空間に下図左の ように置いてあります。0の所に駒を滑らせて入れる操作を繰り返して下図 右の終了状態を作りたい。これを解くプログラムをC言語で作成してください。 また、内容説明、考察も書いてください。 初期状態 終了状態 283 123 164 804 705 765 これが、できなくて困ってます。 助けてください。
927 :
デフォルトの名無しさん :04/01/27 17:19
期限は明日の昼間です。
928 :
デフォルトの名無しさん :04/01/27 17:27
時間がかかるYO
929 :
デフォルトの名無しさん :04/01/27 17:30
どのくらいかかりますか?
幅優先探索です。 再帰は使いません。
明日の昼間ごろ教えてしんぜよう
>>921 ありがとうございます。
見事に配列[result]がソートされました。
この配列[result]のソートされた順番に、配列[filesize]もソートさせたいのですが、それは可能なのでしょうか?
具体的に言うと、
配列[filesize]=[100,200,500]
配列[refsize]=[20000,70000,8000]
配列[result]=[200,350,16]
ソート後の配列[result]=[350,200,16]
ですよね?
ソート後の配列[result]の元の順番が[2番目,1番目,3番目]
なので、その通りに配列[filesize]も[200,100,500]
のように並べ替えたいんです。
なんか、1から組みなおさなければならない気が・・・。
出来が悪くてスミマセン(汗)
>>922 です
当方も期限は明日までなのです....
わかった方よろしくおねがいしまつ(;´Д`)
誰か教えてください…。
>880 「・アップされたファイルの賞味期限が切れました。」
しまったしまった島倉千代子。 思考じゃなくてゲームの方を作ってしまった。_ト ̄|○
941 :
デフォルトの名無しさん :04/01/27 20:03
Cなんですけど、 CSVファイルを読み込んで、データ項が数値かそうでないか判別する方法が分かりません。 商品1,1200,商品2,4200,商品3,1500 こんな構造してます。 数値のぶぶんだけとりだしたいんですけど。
>>941 あぁ・・・んーと、CSVのライブラリで行を読み、フィールドまで区切ってるなら、こんなんでどう?
/* 文字列は数字だけから構成される? */
int is_suuti(char *s)
{
while (*s)
if (!isdigit(*s++))
return 0;
return 1;
}
CSVライブラリは↓あたりでも使ってくれ。
ttp://cm.bell-labs.com/cm/cs/tpop/code.html それと、だれかぼるじょあ以外で次スレたのむ。
sscanfでも使えば。
>>943 sscanf()だと、空の項に対応できないんだよね。
#楽でいいんだけどなぁ。
945 :
デフォルトの名無しさん :04/01/27 23:21
C言語の問題です。 ある16進数のデータを反転させた値と、下位4ビットをオール1にした値、 上位4ビットをオール0にした値を16進数で表示する。(入力値は8桁固定) 実行結果例 16進数>ff000000(入力) 反転 = ffffff(システム表示) 下位4ビット「1」=ff00000f(システム表示) 上位4ビット「0」=f000000 よろしくお願いします。
946 :
デフォルトの名無しさん :04/01/27 23:31
>>945 #include <stdio.h>
int main()
{
unsigned long n;
printf("16進数>");
scanf("%lx",&n);
printf("反転=%lx\n",~n); /* もしくはn^0xFFFFFFFFU */
printf("下位4ビット「1」=%lx\n",n|0xFU);
printf("上位4ビット「0」=%lx\n",n&0xFFFFFFFU);
return 0;
}
ありがとうございます。 助かりました。
long intが32bitじゃなかったら~nとn^0xFFFFFFFFUの結果は変わるな。 後者が適切だけど、まあいいか。