1 :
デフォルトの名無しさん :
03/11/26 17:56 おいどんはC++房でおわす。
こんにちの技術は日進月歩、どんどん進むでごわす
わからない宿題はどんとこーい。
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2 】
3 :
デフォルトの名無しさん :03/11/26 18:30
3げと
4 :
デフォルトの名無しさん :03/11/26 18:32
4get
5 :
デフォルトの名無しさん :03/11/26 18:33
int main (void) { unsigned long a,b,c,d,ans,s,z; printf("面積がSの正方形の一辺の長さを求めます\n"); printf("そこのあなた!好きなSの値を入力しなさい\n"); scanf("%lu",&s); a=s/5; b=s/a; while(1){ c=(b+a)/2; d=s/c; if(abs(c-d)<0.002){ ans=abs(a-b); break;} a=(c+d)/2; b=s/a; if(abs(a-b)<0.002){ ans=abs(c-d); break;} for(z=1;z<100000;z++){z=z+3;z=z-3;} } printf("答えが出ました。一辺の長さは %lu です",ans); return(0); } というプログラムを作ってみたんだけどうまくうごいてくれない。 何がしたいのかというと sqrtを使わずに近似でもとめるというのを自前で作れ!というのが宿題なんだけど まずてきとうに好きなAの値をつくる そして 面積/AしてBをだす 絶対値(AーB)が0.00001以下ぐらいになったらまあ近似だろうということでそこでAの値を出力する もしならなかったら (A+B)/2をしてその値をA2とする そしてそのあたいからB2をだして、、、、、、以下繰り返し 要するに数列のようなもので A2とかでなく今回はABCDをつかってあらわしてみた。 じっさいに動かして見るとループしてまともに動いてくれない(泣
どなたか助けてくださいまし
7 :
デフォルトの名無しさん :03/11/26 18:39
>>5 unsigned longをdoubleにしてみたらどうだろう?
そしてabsはfabsに
やってみます
9 :
デフォルトの名無しさん :03/11/26 18:43
あと分かっていると思うけど、doubleならscanfの%luは%lfに
前 「[プログラム] c/c++宿題手伝います 15代目」でコメントいただきありがとうございました。
>>前987
おこられました。
>>988 だから楽しかったんですね。あぁ。。。。。
>>前992
どうもありがとうございました。 なんだかうまくいきました。
てか、ほめられました。のほほほほ。。 (ぺこぺこ
本当にありがとうございました。友達もこの掲示板でワタシの書き込み見て、
うまくいった人が多いようで。。。。あはは。
うーん、、できない。ループは止まったけど面積に120といれても一辺の 長さが2になってしまう
あ、わかりました。ありがとうございました。
>>13 せめて何が間違ってたか教えてくれないとやりきれないなぁ・・・
15 :
デフォルトの名無しさん :03/11/26 19:14
初心者で全くわからない状態なのですが、課題提出の危機に直面しています。 ここで聞いてもいいですか?
16 :
デフォルトの名無しさん :03/11/26 19:15
17 :
デフォルトの名無しさん :03/11/26 19:25
>>16 有難うございます!!!
検索したら大量に出てきたんですけど、なかなか条件が合致しなくて…。
キーボードから与えられた整数が素数かどうかを判定するプログラムを作れ。
小数などが与えられることは考えなくて良い。
負の整数や0が与えられた場合はエラーメッセージを表示する。
判定結果のメッセージを画面上へ出力する。
条件は以上です。
どうかどうかお願い致します。
18 :
デフォルトの名無しさん :03/11/26 19:31
>>17 #include <stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
if(n<=0){
fprintf(stderr,"ハァ? 真面目にやれYO!\n");
return 1;
}
if(n<=2){
printf("素数ではない。\n");
return 0;
}
for(i=3;i<n;i+=2){
if(!(n%i)){
printf("素数ではない。\n");
return 0;
}
}
printf("素数である。\n");
return 0;
}
えーと、、まちがってたところですね。まずDOUBLEに変えたのが正解でした。 それで無限ループはなくなったんですがあとプログラムミスが一ヶ所ありましてそこを修正すると きちんとした辺の長さが出ました。そこは割合します。 あと同じ大学内で2CH見てる奴が俺のコピっても先生に弾かれるから 移さないようにしてくれよ。
17はひなた兄さんの関係者か?
>>18 有難うございました!
本当に助かりました。
>>20 ???
違いますよ…?
>>18 申し訳ありません。
下の内容は、どういった作業をして素数かどうかを判定しているのでしょうか?
for(i=3;i<n;i+=2){
if(!(n%i)){
printf("素数ではない。\n");
return 0;
度々すいません 確認ですが、 int a = 55 ; char b = a ; char c = "文字に変換できたかな%d", b とすれば、 cの結果は 「文字に変換できたかな55」となりますでしょうか。 ちなみにこれはPC持ってない人が居るため宿題にはなっていません。 本買えば分かることでしょうか。もしそうでしたら、本を紹介いただけない でしょうか。コンピュータ関係の本って、ホントに高いですよね。
24 :
デフォルトの名無しさん :03/11/26 20:08
度々って・・・常連のネタ師?
>>23 なりません。
cは文字型なので文字列型じゃありません。
あと文字列(配列)は要素すべてを複製することができないのです。
==========================
char *s, *st;
(なんらかの方法で文字列ゲット)
st = s;
==========================
これで st が には s の複製はできません。
コンピューターの本という微妙なくくりなので言いがたいですが、どんなものも専門的になればそれなりに高くなると思います。
でも自分はそれ相応の値段が付いていると思うのでそんなに高いとは思いません。(薄いのに2千円とかは高いと思う)
Cをやりたいなら入門書が1200円というお手ごろの物がありますよ
最初はわからないでしょうが入門書=>初心者用といった具合に読むといいと思います
あまり値段とかクドクドといってもしょうがないので金の方は無視をして、内容がイイのを選びましょう。
また、ココを読んでみるといいと思います。
ttp://pc2.2ch.net/test/read.cgi/tech/1053091019/ 自分はグレー色の表紙のC入門書がお勧めだと思います。
それを読み終わったら次にまた少し詳しい本を読むといいと思います
何度も言いますが、初めてやって理解出来るとは思わないので勉強するためとかじゃなければ楽しんでください
>>26 ================
>これで stが には s の複製はできません。
訂正で「これで st に s の複製はできません」です
あと、自分はオーム社のC言語によるプログラミングという初級本を買いました。
今売ってるのが第3版だと書いてあったと思います(自分はその前)
宣伝じゃないですが、この本は解らない言葉とかの解説が下に書いてあったりして
入門書&初級書だと思います。
きっとこの本を読めば知る楽しさがわかるかなぁ?って思います。
何故この本をお勧めする人が少ないのかなと疑いたくなりますね^^;
ここがオーム社のHPなので時間があれば見てみてください
ttp://www.ohmsha.co.jp/ Cに限らず技術書をいってに扱うすばらしい会社だと思いますよ。
それでは長くなってすみませんでした
CとC++って全く別物なんでしょうか?
>>28 ((C)C++)という考え方がいいかと思います。
C++はCを含む、またはC++はCに毛が生えたものとよく言われますからね
30 :
デフォルトの名無しさん :03/11/26 20:17
>>24-27 なんと返事の早いことでしょう。。。 ありがとうございます。
>char c = "文字に変換できたかな%d", b;
は自分で考えたんですが、ダメですか。。。
整数型 は int、文字型は charとはようやく理解ができました。
が、文字列型というのがあるのですね。つまり文字と文字を
つなぐための型があるんですね。
あぁ。。。この先心配だなぁ。。。 とりあえずみなさんに教えていただいた
掲示板で c言語の本探してみます。どうも丁寧にありがとうございました。
32 :
デフォルトの名無しさん :03/11/26 20:20
>>31 > 文字列型というのがあるのですね。
Cにはありません。
C++にはライブラリとして実装したものがあるけど。
>>31 >あと文字列(配列)は要素すべてを複製することができないのです。
>==========================
文字列型は配列なので気にしないでいいよ。
□コレを変数を格納する箱だとするね
そしたら
□□□□□...
こんな感じに並んでるだけ
あんま難しくないでしょ?
34 :
デフォルトの名無しさん :03/11/26 20:22
前スレ
>>822 エラー E2303 returnporland.c 7: 型名が必要
エラー E2048 returnporland.c 8: 認識できないプリプロセッサ指令: 'defineSTACK_SIZE'
エラー E2451 returnporland.c 10: 未定義のシンボル STACK_SIZE
エラー E2303 returnporland.c 11: 型名が必要
エラー E2451 returnporland.c 23: 未定義のシンボル n(関数 init )
エラー E2147 returnporland.c 26: 引数宣言は 'ELEM' で始められない
エラー E2451 returnporland.c 28: 未定義のシンボル n(関数 push )
エラー E2451 returnporland.c 29: 未定義のシンボル stack(関数 push )
警告 W8057 returnporland.c 30: パラメータ 'x' は一度も使用されない(関数 push )
エラー E2141 returnporland.c 32: 宣言の構文エラー
一度コンパイルしてみたら、エラーが・・・・・・
>>33 紛らわしい言い方してごめんなさい。
>>32 みてハッと来た
「文字列型」というものはありません
>>34 (´_ゝ`)どんまい
で、コレを出してきてどうするの?
#include <stdio.h> #include <ctype.h> /* 関数sum_dgt2 */ int sum_dgt2(char *s) { int retval = 0; int d; for (;*s != '\0'; s++){ if (!isdigit(*s)){ return -1; } sscanf(s, "%1d", &d); retval += d; } return retval ; }
>>37 の続き
/* main関数による演算 */
long int main(void)
{
char s[200];
printf("整数を入力してください。\n");
scanf("%20s", s);
if(sum_dgt2(s) == -1){
printf("エラー:alphabetでは処理できません。数値を入力してください。\n");
}else{
printf("与えられた各桁の数の和は、%dです。\n", sum_dgt2(s) );
}
return 0;
前スレ
>>959 さん、
>>961 さん、
>>964 さんありがとうございます。
それでなのですが、
>>36 で、ポインタを使っているようなのですが、
もし、ポインタを使わなかったら、どんな風になるのですか?
*(int*)0 = 0;
前スレ
>>822 実行できるけど、何度もstack overflowとかになる・・・
なんでだろ・・・・・・
char s[200]; と scanf ("%20s", s); がとても矛盾してると言ってみていい? あと自分にはオーバーフローの理由はわからんですたい、ごめんですたい ちなみに何処でプログラムが停止してるかを printf ("ここで停止しちゃった"); とかで確認をしてみるといい。
43 :
デフォルトの名無しさん :03/11/26 22:19
初心者で全くわからない状態なのですが、課題提出の危機に直面しています。 ここで聞いてもいいですか?
なんじゃね?
45 :
デフォルトの名無しさん :03/11/26 22:27
1:構造体を使用せず、生年月日を表す(返す)プログラムを作れ。2:それを使用し、年齢計算をするプログラムを作れ。 構造体を使用すれば出来るんですが、使わないとわかりません。どうか、よろしくお願いします。
46 :
デフォルトの名無しさん :03/11/26 22:27
1:構造体を使用せず、生年月日を表す(返す)プログラムを作れ。2:それを使用し、年齢計算をするプログラムを作れ。 構造体を使用すれば出来るんですが、使わないとわかりません。どうか、よろしくお願いします。
ポインタを並べる方法と 一つの整数に入れる方法があるね つまり32ビットを複数に分割するって意味ね 0000000000000000/00000/00000/000000 年 無 月 日 のように分割するのがいいかな、と自分は思う
48 :
デフォルトの名無しさん :03/11/26 22:54
構造体を使用すれば、こんな感じだと思います #include <time.h> #include <stdio.h> void put_date(void) { time_tcurrent; struct tm *local; char wday_name[][3] = {"日","月","火","水","木","金","土"}; time(¤t);// 現在の時刻を取得 local = localtime(¤t);// 地方時の構造体に変換 printf("%4d年%02d月%02d日(%s)",local->tm_year + 1900// 年 ,local->tm_mon + 1// 月 ,local->tm_mday// 日 ,wday_name[local->tm_wday]// 曜日 ); } int main(void) { printf("生年月日は"); put_date(); printf("です。\n"); return (0); }
年 : xxxx0000 月 : 0000xx00 日 : 000000xx 数値をこんな感じに区切ってみるとか(゚∀゚)
分かり易さ重視。 barth = year*10000 + month*100 + day today = 同様に今日の日付 (例えば、今日の日付=20,031,126) としておく。んで、年齢は、 old = today/10000 - barth/10000 ちなみに、変数は全てunsigned long。
>>50 月日が考慮されてないよ。
あと、閏年の2月29日生まれとかどうするのかな。
けっこう難しいような気がするけど。
>>45 この問題の日本語がワカーンナーイ。誰の生年月日?というか何をしたいの?
問題の原文そのまま書いてくれるのが一番なんだが...
あ、、、
today_year = today/10000 barth_year = barth/10000 で、 old = today_year - barth_year - 1 + (today-today_year*10000)>(barth-barth_year*10000)?1:0 くどい・・・
生年月日を1つの整数で表すときは、long型。(int をつかって良いのは±3万くらいまで)
ぼーよーセンセの本でそんなネタがあった気がする・・・あれは解答集が本になってるはず。
>>37 >>39 sum_dgt2のfor文のあたりを
int i;
for (i = 0; s[i] != '\0'; i++) {
if (!isdigit(s[i])
...
とか
56 :
デフォルトの名無しさん :03/11/26 23:51
Cで乱数を使いたいデス。 たとえば、1、2、3、4、5ってのをランダムで使う場合は どうしたらいいんです可。
最近(というかココ数日)ランダムについての質問が多いな なんで?
猫でも分かるプログラミング へのリンクでも>1に付けておけばよかったか
あ、それは失礼。 レス戻ってみてみます。
>>59 レスではなくぐぐってミソ
もし学校の宿題ならランダム数を発生させる関数を教えてもらって、教えてくれなかったらクソ教官
ヘッダファイル名を教えてくれるのは最高の先生では?
>>58 C/C++は猫がいいね
教科書についているに1票。 rand()または乱数で索引を調べてください。 初心者には、あとは「Cによる最新アルゴリズム辞典」がお勧め。 最新ではないかもしれないけどね。 これにはいろんなアルゴリズムがついてる。多分、宿題レベルなら大丈夫。 ガンガリー
>>61 その本って数学の知識がかなり必要じゃない?
最低でも高校出ではないと
まあ、マニュアル読めだとか、本読めだとか・・・も正しい解答だと思うケドさ。
ここのスレは、他人のコードが読めるのがよいところだと思ってみたり。
>>56 #include <stdlib.h>
/* .. */
int n = 5;
int r = (rand() + 1.0) / RAND_MAX * n + 1;
くわしくは、rand()とかsrand()をマニュアルでしらべてね。
・・・やっぱし、俺も書くのであった。
>>63 コードを書くのであって解説する義務は無い
#include <time.h>
#include <stdlib.h>
srand ((unsigned)time(NULL)); // ランダム関数初期化
rand () % x; 0~xまでの乱数を発生
以上
>>63 int r = (rand() + 1.0) / RAND_MAX * n + 1;
こういうのを見ると
int r = (((long)rand() + 1) * n) / RAND_MAX + 1;
こうしたくなる。
浮動小数点は普段相手にしている非力なマイコンにはつらいので。
(int=16ビット、long=32ビットと仮定しています)
>63 >65 rand()がRAND_MAX及びRAND_MAX-1を返した時rが6となるのだが
>>66 サンキュ
int r = (int) (rand() / (RAND_MAX + 1.0) * n) + 1;
ありがとうございます。ちょっとやってみます。 樹木の角度を乱数で分枝してボックス・カウント法により フラクタル次元を求めるってのを現在やってます。 卒論に必要な準備なんです(泣)
ランダム関数がわからないのにその他の事は俺がわからないぞぉ!
>>69 卒論で使うなら、rand()よりもっとまともな乱数について研究しておいた方がいいぞ。
>>69 卒論っすか・・・このレベルを自力でできんよーではでは出羽の海。
既出だが『C言語による最新アルゴリズム辞典』は読どったほーがいい。
標準ライブラリのrand()は精度がめっちゃわるいんで、M系列乱数だとかMTあたりを使いましょうね。
卒論て宿題なんか? 理系でこの時期でこのレベルなのか?
そうですか、みなさんいろいろありがとうございます。 とりあえず最近教授がいなくて素人の私にはどうしようもないのでここに来ました。 とりあえず乱数のマニュアルを明日研究室でさがしてきます。 猫でもわかる、、、には乱数コーナーはみつかりませんでした。 とりあえずCによる最新アルゴリズム辞典が研究室にあったような、、、、。
>>72 いやあ、今まで実験系しか経験したことなくてソフトもハードも素人同然なんですよ。
実際プログラムを始めたのも今年度からで、勉強の片手間にやってましたから、、。
>>56 >樹木の角度を乱数で分枝してボックス・カウント法により
>フラクタル次元を求めるってのを現在やってます。
樹木の画像から求めるのか?ムズカシソウ....
>>76 いやいやいやいや、全然そんなむずかしいことはしてないですよ。
Cで樹木を作成、それとフラクタル次元を求めるプログラムをファイルポインタでつないだだけです。
いまんとこは単に枝のみですし。
始点と終点を設定した線分をどんどんつないでいくだけですから。
これから死にものぐるいで2次元から3次元に拡張、葉をつけて、光源による反応をプログラムするんです。
どうも、レスありがとうございました。 long unsigned int == long で、 long int == long ということですが、 それでは、なぜ最初からlongにせずに、 long unsigned intというふうにかくのでしょうか? その理由をお願いします。
>>78 long int == long
unsigned long int = unsigned long
longはlong intの省略した表記
その奇妙な順番については知らん、書いたやつに聞け。
>>79 えっ!!
longの正式名称ってlong intだったんですか!?
プログラマ歴10年のこの私ですが、初めてしりました。
同じ意味を持つ書き方が何通りかあるんだわ。 unsigned long long unsigned unsigned long int unsigned int long long unsigned int long int unsigned int unsigned long int long unsigned どれを選ぶかというのは書いた人のみぞ知る。
>>80 何がいいたいのかわからないけど、勉強になってよかったね。
関数の戻り値を省略するとintになるのと同様、
longはlong intが省略された書き方。
83 :
デフォルトの名無しさん :03/11/27 02:29
「逆ポーランド記法で入力された計算式の計算を行うプログラムを、 スタック構造を利用して、次のように作成しなさい。 1.要素を一つ読み込む。 2.要素が数値ならば、要素をpushする。 3.要素が演算子ならば、要素を2つpopし、その計算結果をpushする。 4.各要素について1~3の実行を繰り返して、読み込む要素がなくなったときに スタックに残った要素が答えとなる。 ただし、 ・double型の配列を用いる。 ・「5+」のように、数が足りない、入力が全くないなど、pop()で数値を取れなくなるケース。 ・「123+」のように、数が余ってしまい、最後に答えをpop()した後もスタックに数値が残ってしまっているケース。 ・文字は1.2.3.4.5.6.7.8.9.+.-.*./ いがいのものを受け付けてはいけない。 ・ポインタ処理は使わないこと。」 お願いします。
>>83 ポインタ処理は使わないこと
配列とポインタの関係をうやむやにしたいのであるなぁ。
このあたりのこと、ちゃんと教えてくれるんかなぁ。
86 :
デフォルトの名無しさん :03/11/27 03:13
>>84 お、肝心な部分がすっぽり抜けてたのに気づきませんでした。
修正します。失礼しました。
ただし、次のようなエラーは回避されるようにすること。
・「5+」のように、数が足りない、入力が全くないなど、pop()で数値を取れなくなるケース。
・「123+」のように、数が余ってしまい、最後に答えをpop()した後もスタックに数値が残ってしまっているケース。
・文字は1.2.3.4.5.6.7.8.9.+.-.*./ いがいのものを受け付けてはいけない。
なお、
・double型の配列を用いる。
・ポインタ処理は使わないこと。」
・ポインタ処理は使わないこと。 何故なら、先生が読めなくなるので。
88 :
デフォルトの名無しさん :03/11/27 03:55
すんません! 配列に分数って初期データとして入れられないのでしょうか? なんか配列に分数を入れて 計算させると計算されない…
意味が分かりません
91 :
デフォルトの名無しさん :03/11/27 04:02
double a[4][4]={{2,1/2,01/6},{4,1,2,1/3},{0,1/2,3,0},{6,3,0,2}}; double b[]={1,1,1,1},c[]={0,0,0,0}; for(i=0;i<=3;i++){ for(j=0;j<=3;j++){ c[i]+=a[i][j]*b[j]; } } 分数がまったく計算されないのです
小数点つけてみ。 1/2→1.0/2.0
93 :
デフォルトの名無しさん :03/11/27 04:11
>>92 神!!
これは何が原因なのでしょうかねぇ…?
そういうきまりでもあるんですか?
久々に笑わせてもらいました。
笑ってないで教えてくださいよぉ
96 :
デフォルトの名無しさん :03/11/27 04:21
97 :
デフォルトの名無しさん :03/11/27 04:21
初めまして、おはようございます? 質問なのですがたまに prinf という文があって nとfの間にtが抜けているのtを入れようと nとfの間にカーソルを持っていき tと打つと print となってfの上に上書きされてしまうんですけど これはなんとかならないでしょうか?
>>97 エディタによります
INSボタンを押せば挿入と上書きの切り替えができるエディタが多いようです
99 :
デフォルトの名無しさん :03/11/27 04:28
>>98 VC++6です
INSボタンというのを気づかないうちに
押していたのですね
ありがとうございました
100 :
デフォルトの名無しさん :03/11/27 04:32
>>86 をお願いします。提出期限が今日までなんです・・・。
>>92 そういうきまりがある。
C言語では整数同士の割り算の結果は整数になるのよ。
3/2→(計算)→1.5→(切り捨て)→1
んで、小数がついてると、おおよそ値を計算するんよ。
物理とか科学でおおよその計算するとき1.23×10の-3乗とかするじゃない。
あんなふーに計算するんだわ。
コンピータの中では2進数なんでこの表現は確かではないんだが、イメージしてもらえるかな・・・。
識者の人、詳しい解説ってどこにある?
>>100 この時間までがんばってたのね。おつかれさま。
出来たところまで見せると、作ってもらえるかも。
前スレに近いもんあったよ。
102 :
デフォルトの名無しさん :03/11/27 04:39
>>101 そういうことだったのですか
勉強になりました
っていうかどっちかの数字が小数点ありゃいいんですね!
>>86 よくわかんないんだけど、
>・「123+」のように、数が余ってしまい、最後に答えをpop()した後もスタックに数値が残ってしまっているケース。
ってことは受け入れる数値は一桁?
106 :
デフォルトの名無しさん :03/11/27 04:53
なんか研修先の先輩に for(i=0;i<=3;i++){ のどっかに空欄入れるとよろしい と言われたんですけどどこか忘れてしまいました。 普通どこに入れますか?
>>105 double である必要がなくなるので、それはないかと。
>>106 人によってスタイルがある。
漏れはこんな感じ。for (i = 0; i <= 3; i++)
scanf文で分数を入力することは可能ですか?
>>107 for(i=0;i<=3;i++){
の人も社会人にはいますかね??
漏れは一番これがしっくりくるのですが(汗
本も読まなければWebでも調べなさそうだ。
×i++ ○++i
あたまン中。<空白 学ぶための余裕として。
冗談は置いといて。
流儀によるが、
for (i = 0; i <= 3; i++) {
とか
for (i=0; i<=3; i++) {
俺は最初の
>>107 と同じスタイルが好み。
116 :
デフォルトの名無しさん :03/11/27 05:13
>>107 でも、105に挙げた例だとスタックに数値が残らず逆に足りないよね
>>118 勝手に、スペースが区切り文字だってことで良いんじゃない?
何より仕様があやふやすぎる。
>>86 ,100 消えたか? 君のために、みんな真剣だぞ?
都合のいいよに解釈あとは適当に作れ版
char s = "12+3*";
int i;
double a, b;
for (i = 0; s[i] != '\0'; i++){
if (isdigit(c)) {
push(s[i]-'0');
continue;
}
switch(s[i]) {
case '+': push(pop()+pop());break;
default:
/* error */
}
}
printstack();
121 :
デフォルトの名無しさん :03/11/27 05:54
あー、余剰は元々無理か。もう寝るぽ。
って、最後の結果出力がエラー出力になってる・・・。
>>121 あまり読んでないけど、文字コードの値をそのまま書くのは良くないよ。
48 と書くより '0'' と書く方が断然読みやすいからね。
それに int main() にしてるんだったら、return 0; はつけておくべきだよ。
あ、出来るのか。
スタックは二個だけで良かった・・・。
漏れが間違ってた。
>>126 取りあえず、
42<=s[i] && s[i]<=57 || s[i]==32
'*' <= s[i] && s[i] <= 9 || s[i] == ' '
とかに変換すべし。
どーゆー入力を入れたらエラーが出るのよ? どういう入力入れたら正しく動くのよ? タイムリミットって何時よ?
このプログラムでは 数値と演算子の間にスペースを入れなければならない。 正しく入れるとその後の処理が強制終了でできない。 数値と演算子以外のものを入力すると、正しくエラー表示がでてくるが、 連続して入力するとバグが出る(エラー表示が出つづけてとまらない) てな感じです。 スペースを入れなくても、 逆ポーランドで式を入力してください 12+3* 数値が足りていません 数値が足りていません 数値が足りていません (以後フリーズ) になります。
あ、エラー回避の1番目と3番目は回避された・・・
期待する入力は空白区切り。
>>132 では
・数値、演算子以外の文字を入力すると、期待通りエラー表示される。
・空白で区切ってしまうと、期待しない動作をする。(エラー表示がとまらない)
そこで、"1 2 + 3 *"の代わりに"12+3*"と空白で区切らず入力を入れてみた。
期待する動作は9と表示しエラー表示なく終了することであるが、以下のようになった。
数値が足りていません
数値が足りていません
数値が足りていません
(以後フリーズ)
と、解釈したが。すっごくわかりずらいぞ。
>>137 最後は=で答えをpopするんじゃないの
失礼されてしまっても、確認がとれんじゃないの。 確認に対し答えとらん・・・ なんだかなぁ・・・ 俺降りた。
>>138 もう一晩考えたんで頭が回らなくて・・すみません。
>>136 氏の解釈の通りです。
で、後々考えて、3つともエラー修正できました。
完成おめでと。
前スレに比べて質がおちたのぉ。
質が落ちたというか、冬休み近くなってみんな課題出されてるんだろ。 んで元から出来ないヤツが楽したくて聞きにくる・・・と。
147 :
デフォルトの名無しさん :03/11/27 10:46
148 :
デフォルトの名無しさん :03/11/27 11:05
これかな。 quick_sort(&a[j+1], n-j-1); でもハッシュにこんなソートかけても頻度順にはならないだろ。
すいません。どうしてでしょうか…?>148
main() { int ndata; /*..*/ //リスト中の全単語と出現回数をdata[i]に挿入。(修正後はコメントと違うことをする) for (ndata = 0, i = 0; i < SIZE; i++) { for (p = word[i]; p != NULL; p = p->next) { data[ndata++]=p; } } /* .. */ //data[i]中の全単語と出現回数を出力。 for (i = 0; i < ndata; i++) { printf("%d %s\n",data[i]->count, data[i]->str); } } int cmp(const void *va, const void *vb) { WORD **a = (WORD **) va; WORD **b = (WORD **) vb; return (*a)->count - (*b)->count; // countは非負なので負の桁あふれはしない } void quick_sort(WORD *a[], int n) { qsort(data, n, sizeof(WORD *), &cmp); }
ありがとうございます! しかし、コンパイルはできますが、 やはり、動きません…。。
ごめんよ、修正点が抜けてた。 main()中 quick_sort(data, SIZE) ↓ auick_sort(data, ndata);
なるほど…うまくゆきました! ありがとうございましたm(_)m
154 :
デフォルトの名無しさん :03/11/27 18:43
double型の数字があるとして そこから小数第二位の数だけ取り出すとか 10の位の数だけ取り出す、みたいな関数ありますか? 例 123.456→小数第二位→5
155 :
デフォルトの名無しさん :03/11/27 18:49
>>154 100かけた数を(intにキャストしたあと)10で割った余り
もっと確実にやるには最初にmodfで小数部だけ取り出す
10の位はintにキャストして整数部だけ取り出したあと、10で割ったものを10で割った余りを求めればいい
158 :
デフォルトの名無しさん :03/11/27 21:25
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1068028311&res=3 ↑のプログラムについて質問ですが、
width = (max - min) / (step - 1);
のところでなぜ、steo-1としなけれいけないのでしょうか?
その理由も教えてください。
また、
for (int i = 0; i < step; ++i) {
if (iter->score < min + (i + 1) * width) {
cout << step - i << "点" << iter->name << endl;
の式で (int i=0;i<step;i++)
とし、 if (iter->score < min + (i + 1) * width)
としなければならないのでしょうか?
プログラムの解説および、計算式の証明できませんでしょうか?
大変困っていますので、お願いします。
159 :
デフォルトの名無しさん :03/11/27 21:41
数字の出現回数を表示するプログラムで このプログラムのグラフを縦に表示したいんですが どうすればよいのでしょうか。 ご指導お願いします。 #include<stdio.h> void main(void) { int i,j,ch; int cnt[10]={0}; while(1){ ch=getchar(); if(ch==EOF){ break; } if(ch>='0' && ch<='9'){ cnt[ch - '0']++; } } puts("数字の出現回数\n"); for(i=0;i<10;i++){ printf("%d",i); for(j=0;j<cnt[i];j++){ putchar('*'); } putchar('\n'); } }
>>159 #include<stdio.h>
void main(void)
{
int i,j,ch;
int cnt[10]={0};
while(1){
ch=getchar();
if(ch==EOF){
break;
}
if(ch>='0' && ch<='9'){
cnt[ch - '0']++;
}
}
puts("数字の出現回数\n\n");
j=cnt[0];
for(i=1;i<10;i++)
if(j<cnt[i])
j=cnt[i];
for(;j>0;j--){
for(i=0;i<10;i++)
putchar(cnt[i]<j?' ':'*');
putchar('\n');
}
puts("----------\n0123456789");
}
縦書きの場合は'*'よりも'|'の方がみやすいな。
なるほど、出来ました。 感謝感激です。 ありがとうございましたm(__)m
164 :
デフォルトの名無しさん :03/11/27 22:08
ローンの利息を計算するプログラムなんですが、 LSI C-86だとエラー無しにコンパイルが通りますが BCCだと3行目に「main の戻り型は int でなければならない(関数 main )」とエラーが出ます。 どこか間違っているのでしょうか?よろしくお願いします。 #include <stdio.h> void main(void) { double interest, principal, rate; int days; printf("ローンの借入金額を入力して下さい(-1で終了) : "); scanf("%lf", &principal); while(principal != -1) { printf("金利を入力して下さい : "); scanf("%lf", &rate); printf("日数を入力して下さい : "); scanf("%d", &days); interest = principal * rate * days / 365; printf("ローンの利息は %lf ドル\n", interest); printf("ローンの借入金額を入力して下さい(-1で終了) : "); scanf("%lf", &principal); } }
165 :
デフォルトの名無しさん :03/11/27 22:10
>>164 そこまで詳しく警告を出されて分からないならもう少し勉強した方がいいよ。
それと、printfには%lfはないよ。doubleは%f
>>164 ネタ?
void main(void)
{
}
↓
int main(void)
{
return 0;
}
ローンとか微妙にうけるなw 初級的な質問だな [C 関数]とかで調べてみて「自前の関数」を作れるようにしてみて まぁ難しいことじゃないから、少し調べればわかるよ でもこのエラーって何ででてくるの? voidって宣言してるし
>>158 の誰か質問に答えてください。分かりませんので。
明日まで証明お願いします。
処理系にもよるんじゃない? マイコンなんかはむしろ void main(void) の方が多い。
>>168 いや、void main()でよろしいよ
よくある質問と答え 1/2が0になる、0.5にするには? →1.0/2.0にする double x; scanf("%f", x); が動かない →scanf("%lf", &x); void main(void)って書くと文句いわれる →学校と同じコンパイラ使いなさい。 →できなければ、int main(void) { /* ... */ return 0; }って書く。 なぜxxxなのですか? →無視される。 →なぜxxxなのですか、自分はxxxだからだと思うんだけれどいいのかな?と尋ねる。 期限はxxxまでです →あとxxx時間だね。
「ヒストグラム平滑化」の方法について教えて下さい。
175 :
デフォルトの名無しさん :03/11/27 22:45
ダイアログの表示ってC++ではどう書けばいいの。 確か「ShowDialog」だった気が。
はじめまして。まったくの初心者です。UnixのプログラミングでMath.sprt()を用いて1から10までの平方根の値を出すにはどういうプログラミングをすればよいのですか?
178 :
デフォルトの名無しさん :03/11/27 22:51
ひろめてくだしー。 Y氏 好循環 I氏 悪循環 (日本) (健康体) (喘息) 1.(神が喘息であるかないかを決める) Y I 2.喘息でない人 喘息の人は は体力がある 体力がない Y I 3. 行動力、 五感(嗅覚)が鈍り感性が変化 する Y I 4.異常な感性の人間は本来人に迷惑をかけるから外に出てはいけないと思っている。 Y I 5.変化なし アトピーになる Y I 6.正常な感性 外に出なくなりさらに異常な感 性になる Y I 7.正常な人間 異常な人間(レッテル)
179 :
デフォルトの名無しさん :03/11/27 22:52
Y I 8. 死 Y I 9. 来世 Y I 10.異常な人間は人に迷惑をかけるので行動を抑制する必要がある Y I 11.神は異常な人間は人に迷惑をかけるので行動を抑制する必要があると思っている。 Y I 12.神が喘息であるかないかを決める Y I 13.喘息でない 喘息である Y I 1.に戻る
181 :
デフォルトの名無しさん :03/11/27 22:56
2次方程式の解を求めるプログラムで誤差についても考えろと いう問題でプログラムは作ったのですが誤差のことがよくわか りません。 『倍精度で処理すると有効数字として15桁程度の制 度を持つがそれ以下の桁では誤差が生じる。そのため 厳密には=が成立しない。その場合、2つの実数の差 の絶対値をとり、それが十分小さければ2つの実数は 同じ値であると考える』 とかいてあるのですが『2つの実数の差の絶対値をとり、それが 十分小さければ2つの実数は同じ値であると考える』というのは どうゆうことでしょうか?誤差の精度のとこはなんとなくわかっ たのですがここがわかりません。どなたかおねがいします。
できれば、文章で「ヒストグラム平滑化」の方法というか原理を知りたいんですけど、お願いします。
>>177 CなのかC++なのか?
>>181 例えば。
if (fabs(a-b) < 1.0e-5) {
/* 2つの実数の差は十分小さい */
}
>>182 アルゴリズム関連のところで質問したら?
>>170 ホスト付き(hosted)な環境ではmainの戻り値はintでないと正しくない。
ただし独り立ち(freestanding)な処理系ではそれは適用されない。
今回の場合mainの戻り値はintでないと正しくない。
「アルゴリズム関連」の掲示板はどこにあるんですか?
>>182 移動平均。
或いは微小積分。
さもなくばぼかし処理。
要は、入力(この場合オリジナルのヒストグラム)の微小区間の平均を取ることで
出力(この場合結果のヒストグラム)の曲線が滑らかになることを期待する処理だ。
信号処理、画像処理などではよく出てくる処理なので、よく理解しておくように。
尚、>176の提示したソースは突っ込みどころ満載なのでそのまま利用しないように。
まだ、やり方がよくわかりません。
何も考えずぐぐれ。
微小区間の平均はどうやって取るんですか?
さて、今日も夜更かし。未解決の課題をぷりーず。 あ、俺Cしかわかんないかんね。
191 :
デフォルトの名無しさん :03/11/28 00:13
Linux環境でC言語を学んでるものなのですが いま、初心者臭さが出てるような、一番シンプルで分かりやすい プルグラムで書いたいていただけないでしょうか? 【課題】 アドレス帳を作成しなさい 構造体メンバー データー数No...int型 氏名....char型 住所....char型 電話番号...char型 次のアドレス...trust型ポイント変数 ①MEMO形式で行う i又はI⇒入力 o又はO⇒出力 q又はQ⇒終了 ②データー数Noは自動的に入力される <条件> 1、分割コンパイル 2、リスト構造にてデータを持つ(ファイルは3つ以上)
>初心者臭さが出てるような、一番シンプルで分かりやすい 矛盾するぽ。 >MEMO形式で行う それってなにぽ? >リスト構造にてデータを持つ(ファイルは3つ以上) よくわからないぽ。 入出力はキーボードとディスプレイなのぽ? ファイルへの入出力はないのかぽ? ・・・大仕事になりそーなので、辞退するぽ。
>>189 >176の提示したソースを見ても見当つかないか?
だとしたらお前には無理だ。
>176のソースでは、着目点の前後2離れた点までの5点の平均を取っている。
つまり、17 22 33 28 38 33 40 と言った数列があったとして、着目点が4番目の28ならば
22 33 28 38 33 の平均を取ると言うことだ。結果は30.8、四捨五入して31となる。
他の点についても(はみ出す場合に注意して)平均を取ると、21 23 28 31 34 36 38となる。
結果、グラフにするまでもなく凹凸がなくなって滑らかになっている。
5点の平均を取らずに前後1離れた点を含む3点での平均を取る方法もあるし、
着目点のウェイトを重く取る方法もあるが、基本的に考え方の上での大差はない。
このスレでいいのかわからないけど gnuplotで円をいくつも表示するために Cによるデータをどんな形で出したらいいでつか。 ex) 線分を書く 0.0 0.0 1.0 1.0 こういうデータにすると始点のx座標が0.0y座標が0.0 同じく終点が1.0 1.0の線分が書ける。
>>194 >Cによるデータをどんな形で出したらいいでつか
????
つまりは、printfでどのように書き出せばいいのかってことなんです。
while(1) printf("○");
0.0 0.0 1.0 1.0 出力フォーマットは答えが出てるような… printf("%f %f\n", float_value1, float_value2); printf("%lf %lf\n", double_value1, double_value2); printf("%Lf %Lf\n", long_double_value1, long_double_value2);
それにより書き出されたものがgnuに円を書かせる情報をもっているってことなんでつか?
gnuplot にどんなデータを与えたらいいかって話なら うに板かwebprog板へどーぞ
ありがとう
1) 標準入力を読み、単語を1行に1つずつ標準出力へ書くプログラムを作成せよ。 単語を構成する文字は空白類以外とする。 2) 標準入力を読み、短い行を1つの行に繋げて標準出力へ書くプログラムを作成せよ。 行を繋げるときは空白をはさむ。 入力中に1行60文字を越える行があったら、出力も1行とする。 そのほかの場合は出力は1行60文字を越えないこと。 よろしくおねがいします。
>>202 1)
#include <stdio.h>
#define BUFSIZE 256
int main(void)
{
char buf[BUFSIZE];
while(scanf("%s", buf) >0)//!= EOF)
printf("%s\n", buf);
return 0;
}
間違えた。 #include <stdio.h> #define BUFSIZE 256 int main(void) { char buf[BUFSIZE]; while(scanf("%s", buf) != EOF) printf("%s\n", buf); return 0; }
2) #include <stdio.h> #include <string.h> #define BUFSIZE 1024 #define MAXLEN 60 int main(void) { char buf[BUFSIZE]; size_t len = 0; while(gets(buf)){ if(len != 0 && len + strlen(buf) + 1 > MAXLEN){ printf("\n"); len = 0; } if(len != 0){ printf(" "); len++; } printf("%s", buf); len += strlen(buf); } if(len != 0) printf("\n"); return 0; }
208 :
デフォルトの名無しさん :03/11/28 04:21
C言語で空間上の四面体の体積を求めるプログラムを作りたいんですが、どうすればいいのかわかりません。 構造体を使って空間上(三次元)の4点A,B,C,Dの座標を定義するのです。 四面体の求め方はベクトルの三重積の公式を使うみたいなことをヒントで言われたのですが、ベクトルの三重積がわからないんです。 空間上の三角形の面積を求めるプログラムを作ってみました。 少しでも参考になれば幸いです。よろしくお願いします。 #include <stdio.h> #include <math.h> int main(void) { double AB, BC, CA, s, m; struct zahyo{ double x, y, z; }A, B, C; scanf("%lf %lf %lf",&A.x,&A.y,&A.z); scanf("%lf %lf %lf",&B.x,&B.y,&B.z); scanf("%lf %lf %lf",&C.x,&C.y,&C.z); AB=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)+(A.z-B.z)*(A.z-B.z)); BC=sqrt((B.x-C.x)*(B.x-C.x)+(B.y-C.y)*(B.y-C.y)+(B.z-C.z)*(B.z-C.z)); CA=sqrt((C.x-A.x)*(C.x-A.x)+(C.y-A.y)*(C.y-A.y)+(C.z-A.z)*(C.z-A.z)); printf("AB=%lf\nBC=%lf\nCA=%lf\n",AB,BC,CA); s=(AB+BC+CA)/2; m=sqrt(s*(s-AB)*(s-BC)*(s-CA)); printf("面積=%lf\n",m); return 0; }
210 :
デフォルトの名無しさん :03/11/28 05:05
>>208 スカラ三重積 a・(b×c) が平行六面体の体積だから、
1/4 すれば四面体の体積になるんじゃないかな?
>>210 前スレでレスつけなくて今頃何故レスつけるんだ?
そんな奴には答えないし、説明すんのも面倒くさい。
分からんのであれば自分で一から作れば良いだろ。
キーボードから二つの整数を変数に入力したのち、ポインタを 使ってたがいの値を交換するプログラムをつくりなさい。 ポインタの演算の課題で上の問題は教科書の原文そのままです。 エディタはturbo c++を使ってます。 どうかお願いします。
void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; }
int main(void) { int a, b; /* 入力はまかせた */ swap(&a, &b); return 0; }
#include <stdio.h> を追加。 入力部は scanf("%d%d", &a, &b);
以上、三人寄れば文殊の知恵でした。
swapはまだ習ってないのです。 swapを使わずにポインタだけでは出来ないでしょうか?
>>219 いや、だからあんたがswap()を作るんだよ。
つーか、>215見ろ。
>>219 ネタかもしれんけれど、一応確認。
自分で関数を作るとゆーのは習いましたか?
3人寄れば、高速ツッコミ。 ・・・出力抜けてるよ。>プログラム作るお3人
>>221 ネタではないです。
swapは聞いたことはあるんですが授業でも習ってません。
>自分で関数を作るとゆーのは習いましたか?
習ってません
>>222 大丈夫なのれす。出力せよとは書いてのよ。
書いてのよとか意味わからんこと書いてのよーーーーーー
ああ、平和だ・・・。 ・・・ポンタを使って入れ替える・・・mainの中でかぁ・・・(遠い目) int a,b,tmp; tmp = *&a; *&a = *&b; *&b = tmp; いや、あまりにもバカらしいので・・・。ネタで攻めてみました。 題意には沿ってるでしょう・・・(真意はポインタ変数を使えだろうが・・・)
勿論出力もしますので宜しくお願いします。 教科書調べたところswapのことがのってなかったのですが swapを使わなければ解けないようならば教えていただいたとおりに 提出したいと思います。
>>227 贅沢だなあ・・・。
#include <stdio.h>
int main(void)
{
int a, b, tmp;
scanf("%d%d", &a, &b);
*&*&*&tmp = *&*&*&*&*&a;
*&a = *&*&b;
*&*&*&*&*&*&b = *&*&*&tmp;
printf("%d, %d", a, b);
return 0;
}
>>227 キモだけ書いてあげるから、入力と出力くらいは自分でして。
int a, b, tmp;
int *x = &a, *y = &b;
/* swap */
tmp = *x;
*x = *y;
*y = tmp;
>>214 あなたの使ってる教科書の名前を教えてください。
とても面白そうな本なのでよろしく。
>>231 漏れが行ってた専門学校はテキストなかったよ。
お陰で進行速度の遅さはピカイチ。
swap()にばかり目が逝って自作関数ってのが見えてないな。
>>227 「関数を自分で作る」みたいな項目はないか?
swap()って関数の名前にほとんど意味はない。
つか、教科書の「ポインタ」の項を見れば普通に出来ることだろ。(そのままそっくり書いてあるよな)
載ってないなら「はじめてのC」とかでも買ってきてくれ。
234 :
デフォルトの名無しさん :03/11/28 09:50
C言語についての質問です。 プログラムの実行開始位置のmain関数の書き方は、int main(), main(),int main(void),int main(int argc,char* argv[]) など本によっていろいろですが、その違いを教えていただきたい。
236 :
デフォルトの名無しさん :03/11/28 10:24
>234 コマンドラインで直接引数を渡すか渡さないかの違いじゃないのかな? ./exeFile file1 file2 のように。 int にはコマンドで渡した文字の数。上の場合は3 charには入力した文字列が入る。 上の場合はargv[0]=exefile,argv[1]=file1,argv[2]=file2のようになります。 void型は引数なし。
237 :
お願いしますT _ T :03/11/28 11:14
-|-|-|-|- 左のような模様を作るプログラム。 -|-|-|-|- ただし、2重ループ(while文)とすること、したがって -|-|-|-|- printf("-|-|-|-\n")の処理は不可。 -|-|-|-|- 左のは内側のループは9回、外側のループは7回の繰り返し処理となる。 -|-|-|-|-
#include <stdio.h> int main(void) { int i, j; for (i = 0; i < 9; i++) { for (j = 0; j < 7; j++) if (i % 2 == 0) putchar('-'); else putchar('|'); putchar('\n'); } return 0;
239 :
お願いしますT _ T :03/11/28 11:23
>>238 実行結果がこんな感じになってしまいました^^;
--------
|||||||
--------
|||||||
--------
|||||||
すばやいねぇ(^^;; ifの条件式がまちがっとるよーですな。
241 :
お願いしますT _ T :03/11/28 11:28
>>240 どのように間違っているのですか??修正版お願いします。
本当にすいませんT_T
i % 2 じゃなくj % 2 でそ
243 :
お願いしますT _ T :03/11/28 11:36
ありがとうございました!!!!!!!!!!!
244 :
お願いしますT _ T :03/11/28 11:40
-|-|-|-|- たびたびすいません。このように2段目をずらすにはどこを |-|-|-|-| 変えればいいのでしょうか? -|-|-|-|- |-|-|-|-| -|-|-|-|-
自分でやる気ねーのは、このスレの本質なんだけれどさー。 まあ、ちっとは自分でやってみ。
for (i = 0; i < 9; i++) { for (j = 0; j < 7; j++) { if ((i+j) % 2 == 0) // もしくは if (!((i + j) % 2)) putchar ('-'); else
247 :
デフォルトの名無しさん :03/11/28 11:45
画像をLoadして表示させるプログラムってどういう考え方して作ればいいんですか? 使用する関数とかがわからなくて悩んでるんですが。
おそらく、今、演習時間とみた。 ところで、('-')って顔文字みたいね。
>>246 間違えた
for (i = 0; i < 9; i++) {
for (j = 0; j < 7; j++) {
if ((i+j) % 2 == 0) // もしくは if (!((i + j) % 2))
putchar ('-');
else
putchar ('|');
}
}
かな、謎解きみたいで面白かった
>>247 (ソース参照用)
実行してなくてごめんよ。
つまり i + j にすることで行によってずれるわけね
250 :
お願いしますT _ T :03/11/28 11:46
ありがとうございます。助かりました。
>>249 (ソース参照用)
なんか先に…
>>250 泣いても誰も助けてくれないぞ。
助けてほしいなら真剣に頼め
putchar ('-'); putchar ('-'*);
>>247 環境ごとでちがうんで、環境依存OKな別スレへ。
ここは、コンソールアプリがメインぽい。
>>253 こういうところいくと理想が高いのっていいなって思うね。
俺は知った物で作るって感じだから全然進展ないのかなぁ?
>>253 一応Visualstadio.netで、C++を使ってやりたいのですが。
256 :
デフォルトの名無しさん :03/11/28 12:10
>>184 フリースタンディングだとプログラムの始まりはmain関数とも決まっていないんだよな。
257 :
デフォルトの名無しさん :03/11/28 12:14
ホスト環境というのがOSの上で動く環境という意味なら、やっぱりOS自体の動作環境はフリースタンディング環境なんだろうか。
258 :
デフォルトの名無しさん :03/11/28 15:38
質問ですお願いします。 std::stringにintやdoubleや文字列などを結合させたいのですが string s; int i = 0; double d = 0; s = "hello " + i + d; とはできないですよね。 sprintfを使えばできましたが、C++流のプログラミングでは どうやるのかを教えてください。
さあ。boost::Formatとか?
260 :
デフォルトの名無しさん :03/11/28 15:52
ボーランドのturbo debuggerのヘルプってどこにあるか分かりますか?
>>258 確認せずに書くのでご容赦。
演算子の優先順位があるので、
s = (("hello" + i) + d);と解釈されるはず。
"hello" + iじゃポインタの加算だべ。
s = "hello";
s += i + d;
なら上手くいくのでない?
ちなみに、整数だか文字型だかはそのキャラクタコード1文字の文字列になったはず・・・。
そのあたりのことは解説など参照されたい。
>>261 確かにコンパイルエラーは出ませんでした。
見たことない文字がたくさん出てきましたが。
とりあえずこんな感じで暫定的に解決してみました。
ostringstream s;
s << "hello" << i << d;
string str;
str = s.str();
ありがとうございました。
わざわざsstreamをincludeしなくてもできるだろ みたいな意見がありましたらお待ちしています。
265 :
デフォルトの名無しさん :03/11/28 16:17
266 :
デフォルトの名無しさん :03/11/28 17:16
>>267 いちおう3*3、3色のライツアウト解法プログラムです
いや、ライツ「アウト」です・・・ >ちょっとソースコード観にくいので改造してから考えさせてください お手数おかけしてすいません、お待ちしております
>>270 ごめん、他の人に頼んでください。
初めてなものですから、自分も勉強にして見ます。(わかったら書きますね
あと、わかりにくいから複数行にわたる if for なら { } つけないと読みにくいですよぉ
>>271 分かりました、自分でももうちょっと考えてみます
>あと、わかりにくいから複数行にわたる if for なら { } つけないと読みにくいですよぉ
ちょっと良く分からないのですが
if((i % 3) != 0) {temp[i-1]=temp[i-1] + 1;}
1行でも↑のようにしたほうが良いという事でしょうか?
>>273 (ソース参照用)
while(temp[i] == 0)
{
if(i==8)
for(i=0; i<9; i++)//正解表示部
{
cout<<a[i];
if((i % 3)==2) cout<<"\n";
}
if(i==9)
{
cout<<"--------------------------"<<endl;
break;
}
i++;
}
ここの if (i == 8)の部分とかね
意味は解らなかったけど 一番下の while(i <= 9) と直したらうまく行ったよ
>>273 こんな感じでしょうか?
if(i==8)
{
for(i=0; i<9; i++)
{//正解表示部
cout<<a[i];
if((i % 3)==2)cout<<"\n";
}
}
>>275 そうだね
解りづらいという俺の勝手な言い分で悪いね
>>274 それだと、全てのボタンの押し方になっちゃいます
で、その押し方の表示がおかしいのが謎なのです
もし上段3つの押し方が000だとこの問題の場合
上から、000、212、010になるはずなんです
>>276 いえ、視覚的に見やすくなったのでためになりました
>>277 少しずつ解ってきた・・・かな
000
000
000
真ん中オスと
010
111
010
・・・って思ったら
>>277 みると全然違うなぁ・・・
なんでだろ
>>278 2色ならそれでいいのですが、今私がやってるのは3色なんです
いちおう2色のやつは以前ここで教えていただきできました
あぁ、だから 0, 1, 2 なんだね if((i % 3) != 0) temp[i-1]=temp[i-1] + 1; //左 とかは今後マス目を増やすときの対策ってことだよね?
0 -> 1 1 -> 2 2 -> 0 012 120 201 で真ん中オスと 022 201 211 こうなるんだよね?
282 :
デフォルトの名無しさん :03/11/28 18:20
ユーザーに0から100までのどれかの数字を入力させて その数字を英語で表示するにはどうしたらいいでしょうか? 82ならeighty-two みたいにしたいんですが・・・ どうかよろしくお願いします。
>>282 char number_string[101][15] = {
"one",
"two",
"three",
...
"one-handred"};
としましょう
>>281 はい、そうです
>>280 それは、押した場所の左を変化させるコードですが左が無い場合は増加させないために
ifで場合わけしてるわけです
>>284 >それは、押した場所の左を変化させるコードですが左が無い場合は増加させないために
>ifで場合わけしてるわけです
さすがにコード見たら解るんだけど。
なんで % とか使ってるのかなって事
>>285 配列の番号で言うと左端は上から0,3,6なので3で割り切れるときは左端なわけです
ということは3で割り切れないときは左を増加させても良いということです
int q[3][3]という二次元配列をお勧めする。 本当にわけわからないです・・・
実力足りなくてごめんよ… 他の人お願いします 探索の部分について解らないです(聞いてる人以外が質問って変かな
すばらしい程可読性の無いソース… 愚痴りまくりでごめんよぉ! なんで temp に毎回 q を代入してるの?
>>290 qが問題でqそのものを操作してしまうと問題が変わることになってしまうので
tempにコピーしてから値を操作してます
インデントって軽視する人が多いけど、思った以上に大切なんだよね。 プログラムの論理構造を表しているわけだから。 私はたとえ1行の条件文でも if (a == 0) { do_something(); } としています。 if (a == 0) do_something(); とやると、あとで行を追加したときに、 if (a == 0) do_something(); do_another(); みたいになる危険がある、と何かの本に書いてあったので。
>>292 switch ()
{
case:
break;
default:
}
もだね。
でも if 使ったら俺は大抵改行挟むから
if (a == 0)
do_something();
do_something2();
って感じかな。
だから、
>>292 観たいにはなりにくいかな
>>291 一回押すだけで終わる場所を探してるの?
>>294 ボタンを押す回数は押すボタンの上のマスをみて決めます
全体の押す回数は決まってません
試行後全部消えている押し方を探してます
>>295 やっとわかった
a[3]でイイでしょ?
a[9]にする意味ってあるの?
>>296 どっちでも良いと思うんですが・・・
それで、そんな感じで二次元配列にしようとしてるんですが良く分からないため時間かかりそうです
二次元配列だと理解できないので普通の配列にしてます
おっけ、直す部分はわかったけど ヒントだけ出して自分で直す? それとも答えを聞く?
>>298 そうなんですが、大元は
>>266 の時点のソースでなぜか配列aの値が
試行の途中でリセット(?)されたりしてしまうのです
>>299 ひとまず、ヒントお願いします
>>300 そりゃ for で初期化してるだろ!
んでヒントは
最後の while を
while (i<9)
にして
cout << a[i];
から
cout << temp[i];
としましょう。
なんでちゃんと動かないか解ります
>>301 ああ、最後の詰めが甘かったんですね・・・でもそこを直しても答え間違ってるんですよね・・・
うーん・・・
>そりゃ for で初期化してるだろ!
試行はじめではなく試行途中で0になってるんです
>>301 を実行しても何も気が付かないの?
すごい天然だね
temp[i] が 0 1 2 以外の数字を出してるだろ?
つまり
tmp[i] == 0 はありえないことになる
>>303 いえ、最後のwhileがtemp[i] % 3==0 は分かったのですが表示される答えが違ってるのでいまだ悩んでます
>>304 それは言葉が悪くてごめんよ。
答えが間違ってるの?
不思議だなぁ・・・
でも後は試行錯誤していけるっしょ?
頑張ってね
>>304 ソレについても解ったぞー
if(temp[i-3] % 3 == 1) //赤のとき
{
cout << 1;
a[i]=2;
temp[i] =temp[i] +2; //押した場所
if((i % 3) != 0) temp[i-1]=temp[i-1]+2; //左
if((i % 3) != 2) temp[i+1]=temp[i+1]+2; //右
if((i - 3) >= 0) temp[i-3]=temp[i-3]+2; //上
if((i + 3) <= 8) temp[i+3]=temp[i+3]+2; //下
}
else if(temp[i-3] % 3 == 2) //緑のとき
{
a[i]=1;
temp[i] =temp[i] +1; //押した場所
if((i % 3) != 0) temp[i-1]=temp[i-1]+1; //左
if((i % 3) != 2) temp[i+1]=temp[i+1]+1; //右
if((i - 3) >= 0) temp[i-3]=temp[i-3]+1; //上
if((i + 3) <= 8) temp[i+3]=temp[i+3]+1; //下
}
else
a[i]=0;
>>305 ありがとうございます、今微妙に分かった気がするのでしばらく頑張ります
>>306 ああ、ありがとうございます、ifとelseのかかり方が変だったんですね
たったいま自分も気づいて
ifのなかにbreak入れたらどうだろ?と思ったらforまで抜けちゃうので困ってたところです
やっと完成させることが出来ました、長い間付き合っていただきありがとうございました
310 :
デフォルトの名無しさん :03/11/28 20:53
>>311 どういう事をするプログラムなんですか?
こんなのどうかなぁ #include <stdio.h> enum {AC=0,B,D,E}; int table[4][3] = { /* 遷移表を配列として表現 (a,b,それ以外の順) */ /* AC */ { B, AC, AC }, /* B */ { B, D, AC }, /* D */ { B, E, AC }, /* E */ { B, AC, AC }}; int ababb(char* str) { int state=AC, event; while (*str) { if (*str == 'a') {event = 0;} else if (*str == 'b') { event = 1;} else { event = 2;} state = table[state][event]; str++; } return (state == E) ? 1 : 0; } int main(int argc, char** argv) { int i; for (i=1; i<argc; i++) { char* str = argv[i]; if (ababb(str)) { printf("%sは正規表現 (a|b)*abbにマッチします。\n", str);} else {printf("%sは正規表現 (a|b)*abbにマッチしません。\n", str);} } return 0; }
はじめまして。パソコン初心者です。 学校の宿題なんですけど、 「ヒストグラム平滑化」の原理について教えて下さい!! 自分でも調べたんですけどよくわかりません。
私もわかりません
イヒ みっかっちゃった
324 :
デフォルトの名無しさん :03/11/29 01:51
C++無図杉・・・ ちょっと泣きそう
自然数nを入力してnより小さい素数の個数を表示するプログラム (例:n=10だったら、2、3、5、7なので4つ) を解きたいんですが、 #include <stdio.h> #include <stdlib.h> int main() { int a, b, n; printf( "数を1つ入力してください:" ); scanf( "%d", &n ); for(a = 2; a <= n; a++){ for(b = 2; b <= a-1; b++){ if(a % b == 0)break; } if (a == b) printf("%d \n", a); } return 0; } これに何を加えたら"4個"などと表示できるようになるのでしょうか? 頭ではなんとなく解っててもうまくできません。 よろしくお願いします。
>>325 int a, b, n, m = 0;
printf( "数を1つ入力してください:" );
scanf( "%d", &n );
for(a = 2; a < n; a++){
for(b = 2; b < a; b++){
if(a % b == 0) break;
}
if(a == b){
printf("%d \n", a);
m++;
}
}
printf("%d 未満の素数は %d 個\n", n, m);
>>326 あ~m++ か・・・。
ホントありがとうございました。
328 :
デフォルトの名無しさん :03/11/29 04:06
n+1個の実数 a_0,a_1,…,a_n が与えられたとき、 n次方程式 a_n x^n + a_n-1 x^(n-1) + … + a_1 x + a_0 = 0 の 実数根を返す以下のような関数を作れ。 int solve(int n, double a[], double x[]); 根はx[]に代入し、戻り値は根の数とすること。 ---- n = 1, 2 ならすぐ分かるんですが、 高次になったときはどうすればいいんでしょうか…?
>>328 ニュートン法。 Newton法。
4次までなら代数演算でなんとかなるらしい・・・。
5次以上はニュートン法。整式なら微分関数も作れるから楽そうだよん。
微分関数だって。導関数ってゆーんだっけか。
>>329 3次、4次式の解の公式は複雑だから誤差が結構蓄積しちゃうし、
普通は解の公式使わずに数値解法を使って解く。
あと、ニュートン法はもっと一般の関数に対しても使える手法だし、
代数方程式限定でいいならもっと効果的な手法があったと思われ。
2分法(2分割法、bisection method)もわかりやすくねーか?
333 :
デフォルトの名無しさん :03/11/29 05:39
ね~フォームの値を変数に入れるのってどうやるの? Web言語しか知らないから良く分からないの。 submitされたらどう処理すれば変数に入れられる? (質問の仕方が違うかも:))
webprog逝け
int solve(int n, double a[], double x[]) { /* 区間[A,B)をN分割し、各分割区間で2分法を用いる */ enum { A = -100, B = 100, N = 10000 }; int i; int count = 0; double suba, subb; /* 分割区間[suba,subb) */ for (i = 0; i < N; i++) { suba = A + ((doble) (B - A)) * i / N; subb = A + ((doble) (B - A)) * (i+1) / N; if (has_root(n, a, suba, subb)) x[count++] = get_root(n, a, suba, subb); } return count; } int has_root(int n, dobule a[], double x, double y); /* 区間[x,y)に解があれば真 */ double get_root(int n, double a[], double x, dobule y); /* 区間[x,y)で解を求める */ あとは力のある人がやってつかーさい。
(補足)f(x)を求める以下の関数があるとやりやすい。 double f(int n, double a[], x); 効率は気にしちゃダメよ。
xの範囲を決めるA,Bとその分割数のNを一緒にenumに入れる使い方スキクナイ(`^´)
好きくなくて結構。実は書いた俺も好かん。 int solve(int n, double a[], double x[]); っていう縛りがあると、しょーがないんよ。グローバル変数使うくらいしか可変にならん。 あ、ひょっとして定数を#defineせれってことですか? よい方法があれば、おしえて。
>>214-229 の流れが好き。
回答を出しつつ、遊んでる。
>>338 具体的な例を挙げよとゆーことなら、この場合値の変更がないとはいえ、
定数である必要はないのだから、
int N = 10000;
double A = -100.0;
double B = 100.0;
とか・・・かなぁ。
キャストも不要になる。
でも、大文字の名前ってのが気になるやね。
>>339 定数でいいんだから、
const int N = 10000;
const double A = -100.0;
const double B = 100.0;
でいいんでない?
#Cで意味があるかは兎も角。
341 :
デフォルトの名無しさん :03/11/29 12:30
初めてここに来ました。 Excelの計算式に詰ってしまって...... 質問していいですか? 売り上げのグラフを作成していますが、昨日までの売り上げの上に、今日の売り上げを一本の棒グラフにしようとしたのですが。 計算式に一日前の数値をどう組み込んでいいのか まったくわかりません。 毎日の作業なので、今日の売り上げを入力したら 昨日までのトータルグラフに今日のグラフ分が自動的に重なるようにして 入力の手間を省きたいのです。 ご指導お願いします。
345 :
デフォルトの名無しさん :03/11/29 14:12
C++の質問です int配列を全て5で初期化したいのですが コンストラクタで初期化する方法を教えてください 今は仕方ないのでこうやっています int a = new int[10000](); for (int i = 0; i < 10000; i++) a[i] = 5;
346 :
デフォルトの名無しさん :03/11/29 14:12
>>346 どうもありがとう
C++の配列ってJavaほど便利じゃないのですね
>>350 脳内変換して怒ってるように読まない。
助言ですよ助言
>>351 それは悪かった。
別に不満を言ってるわけではなく、
そういうコンストラクタがあれば使いたかっただけです。
まあ、あれだな。勝手に質問してきて、 「Googleで調べたら?」と言ったら、ぶーたれるよーなヤツだな。
354 :
デフォルトの名無しさん :03/11/29 14:26
分割数Pnを求める関数を書け。分割数とは、正の整数nを何種類の和の形で書けるかを表す数である。 たとえば、整数5は、7とおりに分割できるので5の分割数は7である。 分割数は、二つの引数を持つ再帰的な関数で求めることができる。仮に、この関数の名前をpartition、 二つの引数をn, xと呼ぶことにしよう。この関数は、nの分割のうち、x以下の数だけを使って表せるものの個数を返す。 このような関数を書くことができれば、そもそもの分割数Pnは、partition(n, n)によって求められる。 x以下の数を使ったnの分割は、大きく二つに分けることができる。xを使う場合と使わない場合である。 xを使う場合(nがx以上である時だけ)の分割数は、n-xをx以下の数で分割する場合の数に等しい。 xを使わない場合の分割数は、partitionの第2引数の値をx-1にして呼び出せば求められる。 この二つの数を加えれば、partition(n, x)の値が求まる。 徹夜して考えたのですがわかりませんでした。お願いします。
おもしろそお。 んーと。 5=5 =4+1 =3+2 =3+1+1 =2+3 =2+2+1 =2+1+1+1 =1+1+1+1+1 おや?8つ?? すまん。なんか俺は題意がわかっとらんよーだ。 5の場合の分割全7つってなんだべ?
5なら 5 4+1 3+2 3+1+1 2+2+1 2+1+1+1 1+1+1+1+1 で、7つです。
vector<int> a(10000, 5); C++というかこれはSTLだけど…
結構たのしのそうだね
Cの質問です。お願いします。 /* メモリ確保 */ a = (double**)malloc(n*sizeof(double*)); for( i = 0; i < n; i++ ){ a[i] = (double*)malloc(n*sizeof(double)); } /* 連立方程式の入力 */ a[0][0]=1,a[0][1]=2,a[0][2]=3, a[1][0]=2,a[1][1]=3,a[1][2]=4, a[2][0]=3,a[2][1]=4,a[2][2]=1/3; ↑のように入力すると a[2][2]の部分に0が入力されてしまい 1/3という分数を入れられません どのようにして解決すればいいでしょうか
いい加減初心者名乗って質問するのには飽きたね。
初心者なら初心者板いけっつーの
>>92
>>360 偉そうに何様だ!
と思ってリンクされた所を見ると。。。
すいません
そして、ありがとうございます。。。
できた。 かれこれ2時間悩んで本見たりしてたんです。 マジでありがとうございます>360
>>361 てめーが何様だよ
と思って↓を観てみたら・・・
中途半端な場所のリンクだから探せとは言わないが初心者名乗って教えてくださいは「教えて君」なのでやめましょう
>>355 >>356 あ、なるほど。2+3と3+2を別々にカウントしてしまったか(^^;;
ぼちぼち解いて見ます。
とりあえず、何度も挙げられているけれども
『C言語によるアルゴリズム辞典』って本がある&どこかからソースがダウンロードできるんで。
待てないよーでしたら、そちらに解答あります。
#include <stdio.h> int num_count(int inputnumber, int num_org, int i) { int count = 0; int num; for (num = 1; num < num_org; num++) { if (i + num < inputnumber) { count += num_count (inputnumber, num_org, i + num); if (i + num + 1 == inputnumber) break; } if (i + num == inputnumber) { count++; break; } } return count; } int main() { printf ("%d\n", num_count (5, 5, 0)); return 0; }
>>345 問題文から作成してみたYO!。
int partition(int n, int x)
{
if (n < 0) /* 負は分割できん */
return 0;
/* 0,1 の分割数は1、xが1なら、1+1+...+1と分割するしかない */
if (n <= 1 || x == 1)
return 1;
return partition(n-x, x) + partition(n, x-1);
/* 題意ではn<xの場合は上の式で第1項が要らんが、
そのときはn-x<0で第1項は0になるんでこれでOK。(この関数の頭を見よ) */
}
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 10; i++)
printf("P(%d) = %d\n", i, partition(i, i));
return 0;
}
// 問題文に合わせるならこんな感じは? #include <stdio.h> int Pn(int n){ return partition(n,n); } int partition(int n,int x){ int count=0; if( x==1 ) return 1; if( n>=x) count+=partition(n-x,x); count+=partition(n,x-1); return count; } int main(){ int n; scanf("%d",&n); printf("%d",Pn(n)); return 0; }
370 :
デフォルトの名無しさん :03/11/29 16:20
qsortを使用して 重複文字の削除はできないのでしょうか? int compare( const void *p, const void *q){ このあたりをうまくいじくればいいのですかね? "月"を削除して出力したいです } int main() { char *wday[] = {"日","月","火","水","木","金","土","月"}; qsort(wday, sizeof(wday) / sizeof(wday[0]), sizeof(char *), compare); }
荒らしはどこかへ行け!行けったら!
>>370 もう少し改行文字の重複を削除してください。
重複文字の削除と整列は別のアルゴリズムだし、
qsortは整列の関数だし、別々に考えるのが筋だと思いますが、
できるかもしれませんね。頑張って下さいね。
1.ソートをかける(qsort) 2.同じ文字列が連続しているものはその前の方に目印をつける(もしくは長さ0にする) 3.目印がついていない文字列をコピーしていく。 O(n log n + n + n)か・・・・・・ まあO(n^2)よりかはましか?
イメージ的には、以下の通り。 {1,1,2,3,5,4,6,7,8,9,10,4,5,6,1} 1.{1,1,1,2,3,4,4,5,5,6,6,7,8,9,10} 2.{_,_,1,2,3,_,4,_,5,_,6,7,8,9,10} 3.{1,2,3,4,5,6,7,8,9,10} あなたの宿題の手伝いにはなったでしょうか?
>>354 この問題、面白いですね…
#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;
}
ソート済みの配列a[n]に対して重複するものを削除 /* 重複するものにマーク */ for (x = a[0], i = 1; i < n; i++) { if (a[i] == x) マーク else x = a[i]; } /* 最初にマークされてるものを探す */ for (i = 0; i < n; i++) if (a[i] がマーク済み) break; if (i == n) 切り詰める必要なし処理終了; /* 切り詰める */ for (j = i+1; j < n; j++) { if (a[j] がマーク済み) { a[i++] = a[j]; a[j]をマーク } } こんな感じなのかなぁ・・・いや、なんかメンドクサソウ。
>>370 難しいですね。できません。こんな感じですか?
#include <string.h>
int what_day(const void *str) {
if(strcmp(p, "日") == 0){
return 0;
}else if(strcmp(p, "月") == 0){
return 1;
}else if(strcmp(p, "火") == 0){
/* 略 */
}else if(strcmp(p, "土") == 0){
retunr 6;
}}
int compare( const void *p, const void *q){
int i_p, i_q;
i_p = what_day(*p);
i_q = what_day(*q);
if(i_p - i_q < 0) {
return -1;
}else if(i_p - i_q > 0) {
return 1;
}else if(i_p - i_q = 0) {
;/* p か q かどちらか一方を削除 */
}}
あ、compareの下の方は }else if(i_p - i_q == 0) { ;/* p か q かどちらか一方を削除して、配列を詰める */ return 0; }} ですね。どちらにしろ未完ですが
いくらやっても無理ですが qsort関数では整列しか出来ないんですかね
そうです。qsort では整列しかできません。 曜日に限った話であれば、qsort 使わなくてもいいんじゃないですか?
>>370 >>380 まだ、ここに書いてから1時間じゃないか。
がんばれっ、ダイジョーブ。
慣れないことをするときは、時間がかかるものサ。
char から const char に型変換できませんか?
>>354 ビット操作版
int check(int x, int n) {
int f = 0, m = 1 << (n-1), y = 0, z = 0;
for (; m && x & m; m >>= 1) y++;
for (; m ; m >>= 1)
if (f && x & m || !f && !(x & m)) z++;
else {
if (z > y) return 0;
y = z;
z = 1;
f = f ? 0 : 1;
}
return y >= z;
}
int hoge(int n) {
int x, m = 0;
for (x = 1 << n; x-- > (1 << (n-1)); )
if (check(x, n)) m++;
return m;
}
>>370 メンドイから曜日に依存させちゃったけど、いい?
#include <stdio.h>
#include <string.h>
int lookup(const char *wstr) {
const char *db[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL };
int i;
for (i = 0; db[i] != NULL; i++) if (strcmp(wstr, db[i]) == 0) break;
return i;
}
int cmpfn(const void *v1, const void *v2) { return lookup(*(const char **)v1) - lookup(*(const char **)v2); }
main() {
char *wday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Mon" };
int one = sizeof(wday[0]); int num = sizeof(wday) / one;
int i, j;
int last = -1;
qsort(wday, num, one, cmpfn);
for(i = 0; i < num; i++){
j = lookup(wday[i]);
if (last != j) printf("%s\n", wday[i]);
last = j;
}
return 0;
}
削除というより無視か。
ああ、重複した文字列を削除なのね 勝手に「どっかに出力できればいい」とか思い込んでた…すまそ。
みなさんありがとうございました。 関数の再帰呼出しって頭が混乱してしまいますね。
んで、370は、今ナニが質問したいのだ?
>>370 の問題は終了?
再帰で考えること 1.どういう条件で再帰呼び出しするか 2.どういう条件で終了させるか 3.再帰呼び出しの前後でどういう処理をするか。 4.この再帰関数の呼び出し方 問題では、2が抜けているので理解しづらいがそれ以外は提示されている。 問題文を上の1,2,3,4に合わせて書き直してみれ。
392 :
デフォルトの名無しさん :03/11/29 18:52
>>391 おお、うまい説明!
あとは、再帰やるときは、必ず「終わる」ってことを説明しなきゃですねん。
ワシはよく忘れて、スタックがオーバーフローします。
>>392 前スレよか、まっとうな質問になりましたね。
こちらから、不明な点を挙げますので、お答えくださいね。そうしたら、だれか答えてくれるかも。
◆1つ目
<条件>
2、リスト構造にてデータを持つ(ファイルは3つ以上)
って、意味がわかりません。
◆2つ目
menuからiを選んだら、どーゆー風になるんですか?画面表示/入力の例を書いてください。
>>393 cmp関数の型が変だから、キャストが多くなっちゃうのよ。
>>150 を参照
その1,2はできましたので3を解いてください。おねがいします。
n分割したf=sinxをΣで和を求める事によって積分値を出すアゴリズムなんですが //p1~p2までn分割して積分する関数 double sum(double p1. double p2, int n){ double s = 0.0 double div =(p1 - p2) /n ; for(int i = 0; i <n; i++){ s += ( sin(p1 + div *i) * div + sin(p1 + div * (i+1))) / 2.0; return (s); //sin(x) double sin(double x) { return (sin(x)); } int main------------------------ てな感じなんですが エラが出ます どこが行けないんでしょうか
double s = 0.0; あとn=0の時の処理は大丈夫だよね。 再起が無限に・・・
399 :
名無しさん :03/11/29 21:20
xxxx年xx月xx日が何曜日か表示するプログラムを作りなさい
400 :
名無しさん :03/11/29 21:20
↑よろしくお願いしますm(__)m
>>399 「C言語によるアルゴリズム辞典」P287を参照せよ。
402 :
デフォルトの名無しさん :03/11/29 21:28
>>399 time()が返す値の範囲なら、mktimeを使えば得られる。
struct tm a={0,0,0,29,10,103};
char *w={"日","月","火","水","木","金"};
mktime(&a);
printf("2003/11/29は%s曜日です。\n",w[a.wday]);
char *wはchar *w[]の間違い
404 :
デフォルトの名無しさん :03/11/29 21:44
1. 文字列cを引数として受け取り、 中の要素を逆順に並べ替える関数をつくりなさい。 ただし、関数内部の操作はポインタで行うこと。 2. 2つの文字列型変数a,bを引数として渡したときに、 aの内容をbに複写する関数をポインタを用いてつくりなさい。 ただし、渡される配列はbのほうが大きいサイズでなくてはならない。 また、string.h内の複写関数strcpy()は使ってはならない。 お願いいたします。2はstrcpyを使えば簡単に出来るのですが・・・
>>404 これぐらいもできないの?と言ってはいけないでしょうか?
1のヒント
関数内で引数分の配列を用意する。
要素をすべてコピーする。
逆順に一つずつ代入する。
2のヒント
一つずつ要素をaの0番地をbの0番地へと入れていきましょう
>>399 サバンに聞け。もしくは後天的サバンになれ。
>>404 #include <algorithm>
void reverse(char* c)
{
int length = strlen(c);
std::reverse(c, c+length);
}
void copy(char* a, char* b)
{
int length = strlen(c);
std::copy(a, a+length, b);
}
>>404 そういや、言い忘れたけど
2のほうは
strcpyがだめなら
memset (b, a, strlen (a));
としてもいいでしょうね
>>406 ネタに混じれ酢しないでください。
ぐぐればでてくるんじゃないの?知らないけど
でぐぐったら一発でどちゅ~んと出てきましたので、
>>399 は自分でしらべなはれ
>>408 バカキタ━━━━━(゚∀゚)━━━━━!!
>>410 馬鹿だよな(ワラ
memcpy(b,a,strlen(a)+1);
こうだよ。
>>412 strlen(a)+1は意味がないだろ
せっかく memcpy (b, a, strlen (a)); なんだからそのまんまでいいだろといいたいわけだ
\0 \0 \0 \0 \0 \0 \0
つーか
>>407 のが思いっきり正解じゃん。
その後に間違い書き連ねてる香具師らはウンコ
>>417 んだな、どうでもいいこと口論すなって事だ。
>>416 の言いたいこともわからんでもないがな
>>419 本当に正解か?コンパイルエラーにならないか?
なんかうざいハエがいるな
>>421 #include <string.h>
位書かないでも分かるだろ。
405以外のレスは全てゴミに見えるが。
>一つずつ要素をaの0番地をbの0番地へと入れていきましょう これもゴミだろ。まともな日本語には見えない。
つーかどの回答でも404は怒られそうなヨカーン。
>>425 自分で 文字列c って提示してそりゃないよー
memcpy(b, a, strlen(a)); はヤバすぎ。なんでヤバイか分からない香具師はバカ丸出し。
>>428 「思いっきり正解じゃん」などと言い放つなら、一切のミスはするなと言いたいんだよ。
>>430 何がやばいんだい?
わからないから教えてください
>>433 もしかして、memcpyが末尾の\0までコピーするとか思っている?
あれは指定バイト数分コピーするだけだよ。strncpyのようにコピー元の\0の判別することもない。
>>404 str_reverse() の while(s < e) って比較はいいのかどうか…
#include <stdio.h>
void swap(char *s1, char *s2) { char t; t = *s1; *s1 = *s2; *s2 = t; }
char *str_reverse(char *in) {
char *s = in;
char *e = in+strlen(in)-1;
while(s < e) swap(s++, e--);
return in;
}
char* str_copy(const char *in, char *out) {
char *p = out;
while(*p++ = *in++);
return out;
}
main() {
char abc[] = "abc";
char ans[sizeof(abc)];
printf("%s\n", str_reverse(str_copy(abc, ans)));
return 0;
}
s/判別する/判別をする/
sizeof(abc)っていいの?
>>436 >末尾の\0はコピーしない
>指定バイトコピーする
>コピー元の\0を判別しない
んで memcpy (b, a, strlen (a)) がバカな理由は?
>>440 strcpyのように末尾の\0も複写しなければ、文字列を複写したとは言えない。
>>441 あぁ、やっとわかった。
bには\0が入らないわけか。
いままでありがとんです
というか、aの内容をコピーするわけだから、当然ながら\0もコピーしないと。
>>440 //これ以上馬鹿には付き合ってられないし、これ動かしてみたら?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
main()
{
char *a = "abc";
char *b = (char*) malloc(10);
memcpy (b, a, strlen (a));
puts(b);
}
>>445 Visual Studio で動かすとフフフフとか(ヘヘヘ?)言われそ
フフフフでもヘヘヘでもwwwでも無かった。
449 :
デフォルトの名無しさん :03/11/29 22:19
>>407 エラーになるのですが・・・
std::reverse(c, c+length);
はどういう処理なのですか?
>>448 多分フフフ(0xCC・・・)は初期化していない自動変数だけなんじゃないかな。
それもデバッグモードでビルドしたときだけ。
>>448 debugビルドだとその辺のどれかになるだろ
>>450 自動変数だけでしたか。なるほろ。
heap からとったメモリは何というんだろう・・・
本当にどうでもいいことなんだけど、445がmallocを使う意図が分からない。
>>449 エラーメッセージも書かない香具師は釣り
>>455 それなら尚更初期化しない配列を使いそうなんだけど、、、まいっか。
>>456 もしかしてmallocが初期化を行うと思っているのですか?
>>457 違う違う。
わざわざmallocを使うまでもなく配列で事足りるんだから・・・と。
calloc使えば大丈夫なのに、という話では。
>>407 エラー E2451 : 未定義のシンボル std(関数 reverse )
エラー E2379 : ステートメントにセミコロン(;)がない(関数 reverse )
462 :
デフォルトの名無しさん :03/11/29 23:33
すいません、横から失礼します 学校の課題でCによるプログラムを作ったのですが、どうにも「不正な浮動小数点演算」というエラーが出て実行できません。エラーの発生箇所はつきとめたのですが、何故エラーになるのかわかりません。どなたかエラーの原因がわかる方はいらっしゃるでしょうか? #include <stdio.h> #include <math.h> #define N 50 #define PI 3.14159265358979 double f(double); double xi(int); double fi(int); double li(int,double); double Ln(double); main(){double x,L,F;FILE *out;out=fopen("result.txt","w"); for(x=0;x<=1.0;x+0.1){L=Ln(x);F=f(x);fprintf(out,"%0.15f %0.15f %0.15f\n",L,F,L-F);} fclose(out); } double f(double x){return exp(-x)*cos(PI*x);} double xi(int i){return i/N;} double fi(int i){return f(xi(i));} double li(int i,double x){ int k;double temp1=1.0,temp2=1.0; for(k=0;k<=N;k++){if(k!=i)temp1*=x-xi(k);} for(k=0;k<=N;k++){if(k!=i)temp2*=xi(i)-xi(k);} return temp1/temp2; } double Ln(double x){ int i;double temp=0,L; for(i=0;i<=N;i++){ L=li(i,x); //ここでエラー発生 temp+=fi(i)*L; } return temp; }
>>462 >//ここでエラー発生
/*ここでエラー発生*/
ワロタ
不正な浮動小数点演算?
for(x=0;x<=1.0;x+0.1) これはどうなのかな?
最近「クマさんのAA教えてください」っていうあれはやってるな あのネタはたのしかった
471 :
デフォルトの名無しさん :03/11/30 00:21
#include<stdio.h> #include<string.h> #define MAXTTEXT_LENGTH 10000 #define MAXPATTERN_LENGTH 100 char text[MAXTTEXT_LENGTH]; char pattern[MAXPATTERN_LENGTH]; int plength, tlength,next[100]; void read_text(void); int matching_KMP(void); void compute_next(void); void main(){ read_text(); printf ("\npattern = "); while (scanf ("%s", pattern) != EOF){ plength = strlen (pattern); printf ("location= %d \n\n", matching_KMP()); printf ("pattern = "); } } void read_text(void){ FILE *fp; char filename[MAXPATTERN_LENGTH]; printf("Text file name => "); scanf ("%s",filename); fp = fopen (filename, "r"); fscanf (fp,"%s", text); tlength = strlen(text); } int matching_KMP(void){ int i=0, j=0; compute_next(); while ((j<plength)&&(i<tlength)){ if ((j==-1)||(text[i]==pattern[j])){ i++; j++; }else j=next[j]; } if(j<plength) return (-1); else return (i-plength+1); } void compute_next(void){ int i=1,j=0; next[0]=-1; while (i<plength){ if (pattern[j]==pattern[i]) next[i++]=next[j++]; else {next[i]=j; while((j>-1) && (pattern[j]!=pattern[i])) j=next[j]; ++i; ++j;} } } (p×q)の2次元文字配列テキストの中から、指定した(i×j)の2次元文字配列パターンを見つけるプログラムに拡張しなさい。 よろしくお願いしますm(__)m
助けて下さい…お願いします。 #include<stdio.h> void main(void) { int c; printf("構造を知りたい飽和鎖状炭化水素の炭素の数を入力して下さい。(1~5まで)\n"); scanf("%d",&c); switch(c) { case 1:printf("C = %d\H",c); break; } } これと、次に貼るソースを結合して、 次に貼るソースの結果が表示された後に このソースを動作させたいのですがよくわかりません。 どなたかお知恵を貸して下さい!
#include <stdio.h> #include <stdlib.h> #define C 10 #define L 100 int size[L], length[L], count[C + 1]; int main() { int i, j, k, h, len, n, si, sj, sk, sh,c; printf("炭素原子の数による単結合の構造異性対数\n"); n = size[0] = length[0] = 0; for (i = 0; i < L; i++) { len = length[i] + 1; if (len > C / 2) break; si = size[i] + 1; if (si + len > C) continue; for (j = 0; j <= i; j++) { sj = si + size[j]; if (sj + len > C) continue; for (k = 0; k <= j; k++) { sk = sj + size[k]; if (sk + len > C) continue; if (++n >= L) return EXIT_FAILURE; size[n] = sk; length[n] = len; } } }
exit(1)
if (len <= C / 2) return EXIT_FAILURE; for (i = 0; i <= n; i++) { si = size[i]; for (j = 0; j <= i; j++) { if (length[i] != length[j]) continue; sj = si + size[j]; if (sj > C) continue; count[sj]++; for (k = 0; k <= j; k++) { sk = sj + size[k] + 1; if (sk > C) continue; for (h = 0; h <= k; h++) { sh = sk + size[h]; if (sh <= C) count[sh]++; } } } } for (i = 1; i <= C; i++) printf(" 炭素原子が %2d 個の場合、構造異性体は%5d 種類\n", i, count[i]); return EXIT_SUCCESS; }
472,473,475のソースです。 どうかよろしくお願いします…。
>>472 やってることが間違ってないかどうかはわからんが、
>>475 の以下の部分
for (i = 1; i <= C; i++)
printf(" 炭素原子が %2d 個の場合、構造異性体は%5d 種類\n", i, count[i]);
を次のようにするってこと?
{
int c;
printf("構造を知りたい飽和鎖状炭化水素の炭素の数を入力して下さい。(1~5まで)\n");
scanf("%d",&c);
if (c >= 1 && c <= 5){
printf(" 炭素原子が %2d 個の場合、構造異性体は%5d 種類\n", i, count[i]);
}
}
>477 レスを見てちょこっといじったら目的のモノができました! 明日締め切りの必修の宿題なので本当に助かりました! どうもありがとうございます!
月曜日に向けて、未解決の課題が出てくるのであろうなぁ。
main() { int x; printf("%u\n",&x); return 0; } このソースprintfの引数の%uのいみてなんですか?
%u は符号なし整数(unsigned int)として10進数にフォーマットするです。 このソースの %u は間違った使い方だけどね。
>>481 プログラムが意味をなしてないので、%uについて考えるのは無駄。
オマエら、 ブラウザのアドレス欄に、ファイル名称を表示させない方法、 知らね~だろ。 大手サイト作ってる奴しか知らないワナ♪
JavaScriptだろどーせ。切ればおしまい。
どう間違ってるの?%dで表示しろってこと?
XMLでコントロールファイル作ればできるよ
49あぼーん
>オマエら、 >ブラウザのアドレス欄に、ファイル名称を表示させない方法、 >知らね~だろ。 >大手サイト作ってる奴しか知らないワナ 大手サイト作ってなくてもWebシステム作る上で常識
さらっと覗いてみたら何だこの厨っぷり。
↑おう、なんか番号まちがえとるです。すまん。
494 :
デフォルトの名無しさん :03/11/30 08:47
誤爆スマソ・・・
496 :
デフォルトの名無しさん :03/11/30 09:27
497 :
デフォルトの名無しさん :03/11/30 10:03
C++でstringからdoubleに変換するには普通どうするか教えてください つまり、 double d; string s = "3.1415"; dに3.1415を代入させてください
d = 3.1415;
普通どうするか・・・かC++の王道って、どうやって学べばよいのやら・・・識者のかたのフォローを願う。 俺の考え付く案。 (1) #include <stdio.h> sscanf(s.c_str(), "%lf", &d); (2) #include <sstream> std::istringstream in(str); in >> d; 普通どうするか・・ってのは、どーなんでしょーね。
それは宿題か?
>>497 無理せず C 的な解決法。
d = atof(s.c_str());
または
char *endp;
d = strtod(s.c_str(), &endp);
>502 Cなんか使わねーんだよ! 答える気がないなら来んなっつってんだろヴォケ
>>500 >>502 どうもありがとう
C++的にはistringstreamなんでしょうかね
C++でstdio.hをインクルードするのはカッコ悪いような気もしますが
使ってる人が多いならそれでいい気もしますね
宿題じゃないが、おもしろげな問題。 n個の整数からなる配列をできる限り低速にソートするアルゴリズムを設計して実装せよ。 フェアプレイの精神を忘れないように。 つまり、処理を進行させていればいずれは終了するアルゴリズムでなければならず、 時間稼ぎのループのようなインチキを働く実装であってはならない。 そのアルゴリズムの計算量をnの関数として表現せよ。
506 :
デフォルトの名無しさん :03/11/30 10:24
>>503 莫迦なのかネタなのか書いといてくれないと判らん。
508 :
デフォルトの名無しさん :03/11/30 10:31
>>502 ならstdio.hはいらないんだが。
atofもstrtodもstdlib.h(cstdlib)
>503 d = std::strtod(s.c_str(), 0); で無問題。
>>505 単純なソートならO(nの2乗)だな。
O(n!)ってアルゴリズムは考えついた。
a[0],a[1],...,a[n-1]の順列を1つ1つ生成し、それがソート済みであれば、処理を終了するっての。
>511 a[0] ~ a[n-1]までのなかからランダムにN取り出して 配列bを生成し、bの要素がaと一対一の対応であることを確認し、 かつ整列済みなら終了。これで、O(n^n)程度になるはず。
514 :
デフォルトの名無しさん :03/11/30 12:11
CでDLLファイル作りに挑戦してます。 作成したDLLをVisual BasicやExcel VBAで呼び出して使いたいと思ってます。 Cでの作成ツールは、Borland C++Compiler5.5にBCC Developerを使用してます。 とりあえずテストとして、2つの数値をDLLに渡し、その和を返す関数DTotal(a,b)を 作成してExcel VBAで呼びだしてみたのですが、「エントリDTotalがDLLファイル D:\・・・\Dll_try.dll内に 見つかりません」とのメッセージがでました。 Excel VBAでの呼び出し方に問題ないと思うので、Cでの作り方に問題があるようです。 int DTotal(int x,int y) { return(x + y); } 上のソースを作成してBCC Developerでの設定を、Dynamic Link Library(-WD)に、 呼び出し規約をstdcall(-ps)にしてコンパイルしたのですが、それだけでは不十分でしょうか。 BCC Developerでの設定でなく、何かソースに追加すべきものがあるような気がしますが、 どうすればDLLが作れるか誰か教えてください。 なお、Dll_try.dllのDll_tryはBCC Developerで作成したプロジェクト名です。
__declspec(dllexport) int WINAPI DTotal(int x,int y)
初めてここに来ます。C言語の超ウルトラ初心者です・・・。 で、質問なんですが、 「変数(?)の一番大きい物を見つけてそれを表示しろ」 というものなんです。 ちょっと前までの課題では、数が変数(?)の数が2~3個しかなかったので、if文を使っていたのですが、 今回は前の授業で一時限配列を二次元配列を学習したため、変数(?)の数が多くてどうすればいいか分かりません。 直感的にa[i][j]とかが入ったif文をfor文で繰り返すのだろう、と考えたのですがよく分かりません。 正直かなり恥ずかしい質問だと思いますがよろしくお願いします。
初心者なんて名乗らなくていいから、次の質問に答えてください。 探す配列要素は int 型? 探す配列は何次元配列?
こんな雰囲気で int a[M][N]; int max = a[0][0]; for( i = 0; i < M; i++ ) { for( j = 0; j < N; j++ ) { if( max < a[i][j] ) { max = a[i][j]; } } } printf( "max:%d\n", max );
>>519 >直感的にa[i][j]とかが入ったif文をfor文で繰り返すのだろう
そこまで分かっていて何が分からなかったのか? 後学のた
めに知りたいね。
釣
>>520 とりあえず今回はint型、1次元です。
でも下のレスで解決したようです。すみません。
>>521 な、なるほど。回答ありがとうございます。
おつかれ 初心者って言うと嫌われるから気をつけな
526 :
名無しさん :03/11/30 15:21
乱数の個数と、乱数の最大値・最小値を入力して その個数と範囲の乱数を出力するプログラムなのですが #include <stdio.h> #include <stdlib.h> #include <time.h> main() { int i,num,min,max,rand; srand((unsigned)time(NULL)); printf("発生させる乱数の個数は?");scanf("%d",&num); do{ printf("乱数の最小値は?(≧0)");scanf("%d",&min); }while(min<0); do{ printf("最大値は?(≧%d)",min);scanf("%d",&max); }while(max<min); for(i=0; i <num; i++){ do{rand=rand() %max}while(rand<min); printf("%d",rand); } } これでエラーが出てしまいます・…わかる方いませんか?
どういうエラーが出るかわかる?
randって変数は作ってはいけません rand_numなどに変えましょう
if (max < a[i]) max = a[i]; と書くのと、 if (a[i] > max) max = a[i]; と書くの、どっちがオススメでしょうか。
530 :
名無しさん :03/11/30 15:24
エラー:adfjkg:13行目:関数指名子か関数へのポインタでないオブジェクトには 関数呼び出し演算子はつけられません。 って出ます…
>>529 好きなようにするといいよ。
ただ見る人が max と a[i] をどちらを主軸としてみるかが変わりますね
>>526 >>528 が正解のようだす。
以下、突っ込みだが。
do{rand=rand() %max}while(rand<min);
そこはかとなく、えらーっぽい。
・・・+1したとしても、このdo-whileが何回で終了するかは、確立の神様しかわからないよーな。
533 :
名無しさん :03/11/30 15:29
>>526 変数名を変えたら一応動きましたが、
443の入力した個数しか出力しません…
度々すいませんが、どこがおかしいのでしょうか?お願いしますm(_ _)m
>>533 修正後のプログラム&入力値&出力結果をみせて。
エスパーさんじゃないと、わかんないよ。
すんごく努力すれば、推測ぐらいはできるけれど、そういったものを見せるのは質問者の義務。
537 :
名無しさん :03/11/30 15:38
#include <stdio.h> #include <stdlib.h> #include <time.h> main() { int i,num,min,max,random=0; srand((unsigned)time(NULL)); printf("発生させる乱数の個数は?");scanf("%d",&num); do{printf("乱数の最小値は?(≧0)");scanf("%d",&min);}while(min<0); do{printf("最大値は?(≧%d)",min);scanf("%d",&max);}while(max<min); for(i=0; i <num; i++){ random=rand()%max; printf("%d\n",rand); } } 出力結果 発生させる乱数の個数は?5 乱数の最小値は?(≧0)12 最大値は?(≧12)165 441 441 441 441 441 です・・・
538 :
名無しさん :03/11/30 15:40
random=rand()%max; →do{ random=rand()%max; } while(random<min) です
printf("%d\n",rand); ... 441 printf("%d\n",rand); ... 441 printf("%d\n",rand); ... 441 printf("%d\n",rand); ... 441 printf("%d\n",rand); ... 441
540 :
デフォルトの名無しさん :03/11/30 15:41
C言語の初心者ですが、特に質問はありません
>>537 printf("%d\n",rand);
↓
printf("%d\n",random);
542 :
名無しさん :03/11/30 15:43
>>541 あ・・…そこでしたか…気づかなかった
吊ってきます
>>542 つって来いよ。 自分でいったんだからな
まー、吊る前にminの存在も無視しないでほしいものだ
まあ、その辺は自力でできるかと(^^;;<randomの式
546 :
デフォルトの名無しさん :03/11/30 15:49
547 :
デフォルトの名無しさん :03/11/30 15:50
cで、フルスピードで計算せずに、少し間を置いてから処理結果を出すように したいのですが、どうしたらいいでしょうか? 例えば、 #include <stdio.h> main(){ int i = 1; while(i <= 100){ printf("%d\n",i++); } return; } で、処理の結果を1秒ごとに出していくようにしたい場合は、どのように したらいいでしょうか?
sleep
↑環境はBoland C++ 5.5 のコンパイラを使っています。
早速ありがとうございました。 このあとは検索を串してがんがります。
#include <windows.h> sleep(1000);
C言語の初心者です。お願いします。
>>546 頑張っているのはわかるけど、日本語が分からないよぉ。
>聞いてみたら、データーは別ファイルに格納すると言われました。
>自分もなに言われているか良く分からないので、作り方はお任せします
...
>入出力はキーボードとディスプレイのみ。
>ファイルの保存とかそういうのは無しで。
>>552 >C言語の初心者です。お願いします。
だから何を?(w
エスパーさんになってみる。 <条件> 1、分割コンパイル 2、リスト構造にてデータを持つ(ファイルは3つ以上) ↓ <条件> 1、分割コンパイル(まあ、これはわかる) 2a、データはリスト構造で扱う、別モジュール(別ファイル)にすること(これで、listdata.hとlistdata.cの2つ) 2b、main()やメニュー部で1つのファイルを作ること(main.cの1つ) んで、計3つのファイルで分割コンパイルせよとゆーことだろうか。 というか、質問者も内容を理解してない状態で聞かないよーに(^^;; 実生活でさんざんエスパーさんやらされてるんで、ここでは楽させて・・・お願い、ぷりーづ。
>>556 データファイルがなぜか3つだと思い込んでた・・・
そう読むのが普通だYO!
>>557 すごーく、想像力はらかせました。
実生活でも、こういうことを求められるのです・・・
実生活では、「わからない」って答えると怒鳴られるです(;_;)
これからも初心者を応援してくださいね。(^^)
C++で立方体を表示するプログラムを教えてください
>>407 をコンパイルしたら、
エラー E2451 : 未定義のシンボル std(関数 reverse )
エラー E2379 : ステートメントにセミコロン(;)がない(関数 reverse )
ってエラーがでてきました。
std::reverse(c, c+length); って、どういう処理をするのですか?
564 :
デフォルトの名無しさん :03/11/30 20:37
514です。 517さん、518さん、ありがとうございました。 うまくExcel VBAで呼び出すことができました。 ささいなことですが、大変感激してます。 DLLの作り方を検索してみましたが、当方C++はあまりよく分からず、CでしかもVC++でなくBorland C++Compiler5.5にBCC Developerで作る方法を知りたいと 思って探したのですが、見つからず、しかも、defファイルやらexternするやら、 ソースに_ _stdcall入れてあったりでよく分かりませんでした。 そこで、勘で当てずっぽうにソースの前に #include <windows.h> __declspec(dllexport) int WINAPI DTotal(int x,int y) を追加して、 #include <windows.h> __declspec(dllexport) int WINAPI DTotal(int x,int y) int DTotal(int x,int y) { return(x + y); } として、DLLを作成して、エクセルマクロで呼びだすと、うまく呼べました。 DEFファイルやLIBファイルとかなくてもOKなんですね。 ソースに_ _stdcallを記述しなくてもよいんですね。 もっともコンパイル設定をstdcall(-ps)としたんですが。 まだまだ意味が分からないので、今後とも宜しくご教授お願いします。
>>561 ・AAで書け。
・OpenGLを学べ。
・Direct Xを学べ。
・MFC + 座標変換計算ルーチンを作れ
というかそういう環境依存の宿題は、
・OS
・コンパイラ
・使用するライブラリの制限の有無
を書いておくと解答しやすい。
566 :
デフォルトの名無しさん :03/11/30 21:56
「文字列a,b,cを引数として受け取り、aに文字列bが含まれている場合、 bの文字列の部分をcに置き換える関数を作成せよ。 ただし、bとcの長さは常に同じであると想定すること。」 おねげぇしますだ。
568 :
デフォルトの名無しさん :03/11/30 22:01
>>566 全て交換できるようにしないといけないと思います。
569 :
デフォルトの名無しさん :03/11/30 22:02
すいません、マクロを用いることなど、その他のことが分からないんですが、 教えていただけないでしょうか? 簡単な成績処理プログラムを作成する。この成績処理プログラムは単一科目が対象とし、 科目受講生の氏名とその得点を所持するものとする。 main関数において10人分の名前と点数を入力として受け付けて平均点を求めよ。 受講生の名前と点数はそれぞれ配列を用いて保持し、それらの配列にデータを追加するための 関数addと、平均点を求める関数averageを作成せよ。 addは5引数で、名前の配列、得点の配列、追加する名前、追加する得点、名前および得点の 配列に追加する位置(添え字)を引数とするものとする。 averageは2引数で、得点の配列と受講生数を引数とするものとする。 ただし、入力として受け付ける受講生の数はマクロを用いて定義し、このマクロの定義を変更すれば 最大100人まで対応可能なようにすること。 入力として受け付ける名前は空白のない(つまりscanfで入力を受け付けることが出来る)ものとし、 得点は0点から100点の間を整数値で入力されるものとする。 関数は全て関数プロトタイプ宣言をすること。
571 :
デフォルトの名無しさん :03/11/30 22:08
>>568 そう・・・じゃあこれで。
テストしていないのでダメかも。
#include <string.h>
int strreplace(char *a,const char *b,const char *c)
{
size_t len=strlen(b);
if(strlen(c)!=len)
return 1;
for(;str=strstr(str,b);str+=len)
memcpy(str,c,len);
return 0;
}
マクロの定義: #define のことだと思われ。 #define NINZU 10
なるほど。 ではaddとaverageの関数も教えて頂けないでしょうか?
574 :
デフォルトの名無しさん :03/11/30 22:32
add(char name int ten char addname int addten){ }
575 :
デフォルトの名無しさん :03/11/30 22:40
>>556 多分そのとうりですスイマセン手間かけまして(;´Д`)
add(char name int ten char addname int addten){ add(name, ten, addname, addten); }
577 :
C言語をやろうとしてる人 :03/12/01 00:31
いきなりすいません。ど素人です。。 LinuxでCをコンパイルするにはどうしたらよいのですか?? gcc ~.c とすると bash: gcc: command not found とでちゃいます。
すいませんが初心者です。お願いします。
スマン。ちゃんとmain.cでlist.hをインクルードしてくれ。 一体化したものでしかテストランしてないのがバレバレだな・・・
583 :
デフォルトの名無しさん :03/12/01 01:31
K&Rの参考書にあったプログラムなんですが EOFを入力したら終了って何を入力すればいいんですか? #include <stdio.h> #define IN 1 #define OUT 0 main() { int c, nl, nw, nc, state; state = OUT; nl = nw = nc =0; while ((c = getchar()) != EOF){ ++nc; if (c == '\n') ++nl; if (c == ' ' || c == '\n' || c == '\t') state = OUT; else if (state == OUT) { state = IN; ++nw; } } printf("%d %d %d\n", nl, nw, nc); }
Windows系は CTRL+Z UNIX系は CTRL+D かな?
>>584 ありがとうございます。
WINのVC++6.0だったんですがCTR+zのあとに
リターンで終了できました。
>>574 >>576 おまいら不親切だな (w
>>573 void add(char* namelist[], int scorelist[], char* name, int score, int index)
{
strcpy(namelist[index], name);
scorelist[index] = score;
return;
}
double average(int scorelist[], int num)
{
int sum = 0;
while(num)
sum += scorelist[--num];
return (double)sum / num;
}
587 :
デフォルトの名無しさん :03/12/01 02:30
2次方程式の解を求めるプログラムで 2つの実数の差の絶対値をとりそれが十分小さければ2つの実数は 同じ値である というのはどこで関係するのですか? 求めてでてきた解が2個でその解が近ければ同じということでしょうか?
アホなミスを犯してしまった…。 double average(int scorelist[], int num) { int i, sum = 0; for(i = 0; i < num; i++) sum += scorelist[i]; return (double)sum / num; }
>>587 重解かどうか調べるなら、判別式の値を調べると思うが…。
>>587 重解 ってのだっけ。 答えが一個しかないやつ。
その場合のことじゃない?
変な時間に起きちゃった。
ツッコミ。
>>580 おつかれさま。
質問する人は、
毎日書き込み&質問を言われたとおり修正するくらい努力家さんだから
ここまででOKなんじゃないかなぁ。
とゆーことで。
>>575 完成させて、皆にみせるよーに。
>>587 問題文の全文(ヒントも入れて)を書いてみて・・・あなたの質問はその上でされてるものだから。
>>593 問題はただの2次方程式の解を求めるプログラムをつくれというだけです。
そしてヒントで
実数の比較では=を使うことができない。倍精度では15桁程度の精
度しかないためである。それより厳密には=は成立しない。その場合、
2つの実数の差の絶対値をとりそれが十分ちいさければ等しい。
>>592 y=f(x) で、f(x)=a(x-b)^2+c な放物線の頂点を通るように(y=c)
スパッと真横に切ったとき、 x の値はひとつだろ。
>>594 「実数の差の絶対値を…」のところは、実数の比較の一般的な場合のことを言っているだけで、
2次方程式の解を求めるだけなら、判別式の値が十分小さいか調べるだけでいいと思うぞ。
あ、 "判別式の値" と "0" の差の絶対値ってことかな?
>>595 それは重解ということですよね?
>>596 おお!!そういうことか!!
つまり判別式Dにおいて場合わけをするときに0にちかければD=0と
いうことですね?しかしそんな場合わけの方法なんて知りませんw
できればヒントをお願いします・・・
>>594 >>598 いや。それは作ってと同じになっちゃうな。
どういうことか答えるのに、結局ほとんどやらんとイカン・・・ってタイプの質問。
a * x * x + b * x + c == 0 の解を求めよ。
プログラム概要・・・どこで「==」を使うかのチェック
。
if (a == 0) { /* ★ここで「==」をつかう */
/* b * x + c == 0 を解く bが0の時は不定★ここでb==0をしらべるのも、含まれるか? */
終わり。
}
d = b * b - 4 * a * c; /* 判別式 */
if (d == 0) { {/* ★ここで「==」をつかう */
/* 重解(解が1つのことね) */
} else if (d > 0) {
/* 実数解 */
} else {
/* 虚数解 */
}
ってことで。
>>598 if( fabs( 判別式D ) < 十分小さい正の実数 )
重解ですよ。;
みたいな感じか?
なんとなくですが・・ かなり小さな数をeとして D≦0+eかつD≧0-eならばDは0とみなすみたいなプログラムをつくれば いいのでしょうか? しかしながらeはどのような数にすればいいのか・・・
>>601 それは実数部が15桁というところがヒントになるんだろうな・・・
>>601 eをどのくらいにするかという話になれば結構面倒なんだが、
実用的には e = 0.00000001 みたいに適当に決めたんでいいと思うよ。
おお!! なんとなくみえてきました!! 600さんのように絶対値をつかって eを10の-15乗 にすればよいのでしょうか?または16乗?
のーみそ使えや・・・>605
あー、なんかつまんなくなってきた。
>>605 そうすると、a, b, c が 10の10乗みたいな大きな数になってくると
うまく機能しなくなる。
まあとりあえず
>>604 で桶。
数値演算での常識。
ほぼ同じ値の差をとると、有効桁が減る。
1.23456 - 1.23455 → 0.00001 ホラ、凄く精度が落ちましたネ。
>>608 さん、さすが。
みなさんありがとうございました!! 残りは自分でやってみたいと思います
はい、おつかれさま。完成したら、見せてね。
もしすごくこだわるのなら、 e = DBL_EPSILON * ( fabs(b*b) + fabs(4*a*c) ); というように汁。 float なら FLT_EPSILON に。どちらも float.h で定義されている。
いや、なんかこれでは良くないような気がしてきた…。 e = 2 * DBL_EPSILON * ( fabs(b*b) + fabs(4*a*c) ); とでもしとくか…。誰か偉い人教えて。 というか、こんなこと気にしていたらキリがないんだけどな…。
昔、フォートランの偉いプログラムを見たら、許容誤差はきめ打ちだった。 求める範囲と有効桁がきまってるときは、OKなんだと。 決まってないときは、プログラムの設計がわるいそうだ。
#include<stdio.h> #include<stdlib.h> #include<time.h> main(){ int j; srand(time(NULL)); for( j = 0; j < 10; j++){ printf("出目は%dです。\n", j+1, rand()%6+1); } } 1. 上記のプログラムを活用して、プレイヤー側に「yes」か「no」でサイコロを振らせ、CPU側にも振らせる。 結果を表示して勝ち負けを判定するプログラムを作れ。 2. 下記の要素を用いてジャンケンゲームを作る。 コンピュータ側のグー、チョキ、パーを乱数で決める。 ユーザーの手はメニューから選ばせてswitch文で分岐処理する。 勝敗結果の表示。
617 :
デフォルトの名無しさん :03/12/01 15:21
線形探索および2分探索を関数として作成せよ。 プログラムは1である必要はなく、それぞれの関数に対して1つづ実験を行えばよい。
>>617 問題文、それだけ?
解答の幅がありすぎて解けない。
そっちにあわせて、プログラムみんでみるから、
あながが習った配列のデータを処理するプログラムを見せて。
例えば、最小値を見つけるだとか、合計値を求めるとか、
そんなプログラムを習ってると思うんだけれど。
619 :
デフォルトの名無しさん :03/12/01 16:19
>>617 二分探索
#include <stddef.h>
void *mybsearch(const void *key,const void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void *))
{
const unsigned char *left,*middle,*right;
int result;
left=(const unsigned char *)base;
right=left+(nmemb*size-size);
while(left<=right){
middle=left+((right-left)/size/2*size);
result=(*compar)(key,middle);
if(result==0)
return (void *)key;
else if(result<0)
right=middle-size;
else
left=middle+size;
}
return NULL;
}
>>619 マヂですね(^^;;
次は、myqsort()を非再帰&異常な振る舞いをしないよーなのでたのんます。
621 :
デフォルトの名無しさん :03/12/01 16:26
>>617 線形探索
#include <stddef.h>
void *lsearch(const void *key,const void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void *))
{
const unsigned char *pbase=base;
for(;nmemb--;pbase+=size)
if(!(*compar)(key,pbase))
return (void *)pbase;
return NULL;
}
622 :
デフォルトの名無しさん :03/12/01 16:27
>>620 非再帰バージョンは過去作ったものの中にはないや。
いやぁ。ひさびさで、ハッとするプログラムみせてもらいました。
624 :
デフォルトの名無しさん :03/12/01 17:43
double max=0, min=0; //最大値と最小値を計算する for (CI iter = table.begin(); iter < table.end(); ++iter) { if (max < (*iter).score) max = (*iter).score; else if (min>(*iter).score) min = (*iter).score; } ファイルを読み込んで最小値と最大値を出力するプログラムですが、うまくいきません。 このプログラムで最大値は、出るのですが、最小値が出ません。 実行すると、 最大値:12.3689 最小値:0 となります。 本当なら、 最大値:12.3689 最小値:6.5698 としたいのですが、どのようにしたら良いのでしょうか?
>>624 答える気力もなくなるな・・・
min = 9999999
とでもしてみたら?
626 :
デフォルトの名無しさん :03/12/01 17:52
>>625 あっそうだ。
そういう方法もあったんですね。
すみませんでした。
>>626 そういう方法ってか、ほかにあるのかよ?
628 :
デフォルトの名無しさん :03/12/01 17:58
∫(0から1まで)xの0.23乗dxの計算をプログラムの方法わかりませんか?
>>627 一つ目の要素を min とする。
まあ、普通はどう考えてもこっちだが。
630 :
デフォルトの名無しさん :03/12/01 18:21
∫のプログラムだけでも・・・おちえて。
>>630 ぐぐれ。一通り調べるまで帰ってくるな。
それをいったら2chの意味がないべ
>>629 とてもありがとう、勉強なった。つかそれぐらい思いつかない俺はやばいっぺ
#include <math.h> double hoge(void) { const double dx = 0.001; double x, s = 0.0; for (x = 0.0; x <= 1.0; x += dx) s += pow(x, 0.23); return s * dx; }
636 :
デフォルトの名無しさん :03/12/01 19:15
サブセットという言葉を上手く伝えられるコードください。
printf("さぶせっと");
とっても長い文字列を表示するサンプルください。
printf ("とっても長い文字列");
クスクス ( ・∀・) ジサクジエンデシタ ( ∩∩) (・∀・ )  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
>>640 もちっとひねって、
printf("smiles\n");
とかして欲しかった。
>>642 え~・・・どういう意味なの?
>642 なっ、なんてこった!! sとsの間が1マイルも離れてるじゃないかっ!
645 :
デフォルトの名無しさん :03/12/01 22:18
くだらねー 晒しあげだ
初心者ですが、教えてください。
初心者ですが、教えてください。
英和とか英英にも載っているよね。smilesのネタって。
650 :
デフォルトの名無しさん :03/12/01 23:04
六百五十番、malloc/free します。 こんな感じで間違ってないですよね? #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { double *ddata; int i; ddata=malloc(sizeof(double)*10); for(i=0;i<10;i++){ *(ddata+i)=sqrt(i); printf("ddata[%d]:%1.10f\n",i,*(ddata+i)); } free(ddata); return 0; }
OKです
652 :
デフォルトの名無しさん :03/12/01 23:13
653 :
デフォルトの名無しさん :03/12/01 23:50
それくらいのことに再帰なんか使うなよ。
>>652 ちなみにこの考え方は
1、2、3、・・・、1000
↓ ↓
1 2、3、・・・、1000
↓
1000、・・・、3、2
↓
1000、999、・・・、3、2、1
みたいなんですけど・・・。
655 :
デフォルトの名無しさん :03/12/01 23:55
ばっさり書き換えてはいけないんだろうか・・・
1 2、3、・・・、1000 ↓ 1000、・・・、3、2 飛びすぎちゃうか?
>>655 穴埋め方式で出されたので・・・。
反転させるとかシフトさせるとか頭では分かっていてもさっぱりです・・・。
良いこと思いついたぞー 名前忘れたけどバッファリングとやらを用意して、逆に呼んでいけば良いんだな
659 :
デフォルトの名無しさん :03/12/02 00:02
>>657 問題を作った奴は頭がどうかしているね。
void なのに値を返しているよ。
>>656 その矢印でreverseの再帰呼び出し使うらしいんですけど・・・。
なぜ void が返り値を?
if( a[e] == tmp)reverse(a, s + 1, tmp ); return としたいんだろうな
まず reverse(a, s, e); を先に呼び出してる時点で一生続くとわかるな
>>659 >>661 あ、そこたぶんintですよね?それで考えてもらって構いません。
たぶん間違い?だと思います。
バグコードやん・・・ こんなソース書いた人のレベルがわかるな… スパゲッチじゃないけど、ここまでややこしく作る必要ないっぺ あと tmp はまだ値が入ってないから参照するとばぐるっつーの
>>664 そのソース書いたのは教授か?
たぶん課題だと思うが。
その教授の言うことを間に受けるなよ!
信じちゃだめだ!
どこまでが出題者のコードか分からないけど、こういう問題で再起を 使わせるのはどうかね。効率があがるわけではなく、ソースがスッキ リするわけでもなく、可読性が良くなるわけでもない。 再起に相応しい例で出題するべきだな。
>>665 えっ?てことはこれちゃんとしてもコンパイルしないってことですよね・・・。
じゃあせめて配列の反転と左に1つシフトってどうやればいいか教えて欲しいんですけど・・・。
>>666 その先生の講義落ちる人多くて教室いつも満杯です。
挙句の果てには満杯すぎて再履修の人は講義受けないでテストに賭けてくれって言われた人もいました・・・。
「立つんだジョー!!」ってか?<再起
再帰といえばハノイ
再帰使うならこんな感じ? 本当はループで十分なものなんだけど。 void reverse(int *a,int s) /* sは配列の要素数 */ { int tmp; if(s<=1) return ; s--; tmp=a[0]; a[0]=a[s]; a[s]=tmp; reverse(a+1,s-1); }
おい、その教授晒しとけ。
再帰といえばクイックソート
教授がそんなんだから真面目にやればやるほど落とされる。
再帰と言えばitoa()
>>671 ありがとうございます。参考にさせていただきます。
>>672 >>674 しかもその講義必修です。
(´・ω・`) もう…だめぽ…
(´・ω・:;.:. もう…
(´・ :::;.... .も…
(.....:.:;.. ..... …
677 :
デフォルトの名無しさん :03/12/02 00:42
構造隊配列の関数への受け渡し方法と、飛んだ関数での参照の仕方を 教えてください。 struct complex { float r; float i; }; struct complex c[8]; このc[8]の配列を引数としてfunc(c)と渡したら、関数先でc[i].rという風に 参照すると変になった。。。
678 :
デフォルトの名無しさん :03/12/02 00:44
>>677 c[i]->rを使ってくださいですですです。。。
何を言っているんだ俺は。
680 :
デフォルトの名無しさん :03/12/02 01:00
1~100までの和、奇数和、偶数和をループは一回で同時に求めるプログラムを出されたんですけど ご教授願います.
do{ a=5050; b=2550; c=2500; }while(0);
>>681 迅速な回答ありがとうございます。
これで安心して眠れます。
つまんね
ええええw
void hoge(struct complex *c){ printf("%f, %f\n", c[0].i, c[5].i); printf("%f, %f\n", c->r, (c+5)->r); } int main(void){ struct complex c[8]; c[0].r = 12.4; c[0].i = 13.6; c[5].r = 45.2; c[5].i = 34.5; hoge(c); }
「時間1(H1:M1:S1)から時間2(H2:M2:S2)までの差の時間を出す」プログラムが必要なんですが if (s2-s1>=0) {s=s2-s1||x=m2}; else {s=s2-s1+60||x=m2-1} if (x-m1>=0) {m=x-m1||y=h2}; else {m=x-m1+60||y=h2-1} {h=y-h1}; こんなんで良いんでしょうか・・・。 ご教授願います。
void reverse(int a[], int s, int e) { int tmp; /* if(s == e){ if( a[e] == tmp)return reverse(a, s + 1, tmp );else return 0; } reverse(a, s, e); */ /*tmp=a[s]でa[s]を一回退避させる。 reverse(a, s+1, e)により、配列aのs+1とe間を反転させる。 これを左に1つシフトさせ、a[e]にtmpを入れればよい.*/ if (s == e) return; tmp = a[s]; reverse(a, s+1, e) for(; s < e; s++) a[s] = a[s+1]; a[e] = tmp; }
for(i=1;i<=100;i++){ a+=i; if(i%2)b+=i; else c+=i; } ループ1回の意味が・・・
>>686 ||で繋ぐなんて器用なことしないで普通に;で繋げばいいんでない?
ま、普通は一時変数使わずに書くけど。
>>668 反応遅いが
教授の講義が満席なのは、やりたいからではなく
”その教授”以外いないのでは?と疑いたい。
再起がうまいんだが、こんな単純なミスを犯すのは良くない。
犯されたほうは満足されないぞ
反復をそれぞれ三回に分けて使用せずに一回のみのしようで結果を出せと・・・・。
こんなもんかな。 void diff(int h1, int m1, int s1, int h2, int m2, int s2) { int s3 = s2 - s1; if (s3 < 0) { s3 += 60; --m2; } int m3 = m2 - m1; if (m3 < 0) { m3 += 60; --h2; } int h3 = h2 - h1; printf("%02d:%02:%02d\n", h3, m3, s3); }
有難う! 参考にして四苦八苦してみます♪
694 :
デフォルトの名無しさん :03/12/02 01:40
h2*3600+m2*60+s2-(h1*3600+m1*60+s1)
>694 すいません、何か変な条件があって、全部秒に直すと怒られるんですw ありがと☆
>>688 1回のループはプログラム中に
ループが1つという意味なのか?
それなら俺ならこんな風にするが
int sum[2] = { 0. 0 };
for(i=1;i<=100;++i)
sum[i%2] += i;
}
printf("偶数和=%d, 奇数和=%d, 総和=%d",sum[0],sum[1],sum[0]+sum[1]);
最初てっきり
総和=偶数和+奇数和
偶数和=奇数和+要素数/2(奇数始まり偶数終わりの場合)
を用いて解くのかと思った。
・・・これじゃ数学の問題になってしまうか。
>>694 (h2-h1)*3600 + (m2-m1)*60 + (s2-s1)
さんしょううお
>>694 さん
あ、どうもです。
#include<stdo.h>
main()
{
int i,sum[2]={0,0};
for(i=1;i<=100;++i){
sum[i%2]+=i;
}
printf("偶数和=%d, 奇数和=%d, 総和=%d",sum[0],sum[1],sum[0]+sum[1]);
でやったんですが、総和がどうしてもうまく出ません。間違い等指摘していただけると幸いです。
<stdo.h> きっとこいつのせいだよw
Σ(゜Д゜;) <stdio.h>です。ごめんなさいw
>>699 本当に何が問題なのかわからん。
実行結果をちゃんと書いてくれ。
↓で何も問題はなかったが?
#include <stdio.h>
#define MOD2(x) ((x)%2)
//#define MOD2(x) ((x)&1) // fast version
int main()
{
const int start = 1, end = 100;
int sum[2] = { 0, 0 };
int i;
for(i=start;i<=end;++i)
sum[MOD2(i)] += i;
printf("%d,%d,%d\n",sum[0],sum[1],sum[0]+sum[1]);
return 0;
}
偶数和=2550, 奇数和=2500, 総和=5050 ってでるけど。
699のでやったら 偶数=2550 奇数=2500、総和=2550と出てきました
ありゃ、うちでは 偶数和=2550, 奇数和=2500, 総和=5050とでるけど <stdo.h>を直して}が一個足りないから付け足したんだけど。
最後の表示の時+でなく;にしてました。本当にどうもです。
>>687 キタ━━━( ´∀`)・ω・) ゚Д゚)゚∀゚)・∀・) ̄ー ̄)´_ゝ`)-_)゚∋゚)´Д`)゚ー゚)━━━!!!!
ありがとうございます。
>>690 確かにそうですね。そのせいで"選ぶ"ということができないのでつらいです・・・。
708 :
デフォルトの名無しさん :03/12/02 04:22
初心者ですのでよろしくお願いします。
あきた
710 :
デフォルトの名無しさん :03/12/02 07:06
先日、514で助言を頂いたものです。 次は2数をSWAPするDLLを下のように作ってみましたがうまくいきません。 bは、1となりますが、aは、違った数値(-4232)が表示されました。 どうすればうまくいくか、ご教示ください。 Cの書物では、Cの呼び出しは、swap(&a,&b)と&がついてます。 それに対応する部分のエクセルマクロ側の記述に問題があるような気がします。 呼びだされ側:C DLL #include <windows.h> __declspec(dllexport) void WINAPI Dswap(int *x,int *y); void Dswap(int *x,int *y) { int temp; temp = *x; *x = *y; *y = temp; } 呼び出し側:Excelマクロ Declare Sub Dswap Lib "Dll_try2.dll" (ByRef a As Integer, ByRef b As Integer) Sub DLLテスト() Dim a As Integer: Dim b As Integer a = 1: b = 5 Call Dswap(a, b) MsgBox "a= " & a & vbCrLf & "b= " & b End Sub
711 :
デフォルトの名無しさん :03/12/02 07:07
まあアホは↑なんだが。
gcc先生曰く $ gcc -Wall void.c -o void void.c:3: 警告: `main' の戻り値の型が `int' ではありません void.c: 関数 `main' 内: void.c:6: 警告: 戻り型が void の関数で、`return' に値があります void.c: 関数 `Void' 内: void.c:10: 警告: 戻り型が void の関数で、`return' に値があります 1 #include <stdio.h> 2 3 void main(void){ 4 void Void(void); 5 Void(); 6 return 0; 7 } 8 9 void Void(){ 10 return 0; 11 }
>>713 せっかくの新レスなのに なんで今まで放置されてたかわかったよ・・・ void mainを int mainへ void Voidを int Voidへ変えましょう
716 :
デフォルトの名無しさん :03/12/02 10:57
717 :
デフォルトの名無しさん :03/12/02 11:02
>>711 はいつも警告を無視して深刻なバグを生んでいるんだろうな。
教授の名前マダー?チンチン
今getchar()を使って入力された文字を判定してるんですが エンターキーが認識されて二つ目の入力が自動的にエンター('\n')になってしまいます forで回して'\n'だったら'\0'に変換する処理もやってみたのですが 結果はおなじでした どなたかお助けを・・・
abcdって入力すると abcd\n\nになるって事でいいのかな
722 :
デフォルトの名無しさん :03/12/02 12:48
>>719 一行読みとって先頭の一文字だけ抜き出せ。
>>722 じゃないが
一行読み込む場合、
gets(buf)はオーバーフローが防げないんで
#define BUFMAX 2
char buf[BUFMAX]
fgets(buf,BUFMAX,stdin);
みたいにした方がいいぞ。
724 :
デフォルトの名無しさん :03/12/02 13:32
>>723 それじゃ一文字しか読みとらず、getcharとかわらん。
a[ 0 ][ 0 ] = 0 、a[ 0 ][ 1 ] = 1、a[ 0 ][ 2 ] = 2、a[ 0 ][ 3 ] = 3、a[ 0 ][ 4 ] = 4 ・・・・・ a[ 1 ][ 0 ] = 0 、a[ 1 ][ 1 ] = 1、a[ 1 ][ 2 ] = 2、a[ 1 ][ 3 ] = 3、a[ 1 ][ 4 ] = 4 ・・・・・ ・ ・ ・ a[ 99 ][ 95 ] = 95 、a[ 99 ][ 96 ] = 96、a[ 99 ][ 97 ] = 97、a[ 99 ][ 98 ] = 98、a[99 ][ 99 ] = 99 となるような式を作る課題があります。以下のようなプログラムで良いでしょうか。 int a[100][100] ; int b[100][100] ; for ( int i = 0 ; i <= 99 ; i++) { for ( int j = 0 ; j <=99 ; j++) { a[i][j] = j ; b[i][j] = j ; } }
>>719 つーかgetchar()の前にfflush(stdin)したら駄目?
while(1) {
fflush(stdin);
switch( getchar() ) {
/**/
}
}
rewindじゃあかん?
>>725 実行してみた? たぶん君の望むようになってると思うけど、
だが何でa,b二つあるのか、そもそもなんでa[j]で十分なのにa[i][j]があるのかわからん。
データを書き換えないのなら
int i;
int o[100]; //共有データ
int* a[100];
int* b[100]
for(i=0;i<100;++i)
o[i] = i;
for(i=0;i<100;++i){
a[i] = o;
b[i] = o;
}
この方が遙かに無駄がないと思うが
int a[100][100]; int c; for (c = 0; c < 100; c++) a[0][c] = c; for (c = 1; c < 100; c++) memcpy (a[c], a[0], sizeof a[0]);
ありがとうございます。 a[ ][ ] 、 b[ ][ ] 二つ作れ、という課題でした。
上記での記入漏れです。ごめんなさい。
>>728 , 729
ホントにどうもありがとうございました。 m(_ _)mぺこぺこ
0,525 0.00183,546 0.00367,488 0.0055,536 0.00733,502 0.00917,510 0.011,543 0.01283,485 0.01467,518 0.0165,504 0.01833,498 0.02017,529 0.022,468 0.02383,521 ・ ・ と言う値がファイルに書き込まれていて、この値をファイルから読み取り グラフを書くプログラムを作りたいのですがどうすればいいのでしょうか? ただし、左の値はがx、右の値がy座標です。
>>731 カンマで区切ってxとyの配列に入れて、
点と点を結んでいくってのは?
, をスペースへ変えたら scanf ("%lf %lf",x, y)で読み取れるね
scanf("%lf,%lf", &x, &y)をお試しアレ
>>733
早いレスありがとうございます(^0^) 今から是非試してみたいと思います。
char str1[256];
while(1)
{
printf("\nWrite? (y or n) : ");
int yn = getchar();
if(yn == 'y' || yn == 'n')
{
break;
}
printf("\nInput 'y' or 'n',\n");
}
printf("Input file name :")
fgets(&str2[0],sizeof(str),stdin);
こんな感じで、y/n判定を抜けた後の文字列入力が飛ばされてる感じです
また、y/n以外を弾いた後も一回判定が飛ばされてます。
>>722 それをやると上手く行くのですが、
せっかく一文字入力させる関数があるのに使えないのはちょっと…
という感じです
>>723 ,724,726,727
色々意見ありがとうございます。早速試してみます。
ですが、やり方が分かっても何故こうなるかが分からないのですが…汗
何故このような結果になるんでしょうか?
連続ですみません ×fgets(&str2[0],sizeof(str),stdin); ○fgets(&str1[0],sizeof(str),stdin); でした
>>733 の方法はfgets()後
手作業でやらずとも標準のstrtok()を使えば簡単に区切った文字列を取り出せるぞ。
つーか読み込みはいいけどグラフに出力の方は自力でできるの?
>>731 C言語の機能では無理だから環境書いてくれないと困るけど。
(GNUPLOT使うのならそのままカンマ区切りのデータで読み込めんでグラフ化できるし)
×fflash(stdin) ○scanf("%*[^\n]%*c") or while (getchar() != '\n')
>>737 先に感想。
俺は、対話的プログラムは知らない&やりたくない人だが。
y[enter]
とかやらせるなら、素直にfgets()あたりを使い1行入力後、文字列の比較のがいいかもしんない。
んで、問題の動作がどうしておこるのかの説明。
入力ストリームを考えてみれば当然。
Input 'y' or 'n'と表示後
y [enter]
と入力すれば、入力ストリームにはは 'y', '\n'が入る。
getchar()で'y'が取り出される。
fgets()が呼び出されたときまだ、'\n'が入力ストリーム残ってるのだから、それを読み込む。とゆーことですね。
そーなのか。「よく質問される」のだすな・・・この手のって
>>740
>>741 文字列はswitchできないから対話的プログラムにはよくないかもしんない。
if(strcomp(hoge,hage)) ...
else if(strcomp(hoge,mage)) ...
とやるのか?
strcmp() だし、!strcmp(x,y) だろ・・・。
744 :
デフォルトの名無しさん :03/12/02 15:27
>>742 一文字だったらswitchできますYO!
switch(*hoge){
case 'y':
case 'n':
}
DQNばっかり。
746 :
デフォルトの名無しさん :03/12/02 15:29
たとえばaを入力した場合 <実行結果> 文字を入力して下さい。a aを16進数で表すと、61です。 1の個数は3個で、奇数です。 パリティ付加後の文字は、c2(16進数表示)です。 と表示されるプログラムをつくりたいんですが下の 続きからおねがいします。 #include<stdio.h> main() { char moji; unsigned int k; int b; int shift; int n=0; int i; printf("文字を入力して下さい。"); scanf("%c",&moji); printf("%cを16進数で表すと、%xです。\n",moji,moji); b=sizeof(char)*8; k=(int)moji; for(i=0;i<b;i++){
747 :
デフォルトの名無しさん :03/12/02 15:30
sizeof(char)は1だと何度言えば(ry
俺は対話は
>>742 見たいにやってるぞ
gets(str);
if (!strcmp(str, "追加")) {
追加処理
} else if (!strcmp (str, "削除")) {
削除処理
} else if (!strcmp (str, "終了")) {
終了処理
}
というようにやってます
もっと良い方法あったら教えてください
>>743 スマン。戻り値はど忘れだがstrcompはよくやる(w
>>744 言うまでもないがgetchar()の戻り値はint型。
文字列の先頭要素だとcharしか受け取れないから、
EOFが来たときの処理が困ったことになるはず。
つーか
>>741 は文字列の比較と言っているんだが。
>>746 b = sizeof(char) * CHAR_BITS とすべきだな。
それと
>>747 は無視して良い。コードに意味があるということを知らないらしいからな。
おっと、CHAR_BIT だったわ。
CHAR_BITSだってさ(ワラ CHAR_BITのことかしら(ワラ
「べき」とまではよう言わんな
750はmalloc(strlen(str)+1);をmalloc((strlen(str)+1)*sizeof(char));と書くのかな。
そうだけど?
>>754 malloc((strlen(str)+1)*sizeof(char) * CHAR_BITS );って書くんじゃないか(w
>>756 バイト数だからCHAR_BITS(wは掛けないだろ。
というかわざわざCHAR_BITSを定義してるんなら、 (strlen(str)+1)*CHAR_BITS/8 だろー CHAR_BITS/BYTE_BITS(w かもしれず
おうおうDQNが沸いてきたな。
761 :
デフォルトの名無しさん :03/12/02 15:56
波形表示ってどうやるの?
762 :
デフォルトの名無しさん :03/12/02 15:57
音っす。 FFTで数値は出せたのですが、いざ表示となると何が何やらさっぱりでして。 必要なヘッダとかあったらそれだけでも教えて頂きたいです。
764 :
デフォルトの名無しさん :03/12/02 16:15
>>699 の
sum[2]={0,0}ってどーゆー意味ですか?
っちゅーか、
>>699 の書き方ってレベル高くね?
全然思いつかんかった。
えーっと対話処理の嫌いな
>>741 です。
switchで使えんじゃないかというツッコミに対しての返答。
ワシなら以下のよーなテーブルを用意します。
typedef struct Nameval Nameval;
struct Nameval {
char *name;
char val;
};
Nameval namevaltab[] {
{"a", 1},
{"hoho", 2},
};
んで、2分探索とか使って、文字列から整数を得るよーにします。文字列が多かったら、ハッシュね。
もっとも、処理の分岐させるなら。
struct Namefunc {
char *name;
int (*func)(char *);
};
とかやりそーだけれども。
>>736 素直なところ、MATLAB、GNUPLOT、(音声だとCoolEditとかもあるか・・・)などの外部ツールを使うな。俺なら。
んでもって、どーしてもC/C++でやりたいなら、環境依存になります。
よく挙がる、『C言語によるアルゴリズム辞典』のHPから調べれば、
PC98とIBM-PCの画像表示部が公開されてるのと、
X WinowsとMS Windowsもそこからリンクされてたよーに記憶してます。
うろ覚え、URL紛失なんで、適当にさがしてちょ。
> for (i = CHAR_BIT - 1; 0 <= i; --i) for (i = 0; i < CHAR_BIT; ++i) に訂正。どっちでも動くけど。 あと、ビット操作の時は unsigned にするのが常識ですが、 対象が ASCII コードで確定されてるんで省いてます。
一次元配列 int data[5]={1,2,3,4,5}を用意し ポインタを用いて配列内容を{6,7,8,9,10}に書き換えなさい お願いします
>>770 int *p = data;
p[0] = 6; p[1] = 7; ... p[4] = 10;
>>770 きめ打ちの書きかただが。
int *p;
for (p = data; p < data+5; p++)
*p += 5;
>>768 多分自分へのレスかな?
環境依存ですか・・・。以前OpenCVっての使ってみたんですけど
もーワケがわからず即効で挫折したんすよね・・・。
やっぱ避けては通れませんか。
とりあえず、『C言語によるアルゴリズム辞典』探してみます。
ありがとうございました。
っちゅーか、波形ひとつでこんなに手間かかるんだから
ゲーム作ってる人とかスゲーなって心底思いますよホンマ。
宿題で高速フーリエ計算させる学校もすごいな
775 :
デフォルトの名無しさん :03/12/02 17:19
次のように出力するプログラムを char *p="aiueo"; と定義されたポインタ変数pを用いて作成してください。 他の変数は使わないこと。 aiueo iueo ueo eo o 途中までは出来たのですが何が足りないかが よくわかりません。教えて下さい、お願いします! #include<stdio.h> int main(void) { char *p="aiueo"; while () puts(p); return 0; }
char *p = "aiueo"; int i; for (i = 0; *p != '\0'; i++) puts(p+i);
do{ puts(p); }while(++p);
>>774 俺のガッコの宿題では、
FFTするN88 BASICソースからCのソースへ変換する宿題がでたぞ。
>>775 while()
↓
for (; *p; p++)
>>776 iつかっちゃダメとゆー問題ではなかろーか。
}while(*++p); こっちね
>767 感謝です
782 :
ゴメス ◆oJjvkz7VeA :03/12/02 17:52
すいませんが、このソースの任意の数人を選ぶというのがわかりません。 一人は多分出来ました。。。 ヨロシクお願いします。
783 :
ゴメス ◆oJjvkz7VeA :03/12/02 17:55
と思ったらうpロダにうp出来ない・・・ちょっと待ってくださいっすT_T
784 :
デフォルトの名無しさん :03/12/02 19:27
ウザいあげんなカス
ウザい書き込むなカス
ω
お前らってホント暇なんだな。
791 :
デフォルトの名無しさん :03/12/02 20:10
あのさぁ、ステレオ→モノラル変換なんだけどさ 左、右8bit PCMのデータをモノラル8bit PCMにするのってどうしたらいいの?
一番簡単なのは、実際に他のプログラムで変換してみてどのような処理をしているか推定する。 まあ、足してみたら?
793 :
デフォルトの名無しさん :03/12/02 20:16
足したらノイズになるんだよね・・・
スレ違いかもしれませんが質問させていただきます。 プログラムのことを勉強したかったので、勉強するならC言語かC++が役に立つだろうと思い、 書店に本を買いに行ったらJavaの本しかなかったので、しかたなくその本を買いました。 Javaって覚えていて役に立つと思いますか?
じゃあ足して2で割れば?
あげんなっつってんだろカス
>>794 Javaが役に立たなかったらCも役にたたん。
俺も最近本屋に行ったがCって人気ないの?
798 :
デフォルトの名無しさん :03/12/02 20:27
まず /dev/dsp を openし.....コーデックを選択します。 ......デフォルトは unsigned 8bit linear (AFMT_U8) というやつで...... たいていは signed 16bit little-endian (AFMT_S16_LE) という オーディオフォーマットが用意してあります。できるだけこちらに.... ......チャンネル数 (monoral or stereo) を決めます。 デフォルトではチャンネル数は 1、つまり monoral ですが、 2にするとステレオになります。 ioctl SNDCTL_DSP_CHANNELS でセットできます。 ioctl SNDCTL_DSP_STEREO でもセットできます。 この場合 ioctl の三番目の引数に int で 0 か 1 を.... .....ioctl SNDCTL_DSP_GETFMTS で対応しているフォーマットが返ります。 tp://www.media.t-kougei.ac.jp/~nagae/v4l/snd/stereo.html
FFTして各要素の平均を求めて、逆FFTかます。 フーリエ変換によって各周波数での強さが求められる。 二つの音の重なりはこの強さの平均で表せる。 ってなんとなく知らない人が見たら説得力ありそうな嘘を書いてみる。 >Javaって覚えていて役に立つと思いますか。 思う。だが、C言語かC++の勉強には(100%とはいわないが)役に立たない。 プログラムを覚えるには妥当。無論CでもC++でもかまわない。
>>798 おかげでアフォな書き込みがピタっととまって笑えた。
そういう漏れはアフォですか。そうですか。
>797様 >799様、返信ありがとうございます。 覚えて損は無いと言う事ですね・・、これからマターリ勉強します。 >>俺も最近本屋に行ったがCって人気ないの? 僕の場合は田舎の書店だったので置いてなかっただけかと思います。
>>801 本屋って新しい書籍の占める割合が多いからなぁ。
どうしても後発の言語の書籍がたくさん並ぶ状況になるんじゃないか?
SDLとかって少ないよね。 SDLって先発なの?
素朴な疑問。 なんで、scanf()系のフォーマットを"%d %d"って風に空白空ける人が多いんだろ。 "%d%d"で充分だと思うのだが。
見やすいからじゃない?
>>806 つーかまずは構造化を覚えよう。
こんなだらだらしたソースじゃ誰も手を出す気が起きないぞ。
生徒の番号と科目番号を与えたら科目(の点数でいいんだよな)を
表示する関数を作ればあとはループの組み合わせで作れるでしょ?
まず、Nの違いで変わるものがtextattrの引数だけならば、 textattr_list[10]={2,3,4,5,6,7}; とかしておいて、 textattr(textattr_list[N]); star(N); としてくれ。 int型の比較であれば、N<=8,N<=7とか書くんじゃなくてN==8,N==7とか書いたほうがいい。
一番まずいのはこれだな。 ファイルから読み込んだ学籍番号をそのまま配列のインデックスとして 使っているところ。 学籍番号が0-100に収まらないとメモリが破壊されるぞ。 きちんと学籍番号からインデックスを求めるマップを作るかしないと危険だ。
star(N)は共通なので外に出す。 isLevel(int N)関数をつくり、点数からレベルを返すようにする。 int islevel(int N){ if(N>=8) return 0; if(N==7) return 1; if(N==6) return 2; return 3;} colortbl[4] = {2,7,6,4}; そうすると、if-thenの山が textattr(colortbl[isLevel(N)]); star(N) の2行にまとまる。
/*この先もメニューにあるcase文をひたすら書く。*/ ひたすら書くのは自由だが、もうちょっと考えたら?
面倒くさいから文句言ってないで全部作ってみせてくれないかしら? な、それもゴメちゃんの為だ。
>>813 おまえが本物でも偽者でもそっくりそのままおまえに返せるなw
>>813 じゃぁ、もうちょっと見られるソースを見せろ。
見るほうもうんざり。
816 :
デフォルトの名無しさん :03/12/03 01:14
>>806 あなたはすごい忍耐力があります、それは認めます。
将来楽しみです。
あの掲示板、書き込める行数が無制限なのかしら。 2chだったら一発で荒らされるな。
819 :
デフォルトの名無しさん :03/12/03 01:29
str ="12+248"のように文字列strは2つの整数値を+でつなげたものとする。 strの計算結果を返す関数strcalcを作成せよ。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str = "12+248"; printf("%s = %d\n", str, strcalc(str)); } int strcalc(char *str) { char a[10], b[10]; int i, atoi; for(i = 0; i <= 10; i++) a[i] = str[i]; a[i] = '\0';/*ここから課題*/ for(i = 0; i <= 10; i++) b[i] = str[i]; b[i] = '\0'; str = "12"; atoi(); str = "248"; ati(); *str = atoi() + atoi(); printf("%s = %d\n", str, strcalc(str)); return strcalc; } atoiを使ってやってみたものの、"ここから課題"からごらんのようにさっぱり解りません。 どうやればatoiを使ってうまくできるか教えて下さい。 str[]に12+248、a[]に12,b[]に248をやってる感じなんですけど。
820 :
デフォルトの名無しさん :03/12/03 01:31
>>819 "-12+(-248)"
こういうのもありえる??
821 :
デフォルトの名無しさん :03/12/03 01:35
もしそういうことはなくて、演算子と項の間に空白は一切ないとするなら、 #include <stdio.h> int strcalc(const char *str) { int a,b; sscanf(str,"%d+%d",&a,&b); return a+b; } これでできないかな?
'+'と書いている文字を探す。で、その次以降をb[]にコピーして atoi(a)+atoi(b) かな?
おっと、穴埋めか。 ごめん、やり直す。
>>819 // -100+-100もたぶん大丈夫だけど括弧は無理だし+100+100もダメ
// しかもエラーチェックしてないので要注意
int strcalc(char * str)
{
return atoi(str) + atoi(strchr(str, '+') + 1);
}
825 :
デフォルトの名無しさん :03/12/03 01:40
>>820 たぶん"12+248"のみで考えると思うので"12+248=260"で10って意味だと思ったんですけど・・・。
違いますかね?
すいません。
>>819 の
char a[10], b[10];
int i, atoi;
のatoiはいらないですね。
>>821 >>822 >>824 ありがとうございます。
参考にさせていただきます。
// simplest_calc.c // 標準関数使って先生にほめてもらえるかもVer #include <stdlib.h> #include <string.h> int evaluate(char* expression) { int answer; char* arg; arg = strtok(expression,"+"); if( !arg ) { fprintf(stderr,"%s includes no {%s}"",expression, "+"); exit -1; } answer = atoi(arg); while( arg = strtok(NULL,"+") ) answer += atoi(arg); return answer; } int main(void) { char expression[] = "56+32+45"; printf("%s=",expression); printf("%d\n",evaluate(expression)); return 0; }
>>827 いくらconstがついていないからって、渡した文字列を(strtokで)書き換えるのはどうかと・・・・
行儀はよくないが、、、 デリミタが一つなんだから'\0'を'+'に再置換すれば復元は可能だぞ。 つーかそんなに心配ならstrcpyを介せばいいだろ。
ああ一つデリミタが連続して登場していた場合は復元不可能になるな。 432++++242++552みたいな。こんなの入力するヤツも入力するヤツだが。
ああそうか、この例はリテラル使ってるから根本的にやばいな。すまん認める。 言い訳すると説明のための例でなく実際には この手のプログラムはユーザーに式入力させるだろ、という前提が云々
int main(void) { char expression[] = {'5','6','+','3','2','+','4','5'}; printf("%s=",expression); printf("%d\n",evaluate(expression)); return 0; }
訂正 char expression[] = {'5','6','+','3','2','+','4','5','\0'}; 問題ない。
>>834 > char expression[] = "56+32+45";
これと
> char expression[] = {'5','6','+','3','2','+','4','5','\0'};
は同じだよ。出題者の例がchar *str = "12+248";でリテラルになっていただけで
>>832 いや、よくよくみたら問題なかった。ごめん。
そうだな。
char*じゃなくてchar[]なんだから
単なる配列の初期化であって特別視する必要はそもそもなかったやね。
ところで
>>806 はもう放置でいいのか?
さあ。読む気がある人が現れれば答えが出るのかもしれませんけどね。 人に読んでもらえる(見やすい)コードを書いたほうが それだけ多くの人の意見がきけるからトクだと思うんだけどなぁ。 質問者ご本人がどう考えているのかわからない。 粘り強く頑張っているのは分かるけど。 放置するもしないも自由では?
宿題なら、問題を丸投げしてくれた方がかえって答えやすかったりして。
数式解く人たちへ。 [式] ::= [和] [和] ::= [数] ( '+' | '-' ) [数] | [数] [数] ::= 0~9の続き でがんば。
寝起きなんでボケてる
>>840 突っ込みしといて(泣)
>>819 蛇足だけど
for(i = 0; i <= 10; i++) a[i] = str[i];
a[i] = '\0';/*ここから課題*/
これだと a[11] までアクセスしてしまう。
char a[10] で確保したなら a[9] までしか使えないよ。
多次元配列をつかった課題ですが、よろしいでしょうか。 [課題]成分の%表示(メモリの動的確保) ある物質を構成する成分の数 n,及び,各成分の質量(実数値)を入力した後, 1 番目,及び,2 番目の成分の全体に対する割合(%で小数点以下も表示)を出力するプログラムを書いてください。 ただし,任意の n の値に対応できるように書き, 各データ間は,1つ以上のスペースで区切って出力してください。 どうかお願いします。
まず、複数科目に対応できるようにする。このため点数を格納する配列を2 次元配列にする。この2 次元配列は、main 関数で以下のように定義される。 int score_db[DATA_MAX][SUBJECT_MAX]; DATA_MAX はマクロで、扱える最大の生徒数を表し、SUBJECT_MAX は、扱える最大の科目数 を表す。これらの数は十分に余裕を持って取っておけばよい。この変更により、add 関数は6 引 数関数となる。 void add(char name_db[][], int score_db[][], char name[], int score[], int subject_num, int index); ただし、name_db は名前を格納する配列、score_db は点数を格納する配列、name は名前、score はname に対応する学生の各科目の得点の配列、subject_num は科目数、index はname とscore を 加すべき場所(添字)である。 指定した学生の科目の平均点を求めるpersonal_average 関数と、指定した科目の平均点を求め るsubject_average 関数を作成せよ。それぞれ3 引数関数で、学生や科目の指定には配列の添字を 使うものとする。さらに、名前の配列から指定された名前の検索を行って、対応する添字を す search 関数を作成せよ。名前が見つからない場合には-1 を すこと。
問:スタック上にでっかい配列をとってもOKでしょうか?>識者
でっかいスタックとってもOKな環境ならOK
848 :
デフォルトの名無しさん :03/12/03 11:47
int a,b,c,d,e,f にある値がすでに設定されているとする。 qsort()等を使わず自力でソートして,aから昇順に保管せよ。
849 :
デフォルトの名無しさん :03/12/03 12:10
#define HOGE(x, y) if (x < y) x ^= y ^= x ^= y int i; for (i = 0; i < 6; i++) { HOGE(a, b); HOGE(b, c); HOGE(c, d); HOGE(d, e); HOGE(e, f); }
>>850 >>847 は無視していいんじゃないの?
運悪く実力者がいなかったときは時間を置いて再度>>xxx何ですけどと聞いてみましょう。
あまり同じ事言ってると、「出てけ」どころか相手にされなくなるので気をつけましょう
852 :
デフォルトの名無しさん :03/12/03 12:52
あるデータがあるとして検索の早さ,効率点で一番良い&&実用的なデータ 構造は何でしょうか? 教えて下さい。
853 :
デフォルトの名無しさん :03/12/03 12:55
>>852 あるデータがどんなものか書いてくれないと答えようがないが・・・
文字列ならハッシュか。
すいません。 データは本当に何でも良いんです。 ハッシュ法だったらチェイン法の方が良いですよね? まだ良く理解してないんですが赤黒木はどうなんでしょうか?
つまり文字列でも構造体でもクラスでも良いという事だな
>>843 悪い、昼から授業なので作れないのでヒントだけでも。
まずは動的メモリ確保をしない番は作ってくれ。
そうしないと話にならん。
>>855 申し訳ないのですが、Cしか知らないのでクラスは分かりません。
データはできればクラスじゃない場合を考えて頂けないでしょうか?
>>857 何でも良いと言った割りに後から条件出してくるのは非常識だな
何度も仕様を変更してくるような顧客みたいでいやだな
859 :
デフォルトの名無しさん :03/12/03 13:19
二分探索最強! え?ソートに時間がかかるって?
860 :
デフォルトの名無しさん :03/12/03 13:25
console出力(DOS画面)で良いなら win32consoleappliで scanf("成分入力せんかい!ゴラ(゚ポ)!nの量%d グラム、mの量%dグラム",&n,&m); c=nとmを計算 以下同様計算 printf("m,nの%はこうだゴラ!n:%c・・・",c・・・)
861 :
デフォルトの名無しさん :03/12/03 13:26
>>860 ちょっと待った。
そのscanfの文字列はprintfで使うべきだろう。
862 :
デフォルトの名無しさん :03/12/03 13:30
printf("m,nの%はこうだゴラ!n:%c・・・",c・・・) あらら・・・間違えてる printf("n,mの%はこうだゴラ!n:%d・・・",c・・・);
俺は無視ですか。そうですか。
あげてる奴は基本的にDQN。
865 :
デフォルトの名無しさん :03/12/03 13:42
>>861 の注意を鑑みると
scanf("使用量入力せんかい!ゴラ(゚ポ)!nの量%dグラム、mの量%dグラム",&n,&m);
C=nとmの計算
printf("成分%はこうだ!ゴラ(゚プ)!n:%d % ・・・",c,・・・);
866 :
デフォルトの名無しさん :03/12/03 13:44
>>865 printf("使用量入力せんかい!ゴラ(゚ポ)!nの量(g) :");
scanf("%d",&n);
printf("mの量(g) :");
scanf("%d",&m);
こうだっつーの
867 :
デフォルトの名無しさん :03/12/03 13:47
scanf("使用量入力せんかい!ゴラ(゚ポ)!nの量%dグラム、mの量%dグラム",&n,&m); どうしてこれではいけないのでしょうか?意味が分かりません・・・。
868 :
デフォルトの名無しさん :03/12/03 13:49
>>867 やってみりゃ分かるだろ。
まず、「使用量入力せんかい・・・」が表示されない。
そして、「使用量入力せんかい!ゴラ(゚ポ)!nの量45グラム、mの量67グラム」のように入力しないとnやmに代入してくれない。
C言語は難しいんですね・・・。
偽物が居ます!!汗
>>808 構造化という物を習ってませんT_T
どういうのがキレイでどういうどういうのがダラダラかよく分からないんです、、、
習ってないなら調べろという感じなので調べてみます!
>>870 構造化プログラミングとOOPは非常によく似てるから、
OOPやるなら勉強しておいた方が良いよ。
構造体か?
874 :
870ゴメス ◆oJjvkz7VeA :03/12/03 14:47
>>811 809
こういうことですか?!
textattr(7);
printf("\n");
cprintf(" 数学");
N=H[no][1]/10 ;
N=hoshi(N) ;
で、関数、int hoshi(int N)を作ってみました!コンパイル性交しましたー!
うまく動いてしかも見栄えがキレイになりました!ありがとーございます^^
875 :
870ゴメス ◆oJjvkz7VeA :03/12/03 14:48
成功。。。
876 :
デフォルトの名無しさん :03/12/03 15:33
この行から型名が必要と言うエラーが出るのですがどういう意味でしょう? float average(int no,G[no][kno]);
Gの型名は何処?
878 :
デフォルトの名無しさん :03/12/03 15:37
>>877 #define G int aとしています。
あ り え ね ぇ ー ー ー ー ー
881 :
デフォルトの名無しさん :03/12/03 15:50
あのーなんで違う人が私の質問を各所でしているのでしょうか、、、 おかげで誰も答えてくれませんT_T けど、調べたら分かりました! お騒がせしました。
俺がコピペしたのは一箇所
3 - 1 = 2
intつけたらなおりましたー!
ご迷惑おかけいたしました。
>>882 (=_=)
noは非マクロでknoはマクロか。きもいコードだこと。
きもいとか言う方がきもいんですぅ
それなら教えてくれてもいいじゃないですか(;ω;)
889 :
デフォルトの名無しさん :03/12/03 16:07
きもくないコード(;ω;)ガー
891 :
デフォルトの名無しさん :03/12/03 16:10
>>890 #define kno 10(これは適当に)
float average(int no,int G[][kno]);
幼稚園児が何人かいるな。
>>890 なんかウザイな、俺以外にも思ってる人がいると信じる
キモいキモくないは個人の自由だから自分でキモくないと思えばそれでヨシ。
ただ、参考に教えてくれってなら別だろうけどな
コード以前にお前がキモいな
おっと、最下行に激しく同意しちゃうぞ。
(´゚c_,゚` )
こ の ス レ は 8 8 1 を キ モ が っ て 1000 を 迎 え る ス レ に な り ま し た
897 :
デフォルトの名無しさん :03/12/03 17:43
すいません、C言語でサイン波や、矩形波などのWAVEファイルを 作ってみようと思っているんですが、どこか良いサイトを紹介、また、 作り方を教えてくださる方はいませんか? ググってみたんですけど、・・・ちょっと・・・わからなかったんです。 C++じゃなくて、今自分が勉強しているC言語で作成してみたいのです・・ おねがいします。
>>897 俺は音声処理はよくしらんが
波形の作り方が知りたいのか、
WAVEファイルの作り方が知りたいのか、
それをまずはっきりさせた方がいいと思うぞ
マルチメディアちっくになるとCスレだけじゃ足りない気がする…かなりOS/機種依存だよねぇ
すいませんageてました・・
>>864 とりあえず、波形の計算式は自分で調べます・・。
例えば、"square_wave.wav"というデータに5秒間の矩形波データ(音階は例えばC5の音)
を作成する、のようにしたいと思っています。
Boland C++コンパイラーを使っています。でもCしかわからないので、Cでの書き方を調べています。
>>898 さん、WAVEファイルの作り方もわかりません。そして、波形の作り方も調べています。
MIDIを扱っていて、多少音に関する知識はあるんですが・・・、nsf(ファミコンサウンド)とかも・・
どなたか力を貸してください!m(__)m
じゃあ、まず mid からはじめたら?
903 :
デフォルトの名無しさん :03/12/03 18:32
wave formatWindows WAVE format Byte order: Little-endian Offset Length Contents 0 4 bytes "RIFF" 4 4 bytes <File length - 8> 8 4 bytes "WAVE" 12 4 bytes "fmt " 16 4 bytes <Length of the fmt data> // (=16) 20 2 bytes <WAVE File Encoding Tag> 22 2 bytes <Channels> // Channels: 1 = mono, 2 = stereo 24 4 bytes <Sample rate> // Samples per second: e.g., 44100 28 4 bytes <bytes/second> // sample rate * block align 32 2 bytes <block align> // channels * bits/sample / 8 34 2 bytes <bits/sample> // 8 or 16 36 4 bytes "data" 40 4 bytes <Sample data size(n)> 44 (n)bytes <Sample data> /* Windows WAVE File Encoding Tags */ #define WAVE_FORMAT_PCM 0x0001 (以下略)
ありがとうございます。 暫く奮闘してます。
それならいきなりWAVEで波形、とか考えずに <Sample data>に当たる波形(もちろんモノラル)だけを 配列使って何種類か作成してみたら?
908 :
デフォルトの名無しさん :03/12/03 19:15
ちなみに
>>902 のサイトの解説は一部問題ありなので鵜呑みにしないこと。
まあWAVEファイル作るだけなら大丈夫だけど。
文字型の二次元配列dataにおいて、次の図で示される x、y、zの三ヶ所の配列には、それぞれ、'x','y','z'とい う文字リテラルをそれ以外の配列要素には'-'という文字りテラル を代入して、実行例のように表示するプログラムを作成しなさい。 実行イメージ -x--- --y-- ----z この問題のプログラムってどのように記述したら良いか。 教えてください。おねがいします。
printf ("-x---\n"); printf ("--y--\n"); printf ("----z\n");
問題の意味が不明だが、 char data[3][5]={'-'}; data[0][1]='x'; data[1][2]='y'; data[2][4]='x'; for(i=0;i<3;i++){ printf("%s\n",data[i]); } 確かめてないが、こんな問題か?
data[2][4]が間違えてるし、dataの配列の大きさも微妙だし(プッ だせーな、俺。
char data[3][6]={'-'}; data[0][1]='x'; data[1][2]='y'; data[2][4]='z'; for(i=0;i<3;i++){ data[i][5]='\0'; printf("%s\n",data[i]); } これでいいか?
916 :
デフォルトの名無しさん :03/12/03 22:13
次の操作を行え。 【操作1】Increment()の実現部分を作れ。ただし、 メソッドIncrement()を20回連続して実行した場合、cnt値が、 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5のように繰り返す仕様に せよ。 【操作2】Decrement()の実現部分を作れ。ただし、 メソッドDecrement()を20回連続して実行した場合、cnt値が、 5,4,3,2,1,5,4,3,2,1,5,4,3,2,1のように繰り返す仕様に せよ。 【操作3】Counter型の変数Cnt1を使用せずポインタを使った プログラムに変更せよ。 【操作4】変換関数を使い、ポインタを使ってcnt値が表示されるように せよ。cout << *ptr << "\n"; ただし、ptr:ポインタ */ // // #include <iostream> using namespace std; // #include "counter.h" // int main() { Counter Cnt1; for (int i=0;i<20;i++) { Cnt1.Increment(); cout << Cnt1.Get() << "\n"; } return 0; }
-------------------counter.h------------------------ // class Counter{ int cnt; public: Counter(int i=0){cnt=i;} void Increment(); //cntに1を加える。 void Decrement(); //cntに1を減ずる。 void Set(int i){cnt=i;} int Get(); }; // //実現部 // int Counter::Get() { return cnt; } クラスを使い始めたところから授業についていけなくなってしまいました。。 ご教授お願いします(;´д`)トホホ
918 :
デフォルトの名無しさん :03/12/03 22:15
161辺りでデータをファイルから読み込んで個数を表示させるプログラムは どのようにしたらいいのでしょうか? ファイルを仮にout.txtとした場合をお願いします。 データは0から10000まで数字が並んでいてある数字は複数個あります。 例 0 1 1 1 2 3 4 4 5 6 7 8 9 10 11
>>918 #include <map>
#include <iostream>
#include <fstream>
main()
{
map<int, int> imap;
ifstream ifs("out.txt");
for(int i=0;i<10000;i++)
{
int d;
ifs >> d;
++imap[d];
}
for(map<int, int>::iterator it=imap.begin(); it!=imap.end(); ++it)
cout << it->first << ":" << it->second << "個" << endl;
}
918です。 919さんありがとう。 でも、エラーがでてしまいます・・・。 結果をファイル(out2.txt)に出力する部分もお願いします。
>>920 main()の前の行に
using namespace std;
結果をファイルに出力したければ
command > out2.txt
みたいにリダイレクト使って下さい
エラーがまだ出ています。 無知ですいません。
なんであちこちでこの問題解いているんだ?
短時間で解決したいんです。 どうかよろしく。
926 :
デフォルトの名無しさん :03/12/03 23:07
ガウス法のプログラムを作成しなければならないのですが #include <stdio.h> #define n3 /* 連立一次 n 元方程式 */ main() { int i,j,k; double a[n] [n+1]={ {3,2,1,10},{2,5,2,18},{1,4,1,12} }; double d; この先をどなたかやってくれませんでしょうか?変数は何でもかまいません
}
>>926 ガウスって数学のありとあらゆる分野に顔出してる人だから、
ガウス法とか言われてもどのガウス法?って感じになるんだが。
ガウスの掃きだし法で連立1次方程式を解きたいってこと?
930 :
デフォルトの名無しさん :03/12/03 23:14
すまないと思ってます。 ところで、 ++imap[d]; が認識できないということが納得できません。
>>933 おやすみ
認識できないという事が納得できない理由を言わないとモウここの住人は反応してくんねーぞ
宣言していないくらいしか思いつかない。
中身が密なら、map使う必要は無いと思うが。
0から10000まできちんと並んでいます。 抜けている数はありません。
0から10000まできちんと並んでいます。 抜けている数はありません。
がんばってくださいね♪
ダブりました。 ごめんなさい。
しょうがない 俺がやってやるか その前に寝ていいか?
#define MAX_VAL 10000 main() { int imap[MAX_VAL+1]; std::fill_n(imap, MAX_VAL+1,0); std::ifstream ifs("out.txt"); while( ifs ) { int d; ifs >> d; ++imap[d]; } for(int i=0; i<=MAX; i++) printf("%d : %d 個\n", i, imap[i] ); }
>>926 int main()
{
int i,j,k;
double a[n] [n+1]={ {3,2,1,10},{2,5,2,18},{1,4,1,12} };
double d;
debugOut(a);
for(i=0; i<n; ++i)
{
for(k=n; k>=0; --k)
a[i][k] /= a[i][i];
for(j=0; j<n; ++j)
if(j != i)
for(k=n; k>=0; --k)
a[j][k] -= a[j][i] * a[i][k];
debugOut(a);
}
for(int j=0; j<n; ++j)
printf("%f\n", a[j][n]);
return 0;
}
ちなみに、debugOut はチェック用に配列の中身を表示する関数。 void debugOut(double a[][n+1]) { for(int i=0; i<n; ++i) { for(int j=0; j<=n; ++j) { printf("%f, ", a[i][j]); } printf("\n"); } printf("\n"); }
#include <set> #include <fstream> #include <iterator> using namespace std; int main(void) { ifstream fin("out.txt"); multiset<int> iset ( (istream_iterator<int>(fin)), (istream_iterator<int>()) ); ofstream fout("out2.txt"); for(int i=0;i<=10000;++i) fout<< i << ',' << iset.count(i) << '\n'; return 0; } 無駄に汎用性があるがこれくらい簡潔で構わないだろう。 これだけ解答出してもらってるんだから早く帰ってくれ。
944さん親切にありがとうございました!
948 :
デフォルトの名無しさん :03/12/04 00:19
>>946 C++で確認してから載せていらっしゃいますか?
エラーが出ます。
>>946 エラーの内容とコンパイラを書いてくれ。
エラーが出るとしたらたぶん
multiset<int> iset (
(istream_iterator<int>(fin)),
(istream_iterator<int>())
);
この宣言の仕方が受け入れられていないんだろう。
multiset<int> iset (
(istream_iterator<int>(fin)),
istream_iterator<int>()
);
たとえばこんな風にしてみたらどうだ?
951 :
デフォルトの名無しさん :03/12/04 00:27
>>946 9:error C2061: 構文エラー : 識別子 'fin' がシンタックスエラーを起こしました。
9:error C2066: 関数型へのキャストは不正です。
9:error C2059: 構文エラー : ','
13:error C2065: 'iset' : 定義されていない識別子です。
13:error C2228: '.count' : 左側がクラス、構造体、共用体ではありません。
エラー 5、警告 0
>>951 istream_iterator<int> begin(fin);
istream_iterator<int> end;
multiset<int> iset(begin,end);
これがはねられるようなら
コンパイラ(名前書けといってるのがわからんのか)を変えた方がいい
953 :
デフォルトの名無しさん :03/12/04 00:36
Visual C++ 6.0を使ってます。 コンパイラの種類といわれてもよくわかりません。 できれば最初から書いてください。
謎。
955 :
デフォルトの名無しさん :03/12/04 00:38
953=948
956 :
デフォルトの名無しさん :03/12/04 00:38
>>946 g++3.3.2
12: error: 構文解析エラー before `)' token
844 名前:デフォルトの名無しさん[sage] 投稿日:03/12/03 10:07 まず、複数科目に対応できるようにする。このため点数を格納する配列を2 次元配列にする。この2 次元配列は、main 関数で以下のように定義される。 int score_db[DATA_MAX][SUBJECT_MAX]; DATA_MAX はマクロで、扱える最大の生徒数を表し、SUBJECT_MAX は、扱える最大の科目数 を表す。これらの数は十分に余裕を持って取っておけばよい。この変更により、add 関数は6 引 数関数となる。 void add(char name_db[][], int score_db[][], char name[], int score[], int subject_num, int index); ただし、name_db は名前を格納する配列、score_db は点数を格納する配列、name は名前、score はname に対応する学生の各科目の得点の配列、subject_num は科目数、index はname とscore を 加すべき場所(添字)である。 指定した学生の科目の平均点を求めるpersonal_average 関数と、指定した科目の平均点を求め るsubject_average 関数を作成せよ。それぞれ3 引数関数で、学生や科目の指定には配列の添字を 使うものとする。さらに、名前の配列から指定された名前の検索を行って、対応する添字を返す search 関数を作成せよ。名前が見つからない場合には-1 を返すこと。 おしえて
とゆーか。回答者の方・・・ムキにならんよーに。 質問者の態度からするに、最後は「こんなことも初めから答えられないの?」とか言い出しそうよ・・・。 そろそろ放置でよろしく。
959 :
デフォルトの名無しさん :03/12/04 00:40
960 :
デフォルトの名無しさん :03/12/04 00:41
STLはねぇ(;_;) とゆーか、コンパイラごとのC++標準への追従度がまちまちだからねぇ(;_;)
>>959 おまえか?キチガイは(w
キチガイの書く文は匂いでわかちゃうんだよ
>>843 の問題、だれかお願いではないでしょうか・・・。ヒントきいてもわからないです。
965 :
デフォルトの名無しさん :03/12/04 00:49
966 :
デフォルトの名無しさん :03/12/04 00:49
なんで多次元配列がいるの? 一番目と二番目と合計だけもってればでるんじゃない?
>>964 がわからない物をうちらがわかるわけない
とりあえずわかってるんだけど実装ができない程度ならいいんだが・・・それなりの説明をよろしく
こちらからも質問。
>>964 多次元配列ってなんですか?
(動的に確保することは今はおいといて)
double a[10][20][30];
[]がいくつもあるってことを指しているのかしら?
それとも
double a[1000];
っていうふうにたくさん要素をもつってことかしら?
エスパーさんの降臨求む。
>>964 入力は手打ち?
ファイルからもってくんの?
多次元配列については、2次元以上の配列って事じゃない? 多角形は3角形からだったっけ?
ある物質を構成する成分の数 n,及び,各成分の質量(実数値)を入力した後, 1 番目,及び,2 番目の成分の全体に対する割合(%で小数点以下も表示)を出力するプログラムを書いてください。 をもう少しわかりやすくおねがい
全体の成分に対する割合を1番目と2番目について出力して って解釈でOK?
そろそろ、新スレ、ぷりーづ。
>>670 多分
>>968 は
>>964 の言いたいことを確認しているのだと。
もちろん、あなたのいうように、多次元配列っていう言葉は2次元以上の配列に用いる。
974 :
デフォルトの名無しさん :03/12/04 00:56
>>972 だと思うけど、多次元配列をどう使えばいいのかサパーリわからん
>>974 は843とは別だよね?
843だったら名前の欄入れてくれないと困る
976 :
デフォルトの名無しさん :03/12/04 00:58
単にdoubleの配列を動的に確保するだけで解けると思うんだけどな。
977 :
デフォルトの名無しさん :03/12/04 00:58
struct KOUZOU{ int kazu; double *seibun; } あたりで良いんじゃないのかな kazu に seibun の数を入れる
やっぱり
>>968 の睨んでいるとおり、質問者が多次元配列というものを勘違いしているのかも。
int main() { int i; int size; double* element; double sum = 0.0; scanf("%d".&(size)); element = (double*)malloc( sizeof(double) * size ); for(i=0;i<size;++i) { scanf("%lf",element+size); sum += element[size]; } printf("%f %f",elemen[0],element[1]); } テストしてないがこんなコードだよな。 どこに多次元配列が出るんだ?
>scanf("%lf",element+size); じゃなくて scanf("%lf",element+i); な。 いろいろ危ない
質問者が回答者を混乱させる作戦だと解析
>>981 エラーチェックしていないのはいいとして、それじゃ百分率が出ないだろ。
それとelement+sizeじゃなくてelement+i element[size]じゃなくてelement[i]
まー。なんかねー。流れからしてそう思っちゃうねぇ・・・
>>983
986 :
デフォルトの名無しさん :03/12/04 01:09
943の評価を誰か頼む
printf("%f%% %f%%\n",sum/element[0]*100.0,sum/element[1]*100.0);
じゃなくて printf("%f%% %f%%\n",element[0]/sum*100.0,element[1]/sum*100.0);
990 :
デフォルトの名無しさん :03/12/04 01:15
986だが943をC++でやると???である。 入力はどうしたらいいの? 出力の仕方は? マジレスたのむ
A | +---+ | | B C というクラス関係があって、Aは抽象クラス、B,Cはサブクラス だとします。インスタンス化する際に、Bの属性を継承させた Cのインスタンスが必要になる場合があるとしたら、どうしたら よいでしょうか
すみません。図が変になってしまいました。 A ---+---C | +--- B
あぁもう逝きたい 図は無視してください
994 :
デフォルトの名無しさん :03/12/04 01:21
次のスレはできたの?
997 :
デフォルトの名無しさん :03/12/04 01:23
記念カキコ v(^-^=)
A ---+---C . | +--- B
999 :
デフォルトの名無しさん :03/12/04 01:27
1000 :
デフォルトの名無しさん :03/12/04 01:28
1000ゲットするぞ。と。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。