1 :
C++房 ◇9ye75cT6 :
02/11/06 17:42 俺はC++房。 今まで8ヶ月、毎日休まず一生懸命C++を勉強してきた。 わからない宿題若しくは処理があったら俺にやらせてくださいm(_ _)m ただしソート、2分木など俺が5分以上悩むの問題はお断りだ。 他の手強に聞いてくれ
2
C++房#:: C++房#2
お疲れ
線形探索法の検索の計算量はO(n), 二分探索法はO(log n), ↑ これらは分かるんですが、探索の計算量がO(1)の探索アルゴリズムを C言語で教えてください、 ちなみにハッシュ法のような複雑な手法を用いないで。。
9 :
デフォルトの名無しさん :02/11/06 18:07
ここに神の降臨を待つ質問者がいます。 誰かO(1)のアルゴリズムを発明してあげてください。
ハッシュ以外でO(1)なのはあるのか?
配列のインデックスとデータが1対1で対応しているとか。
>>8 ハッシュ以上に簡単な方法ってあるのかな?
検索したいデータの特徴によっては、裏技があるかも
しれないけど。
1.探索法である。 2.計算量は、O(1)である。 3.ハッシュよりも単純である。
すみません、、 登録されているデータ値は0以上9999 以内の整数です、というのを書き忘れました。
15 :
デフォルトの名無しさん :02/11/06 18:19
キーの重複や値の重複があるかどうかを教えてくれ。
17 :
デフォルトの名無しさん :02/11/06 18:24
int d[10000]; で解決ですね。
キーの種類が1000で整数なら、配列に入れるだけで解決だけど。 (これもハッシュといえばハッシュだけど)
問題文をそのまま写します。 線形探索法の検索の計算量はO(n), 二分探索法はO(log n)であった、それでは、探索の計算量が0(1)の探索手法 を考え、その探索アルゴリズムをC言語で記述せよ。またこれが、なぜO(1)なのか 説明せよ。 但し、登録されているデータ値は、0以上9999以内の範囲内の整数とする。 答えは簡単なアルゴリズムである。ハッシュのような複雑な手法は用いないこと。
>>19 誰が出題した問題か気になるな。目の前にいたらいちゃもんつけたる。(w
>>19 回答:
int *テーブル = (int*)malloc(テーブルサイズ); // 適当にデータ突っ込んどけや
int result = -1; // 見つかん無かったときは -1 とするよん
for( int i = 0; i<テーブルサイズ; ++i )
if ( テーブル[i]==検索してる値 ) result = i;
for( int i = テーブルサイズ; i<intで表現可能な最大値; ++i ) i==0;
O(1)な理由:
テーブルサイズに依存せず、比較回数は常にintの最大値、すなわち定数時間である。
まあ 17 や 18 の言っているやり方だろうね。
最適化で削られる気がする。
あ、mallocの引数の"テーブルサイズ"とfor内の"テーブルサイズ"は何気に別物だけどその辺脳内補完よろしく
ありがとうございます. 17様、21様のやり方で考えてみます。
2つの時刻の和を表示する プログラムがわかりません。 一応ここまでできました。 #include <stdio.h> typedef struct date_time{ int hour; int minute; }ST_TIME; ST_TIME add_time(ST_TIME x,ST_TIME y); int main(void){ ST_TIME jikoku[2],diff; int i; for(i=0;i<2;i++){ printf("jikoku[%d].hour :",i); scanf("%d",&jikoku[i].hour); printf("jikoku[%d].minute:",i); scanf("%d",&jikoku[i].minute); } diff=add_time(jikoku[0],jikoku[1]); printf("時刻の和は、%d:%02d です。\n",diff.hour,diff.minute); return 0; } ST_TIME add_time(ST_TIME x,ST_TIME y){ ここまでできました。 教えて下さい。
27 :
デフォルトの名無しさん :02/11/06 18:55
ST_TIME add_time(ST_TIME x,ST_TIME y){ ST_TIME sum; sum.hour = x.hour + y.hour; sum.minute = x.minute + y.minute; return sum; }
28 :
デフォルトの名無しさん :02/11/06 18:56
sum.minute = x.minute + y.minute; while (sum.minute >= 60) { sum.minute -= 60; sum.hour++; }
sum.minute = x.minute + y.minute; sum.hour = x.hour + y.hour + sum.minute / 60; sum.minute %= 60;
時刻に時刻を足すなんて・・・そもそも意味不明じゃん・・・ 時刻に時間を足すんならわかるが・・・・
>28 >29 return sum; } って最後につけますか?
ST_TIME add_time(ST_TIME x,ST_TIME y){ ST_TIME sum; sum.minute = x.minute + y.minute; sum.hour = x.hour + y.hour + sum.minute / 60; sum.minute %= 60; return sum; }
ST_TIME sum; のsumって何の事ですか?
Jishohike
summer_time
36 :
デフォルトの名無しさん :02/11/06 23:27
あぁ、踊りの得意な
2つの時刻の和を表示する プログラムが何ですが、 60分は1時間 24時間は1日 とします。これはプログラムの 1部なんですが、何処が違って ますか?教えて下さい。 ST_TIME add_time(ST_TIME x,ST_TIME y){ ST_TIME sum; sum.hour = x.hour + y.hour; sum.minute = x.minute + y.minute; sum.day = sum.hour/24 while(sum.minute >= 60) { sum.minute -= 60; sum.hour++; } while(sum.hour >= 24) { sum.hour -= 24; sum.day++; } return sum; }
>>37 >何処が違ってますか?教えて下さい。
実行してみれば分かるじゃん。
実行したら、日がうまくでません。
41 :
デフォルトの名無しさん :02/11/07 22:20
sum.day = sum.hour/24
同じですが、>26は時刻の合計が 24時間を越えても、 時間の桁上がりが生じなかったのです。 今度は24時間を1日とカウントします。
43 :
デフォルトの名無しさん :02/11/07 22:22
ST_TIME add_time(ST_TIME x,ST_TIME y){ ST_TIME sum; sum.minute = x.minute + y.minute; sum.hour = x.hour + y.hour +sum.minute/60; sum.day = x.day + y.day + sum.hour/24; sum.minute %= 60; sum.hour %= 24; return sum; }
>>1 (´-`).。oO(「悩むの問題」ってなんだよ…)
>43 while文などを使ってはできませんか?
46 :
デフォルトの名無しさん :02/11/07 22:27
>>45 できるけど、何で必要なの?
使わない方がすっきりしてると思うし。
void norm_time(ST_TIME *t)
{
t->hour += t->minute / 60; t->minute %= 60;
t->day += t->hour / 24; t->hour %= 24;
}
ST_TIME add_time(ST_TIME x,ST_TIME y){
x.minute += y.minute;
x.hour += y.hour;
x.day += y.day;
norm_time(&x);
return x;
}
norm_time() は、引き算とかに流用できる。
>47 確かにそうなのですが、>43のプログラム以外の プログラムが勉強のために欲しかったのです。 ありがとうございました。
どうせ課題で「whileを使うこと」みたいな条件がでてるんだろ。
>50 でてない。 構造体の課題で、whileを使うかどうかなんて 関係ないでしょ
つーか、腕試しなら人に訊くな。
>>50 つーか、結局課題なのかよ。
自分で解けよ。
>>53 いや、ここはそのためのスレじゃないのか?
OnDraw関数のなかで以下のように線画を描画しました。 double kakudo = 0.0; double pai = 3.14159265; double rad = pai / 180; double rad1 = kakudo * rad, rad2 = (kakudo + 180) * rad; POINT start, center, end; double r = 30.0; center.x = 90; center.y = 90; start.x = (int)(r * cos( rad1 )) + center.x; start.y = (int)(r * sin( rad1 )) + center.y; end.x = (int)(r * cos( rad2 )) + center.x; end.y = (int)(r * sin( rad2 )) + center.y; pDC->MoveTo(start); pDC->LineTo(end); メッセージハンドラOnLBUTTONDOWNを用いてkakudoの値を制御し、 線画の再描画を促すようにしたいのですがわかりません。 (線画が画面内で一回左クリックする毎にkakudoの値をインクリメントし、 傾きが増していくといった感じです。)
61 :
デフォルトの名無しさん :02/11/08 12:34
メッセージハンドラを持つクラスでkakudoをメンバ変数にしたら。
62 :
デフォルトの名無しさん :02/11/08 14:56
C言語の勉強を始めた者ですが ファイルを読み込むプログラムで char string[10] の配列の中に 12_15_____ (_は空白です ) ていうふうに数字(char型)で入っているときに 12と15という数字を二つ取り出す(int型の変数として使いたい)にはどうすれば良いのでしょう?? ちなみに12とか15が124と4みたいに3桁になったり1桁になった時にもちゃんと取り出したいのですが・・・ お願いします!!
sscanf
64 :
こういうことか?&rlo;?かとこういうこ :02/11/08 15:06
>>62 #include<stdio.h>
int main(void)
{
char string[10];
char *p;
string[0]=12; /* *(string+0)=12 */
string[2]=15; /* *(string+2)=15 */
p=string; /* p=&string[0] */
printf("char[0]..%d,char[2]..%d",*p,*p+2);
return 0;
}
早速レス感謝 言葉足らずでした。なにせC言語がよくわからないもので・・・ 実は参考にしたプログラム(ファイルの読み込むプログラム)で fgets(string, 200, fp); sscanf( string, "%d", &val ); という感じの部分があるのですが fgets(string, 200, fp); というのは これはfpファイルの一行をstringに入れなさい!みたいな意味ですよね?? sscanf(string, "%d", &val ); それでその後のこれは 読み込んだstringをvalという変数に10進数でいれなさい!みたいな意味ですよね?? これを実行するとあたり前なのかもしれないですが 14_12______ というのがもとのファイルだと 14という数字しか認識されずに12というデータがなくなってしまいます。 12という数字を読み取るにはどうすれば良いのでしょう??
66 :
デフォルトの名無しさん :02/11/08 15:10
sscanf(string, "%d %d", &val, &val2 );
67 :
デフォルトの名無しさん :02/11/08 15:13
>>65 人に聞くときは、初心者であろうが、凡人であろうが
実装プログラムを書くのが一般的。
>>66 ありがとうございます!できました!!
この2日間の悩みが解決できました。感謝です
>>67 ご指摘感謝
次回お世話になる時はそうします
#include <stdio.h> #include <string.h> #define TINTERVAL 4500000 int main() { int i,j, k; char *a = "This is a test"; char *b; printf("%s\n", a); for (k=0; k < 5; k++) { /* forward */ b =a; /* point to first character */ for (i=0; i <=strlen(a); i++){ if (i > 0) { /* 必要なだけスペース出力 */ for (j = 0; j < i; j++) printf(" "); }
70 :
両津勘吉@つづきです :02/11/08 16:16
} if (i < strlen(a)) { printf("%c\r", *b); } else { printf("\r"); } fflush(stdout); b++; /* sleep(1); 少しポーズする */ for (j=0; j < TINTERNAL; j++) { } } printf("\n"); return 0; } 大ピンチになっています。上のプログラムを改良して両津勘吉という名前を 一文字づつ表示するプログラムはなんとかできました。 でもそこは提出しなくていいらしくて、今度はそれを改良して、両津勘吉という文字を、 一文字づつ左に表示して、左端についたら次に右に一文字づつ 表示するプログラムを作りたいのです。 どなたか暇な方がいたらよろしくお願いします。
出力例 1 吉 2 勘 3 津 4 両 5 津 6 勘 7 吉 どなたか助けてくださいお願いします
1 吉 2 勘 3 津 4 両 5 津 6 勘 7 吉
左端って右端から何文字目って決まっているの?
というか、そもそも、「上のプログラム」が正しく動かないんだが。 Win32Consoleだからなのか?
#include <stdio.h> #include <string.h> #include <wchar.h> #include <locale.h> #include <windows.h> int wmain() { int k; wchar_t *a = L"両津勘吉"; int len = wcslen( a ); setlocale(LC_ALL, "jpn"); wprintf(L"%s\n", a); for (k=-len+1; k < len+1; k++) { wchar_t *b = &a[ abs(k)]; if( k ) wprintf(L"%*c", abs(k)*2 , L' '); wprintf(L"%c%*c\r", *b, (len-abs(k))*2, L' '); Sleep(1000); } wprintf(L"\n"); return 0; } つーか、これでいいのか?
>>75 さん
いまCCがうまくいきますた。何とかなりそうですありがとうございます。
CCってカードキャプター?
1.足し算関数を作成しなさい int hoge( short* a, short b ) 引数 short* a 加算先 short b 加算数 戻値0 正常 1 加算でオーバーフロー …という問題が出されたんですけど、わかりません。
#include<stdio.h> #include<stdlib.h> short *wk; int hoge( short *a, short b ); int hoge( short *a, short b ) { int c=0; printf("%d",wk); if(abs((long)a+ (long)b)>0x7fffL)return(1); elsereturn(0); } void main(void) { short b; while(!(hoge(wk,b))) { rewind(stdin); printf("input num... >"); scanf("%d",&b); printf("%d\n",hoge(wk,b)); } } なんとかここまでできたんですけど、どなたか助けていただけませんか?
>>79 *a == -30000
b = -30000
だった場合どうするの?
= が一個抜けた…
>>79 ??ただ単に、
int hoge( short *a, short b ) {
int res = *a + (int)b;
if ( res > SHRT_MAX || res < SHRT_MIN ) return 1;
*a = res;
return 0;
}
こういうことじゃないの?
>>81 abs()で絶対値とってるからオーバーフローになると思います。
>>83 そうだったんですか…
ありがとうございました。
>>84 80ちゃんと読んでなかった。
アンダーフローの場合は?て聞こうとしたんだけど、
調べてみたらアンダーフローを勘違いしていることが
わかった。
スマン
87 :
デフォルトの名無しさん :02/11/09 02:00
C++Builder 5で作っているんですが、コマンドプロンプト内に四角の箱を書き その中に文字を入れるにはどうすればよろしいんでしょうか。。 windows.hを使ったような覚えがあるのですが忘れてしまって
>>87 ちょっと待て。
コンソールウィンドウにテキストボックスを置こうと言うのか?
標準の方法で自分のコンソールウィンドウのハンドルを捕らえるのは無理だが。
普通に標準入力から読むわけには逝かないのか?
89 :
デフォルトの名無しさん :02/11/09 02:35
VC++6.0なんだけど #include <vector> ・ ・ ・ vector<int> vct; と宣言してもエラーが出るよーっ! 使い方教えて!
using namespace std;
あるいは std::vector<int> vct; 名前空間を知ってね。
>>88 Borland C++ Compiler 5.5でした・・・
DOSプログラムを作っているのですが、おっしゃる通りコンソールウィンドウ(DOS画面)に
テキストボックスを作ろうとしているのです
なにやらDOSでタイピング練習ソフトを作れという課題でして、悩んでます
>>92 だから・・・。
普通に標準入力から読むわけには逝かないのか?
やってできない事は無いかもしれないが、確実な方法を実装できたらそれは神だぞ。
「コンソールウィンドウのハンドルを捕らえるのは無理」 = 「どのウィンドウに
テキストボックスを作ればいいか判断できない」 わけだから。
あれじゃねーの、 printf("┌───────────┐"); みたいな。
95 :
デフォルトの名無しさん :02/11/09 22:09
はさみうち法の問題なんですが、以下のプログラム書いたんですが、 汎用的にする改良や、使いやすくするための改良などを考えたいんですが、 どうしたら良いでしょうか? マクロとか、グローバル変数、乗算などの減少などくらいでしょうか… #include <stdio.h> double m = 4.0, n = 8.0, mn = m*n,a0 = ((1 - n*n)*mn),a1 = (3*mn*n - m), a2 = (-3*mn),a3 = m; double f( double x ); void main (void) { double q0, q1, q2; int k, i; k = 31; q0 = n - 0.5; q1 = n + 0.5; if ( f( q0 )*f( q1 ) < 0 ){ for ( i = 1; i <= k; i++ ){ q2 = ( f( q1 )*q0 - f( q0 )*q1 )/( f( q1 ) - f( q0 ) ); printf( "k =%3d x = %12.4le\n", i, q2 ); if ( f( q2 )*f( q1 ) > 0 ){ q0 = q2; }
else q1 = q2; if ( q2/8.0 >= 0.99 ){ break; } } printf( "真の解との誤差1%%以下を得るのに必要な回数は%dです。\n",i ); } else printf( "初期値エラー\n" ); } double f( double x ) { double y; y = a3*x*x*x + a2*x*x + a1*x + a0; return y; }
97 :
デフォルトの名無しさん :02/11/09 22:13
「DOSでタイピング練習ソフトを作れ」と 「それにはテキストボックスが必要」 と考えるにいたる経緯に興味がある。
98 :
デフォルトの名無しさん :02/11/09 22:13
どう使いやすくしたいのかわからん。
printf("┌───────────┐"); printf("┌ABCDEFGHIJK┐"); printf("┌LMNOPQRSTUV┐"); printf("┌CUTXYZ・・・・・┐"); printf("└───────────┘"); とでもしておけ。
100 :
デフォルトの名無しさん :02/11/09 22:35
ぱっと見
>>95 変数見づらい。
オブジェクト化するなら
メンバ変数に vector<double> hoge
を使ってf(x)のn次関数を管理か。
hoge[n]でf(x)の係数を格納。
101 :
デフォルトの名無しさん :02/11/09 22:36
printf("┌───────────┐"); printf("|ABCDEFGHIJK|"); printf("|LMNOPQRSTUV|"); printf("|CUTXYZ・・・・・|"); printf("└───────────┘"); とでもしておけ。
102 :
デフォルトの名無しさん :02/11/09 22:37
bccにはリソースエディタついてないんですか?
104 :
デフォルトの名無しさん :02/11/09 22:41
printf("┏━━━━━━━━━━┓\n"); printf("┃A B C D E F G H I J K ┃\n"); printf("┃L M N O P Q R S T U ┃\n"); printf("┃V W X Y Z .┃\n"); printf("┗━━━━━━━━━━┛\n"); とかこういうことだったりして名w
105 :
デフォルトの名無しさん :02/11/09 22:42
煩悩
109 :
デフォルトの名無しさん :02/11/09 23:05
intのベクタを作って、 10個予約して、 イテレータでベクタの先頭を見て、 イテレータを進めて、 1を入れたら実行時エラー。 vector<int> a; a.reserve(10); vector<int>::iterator i = a.begin(); ++i; a.insert(i, 1); // ここでエラー これってなんかまずいことやってるんですか?
>>100 変数は、何か単語みたいなの方が良いんでしょうか?
「使いやすさ」という点でそこら辺を考慮してみて、考察したいと思います。
オブジェクト化…(以下略
は、ちょっと良く意味が分からないので、調べてみます。
レスありがとうございました。
>>103 そうです、汎用化したいのです。#Define とか使えそうですかね?
>>106 今から見てみます。わざわざありがとうございます。
>>107 ???
111 :
デフォルトの名無しさん :02/11/09 23:06
a[i]=1;
誤 106 正 103
誤 103 正 106
>>113 メンバって構造体とかあの辺でしょうか?
実はまだ習ってないんです。いい機会なんでそこら辺読んで見ます。
乗算ってなるべく回数減らすように、うまく変形したほうが良いんですよね?
pow()ってのがありますが、これはアルゴリズム的にあまり優れてないんでしょうか?
これはlog計算してからというように遠回り(?)してるので、効率的でないと
聞いたことがあります。どうでしょうか?
>>109 a.reserve(10); → a.resize(10);
>>113 なかなか2分法・・・手ごわいです。
>pow
えっ・・・、普通にpowで組んでいますが。
そこまで速度は変わるものではないと勝手に思い込んで作っちゃっています。
こういうのか? ax^3+bx^2+cx+d ((ax+b)x+c)x+d
>>118 いや、このくらいのプログラミングなら問題ないんですがね…
自分がやってるのは詳しく言うと、
f(x) = mx^3 - 3mnx^2 + (3mn^2 - m)x -mn^3 + mn
って、式があって、mとnは各人違う値が与えられて、
その解の一つの前後0.5で、はさみうちを実行して、真の解に対して1%
以下の誤差になるまで何回計算したらいいのか?
って感じです。
しかし、収束が早いのか1回で求まる。
ニュートン法も1回でした。2次収束でこれだけ速いのか…
>>119 そうです。そういうことです。乗算の回数はできるだけ減らしたほうが
効率はあがりそうですから。加算に比べて乗算は4,5倍遅いって聞いたことあるので。
>>116 double使ってる時点であんまり関係ないと思う。
再帰的にX^nを求めてやってX^2〜X^nをどこかに
ストックして再利用すれば、計算は減らせるね。
挟み込むべき点を導関数で求めてやる時にも
使えそうだし。
>>122 そっか〜。では、m,nをintにして、キャストしてみるってのはどうでしょう?
>>120 間違った…
nの前後ではさみうちだった…
とりあえず風呂入って考えてきます。
>>125 そうですが、この場合は整数しかみんな与えられませんでしたので。
しかし、汎用性を考えるとやはりdoubleか。
q2 = ( f( q1 )*q0 - f( q0 )*q1 )/( f( q1 ) - f( q0 ) ); はさみうちってこうやるの? q2 = (q0+q1)/2; かと思った。
>>95 汎用設計は、ほぼ出来たよー。
、て言うかクラスのヘッダー部分だけ('д';)
方程式の計算等はみんなの方が詳しそうだから任せたー。
>>127 if ( f( q2 )*f( q1 ) > 0 ){
q0 = q2;
}
else
q1 = q2;
とあるじゃん。
少し違うけど。
>>95 長く考えた結果、こんなものしか出来なかったんですが。
class Func{
private:
vector<double>hoge;//係数を格納
double calc(double x);//xで求まる任意の数を計算
public:
Func(vector<double>);
//関数名:GetSol(2分法)
//引数eは誤差
//誤差が不適切だと計算が終わらなかったりするので注意。
//a,bが異符号であるチェックを仕込んでくれ
double GetSol(double a,double, b,double e);
//以下、ニュートン法等色々な関数が並ぶ事になる
//double GetSol(...);
//double GetSol(...);
//operator等仕込むと、更に汎用性が高くなって面白いかも。
};
>>127 なんすか、それ?平均?
>>130 ありがとうございます。
しかし、見たことないのが一杯…く、くらす?
もしやC++っすか?すみません、Cの課題なんです。
言ってなかったですね。本当に申し訳ないです。
>>95 こんなんどう?作ってたら、いろいろ手が入っちゃった。
int hasami(double (*f)(double), double q0, double q1, double dx, double* x)
{
int k = 0;
double q, f_q0, f_q1, f_q;
f_q0 = f(q0);
f_q1 = f(q1);
if (f_q0 * f_q1 < 0) {
for (;;) {
k += 1;
q = (f_q1 * q0 - f_q0 * q1) / (f_q1 - f_q0);
f_q = f(q);
// printf( "k =%d x = %12.4le\n", k, q);
if (f_q * f_q0 < 0 ){
q1 = q;
f_q1 = f_q;
} else if (f_q * f_q0 > 0 ){
q0 = q;
f_q0 = f_q;
} else {
break;
}
if (fabs(q1 - q0) <= dx){
break;
}
}
*x = q;
}
return k;
}
>>132 > double m = 4.0, n = 8.0, mn = m*n,a0 = ((1 - n*n)*mn),a1 = (3*mn*n - m),
> a2 = (-3*mn),a3 = m;
Cでコンパイルしたら、ここの部分が通らなかった。
なんで、オレもC++だと思って、C++でしかコンパイル通してない。
>>95 ま・・・まじっすか〜。~(°°;)))オロオロ(((;°°)~
しかし、こちらも勉強になりました・・・。
>>133 なるほど。はさみうち自体を関数にしてしまって、回数を戻すってことですか。
(*f)(double)とdouble* xは何なんでしょうか?後者は真値でしょうか?
>>134 え!?マジっすか?VisualC++でやってるからコンパイルできたんでしょうか?
しかし、
>>130 修正。
コンストラクタはdouble配列で渡すようにした方が汎用性よし。
SetFuncやらを追加して、関数の定義しなおしを定義するように
した方がいい。(その場合、コンストラクタをオーバーロードできて
いい感じかも)
もうぜんぜん関係なかったけど以上です。
>>137 double (*f)(double) 引数 double 戻り値 doubleの関数のポインタ。
double* x はxのポインタ。
将来Cを使い込むのであればポインタは理解しとくといい。
関数のポインタ f ってのは、 double Func(double a){ } という関数があるとき f=Funcと関数を値(アドレス)にできること。
x はxのポインタ-->x はdoubleのポインタ シマツタ
103ってイイ奴だな。
ってことは、 k = hasami( &f,q0, q1, 0.08,&x); printf("回数 = %d\n",k); って感じでいいんでしょうか? はさみうちを関数にしたほうが汎用性は高いですね。
>>145 そんな感じ。
なんでxも表示しないのか気になるけど。
147 :
デフォルトの名無しさん :02/11/10 14:13
ax + by + cz = d ex + fy + gz = h ix + jy + kz = l という連立方程式について、x,y,zについて解くプログラムを教えてください。 a〜lは任意の文字式です。
148 :
デフォルトの名無しさん :02/11/10 14:14
行列を勉強してください。
149 :
デフォルトの名無しさん :02/11/10 14:19
課題 1234と打ったら4321と表示されるようなプログラムを作成しなさい。 ただし、123400などの場合は4321とする。 ヒントは10で割った余りを使うらしいんですけど for文がいまいち理解できてないので分かりません。お願いします。
150 :
PROBLEM 1: Outdoor Cow Friends [Brian Dean] :02/11/10 14:25
Farmer John has N cows and K adjacent grazing fields in a row. Every morning, his cows leave the barn in a single-file line in a specified ordering. FJ leaves N1 contiguous cows at the front of the line in the first field, and continues with the rest of the fields, leaving N2 cows at the front of the line in the next field, and so on, until all of the cows have been deposited into some field. The cows stay in the fields in which they are deposited and do not move around. FJ's cows are very sociable, and each cow has a group of friends with whom she prefers to graze. Define a friendship as an unordered pair (i,j) such that cow i and cow j (i != j) prefer to graze in the same field. Here i and j are indices from 1..N indicating the cows' positions in the single-file line leaving the barn. We say a friendship (i,j) is satisfied if cows i and j end up grazing in the same field. Pairs are unique in the input. So, if (i,j) is in the input, it is listed only once, and (j,i) is not listed. Given a list of friendships, determine the placements of cows FJ should use in order to maximize the number of friendships that are satisfied. Your output will be the maximum number of friendships that can be satisfied. FJ insists that none of his K fields may remain empty and that no field contains only one cow, since that cow will then feel outcast. INPUT FORMAT: * Line 1: Three integers, N, K, 4 <= 2*K <= N <= 150, and F (1 <= F <= 200), the number of friendships. * Lines 2..F+1: Each line contains a two integer friendship pair, each integer is in the range 1..N.
151 :
デフォルトの名無しさん :02/11/10 14:53
y=x*10+z%10; z=z/10;
>>149 #include <stdio.h>
main()
{
char b[256];
gets(b);
if((!strcmp(b,"1234"))||(!strcmp(b,"123400など")))
puts("4321");
return 0;
}
#include <stdio.h> #include <math.h> int main(void) { int data[8]; int num_i; int num_o=0; int i,x; printf("8桁の整数を入力してください:"); scanf("%d",&num_i); for(i=0;i<8;i++) { data[i]=num_i%10; num_i/=10; } for(i=0;data[i]==0;i++) ; for(;i<8;i++) num_o+=data[i]*pow(10,(7-i)); printf("%d\n",num_o); return(0); }
157 :
デフォルトの名無しさん :02/11/10 15:24
専修って、専門って意味?
専修大学ネットワーク情報学部
違う大学ですが・・・
160 :
デフォルトの名無しさん :02/11/10 15:41
あ、専修って大学があるのね。
154のプログラムだと8桁以外はうまくいかないんですが。 あと123400などの場合は4321ってのも。
162 :
デフォルトの名無しさん :02/11/10 15:52
>>161 当たり前だろ。配列数8なんだから…
00のところは条件判断で捨てればいいんじゃないの?
>>161 #include <stdio.h>
#include <math.h>
int main(void)
{
int data[8];
int num_i;
int num_o=0;
int i;
int count=0;
printf("8桁までの整数を入力してください:");
scanf("%d",&num_i);
for(i=0;;i++)
{
data[i]=num_i%10;
count++;
if((num_i/10)<1)
break;
num_i/=10;
}
for(i=0;data[i]==0;i++)
;
for(;i<count;i++)
num_o+=data[i]*pow(10,((count-1)-i));
printf("%d\n",num_o);
return(0);
}
8桁までだから、そこはお前が欲しい最大の桁に変えればいいべ。
166 :
デフォルトの名無しさん :02/11/10 15:59
>>163 それでscanfして勝手に灰列数変えればいいか。マクロ使ったほうが良さそう。
たしか配列使わなくてもできるって言ってました。
>>167 #include <stdio.h>
int main()
{
int x;
printf("整数を入力してください");
scanf("%d",&x);
while(x != 0){
if( x - ( (x / 10) * 10 ) != 0 ){
printf("%d",x - (x / 10) * 10 );
}
x /= 10;
}
printf("\n");
return(0);
}
ということで、出かけてきます。
#include <stdio.h> int main() { int x, y=0; printf("整数を入力してください"); scanf("%d",&x); for(;x != 0;x /= 10) y=y*10+x%10; printf("%d\n", y); return 0; }
#include <stdio.h> int main() { int x; scanf("%d", &x); do { printf("%d", x % 10); x /= 10; } while (x); printf("\n"); return 0; }
>>169 だと
1001とか入れたら11にならん?
>>175 なるな。
0入れたら何も出てこないし。
#include <stdio.h> int main(void) { int target, print, zeroFlag=0; scanf( "%d", &target ); if ( target == 0) {/*めんどかったので特殊扱い*/ printf("0"); } do { print = target % 10; if ( print > 0 && zeroFlag == 0 ) { zeroFlag = 1; } if ( zeroFlag == 1 ) { printf( "%d", print ); } } while ( target = target / 10, target > 0 ); printf("\n"); return 0; }
178 :
デフォルトの名無しさん :02/11/10 22:05
179 :
デフォルトの名無しさん :02/11/10 22:10
みんなスマートに書いてるのに なんでオレはこんなに長ったらしくなるんだろう。
あら、間違ってるわ(汗) 逝ってきます。
一応)コンパイラはbccです。
ソースうぷ板の29,31-32さんThanxです。 確かに値渡のほうが楽です。 ポインタなんて使う必要ないね(この場合)。 でもなんであんなことが起こったんだろう。 やっぱりkを初期化してなかったから k*=10 で何らかの不具合が出たのかな。
>>182 int change_num(int num)
{
int j,k = 0;
while (num > 0) {
j = num % 10;
num /= 10;
k = k * 10 + j;
}
return k;
}
int change_num(int num) { int k = 0; for (; num; num /= 10) k = k*10 + num%10; return k; }
185 :
takeru :02/11/11 16:01
#include <stdio.h> #include <string.h> #define TINTERVAL 4500000 int main() { int i,j, k; char *a = "yaamada takeru"; char *b; printf("%s\n", a); for (k=0; k < 5; k++) { b =a; for (i=0; i <=strlen(a); i++){ if (i > 0) { /* 必要なだけスペース出力*/ for (j = 0; j < i; j++) printf(" "); } if (i < strlen(a)) { printf("%c\r", *b); } else { printf("\r"); } fflush(stdout); b++;
186 :
takeru@つづき :02/11/11 16:03
* sleep(1); 少しポーズする */ for (j=0; j < TINTERVAL; j++) { } } /*行を消去 (一行文のスペース出力) */ printf(" \r"); } printf("\n"); return 0; } 上のプログラムを改良して自分の名前を一文字ずつ左に表示して左端についたら 逆に右に一文字ずつ表示するプログラムをつくれ。 ぼくにはこれ以上無理です。どなたかお願いします。
187 :
デフォルトの名無しさん :02/11/11 16:06
マルチはやめれ。
takeruはこれ以上無理だそうなのでこれ以上助言しても無駄です。
189 :
takeru :02/11/11 16:22
宿題手伝いますyo! のほうの819のやつもCCはできてもa.outするとうまくいかない・・・ あきらめたほうがいいっぽいです・・・・ いろいろおしえてくれたみなさま。おれがアホですいません・・。 あと宿題手伝いますYO!の818のひともありがとうございました。 ただ主旨が少し勘違いされてしまいました・・・。 あといっかい出さないと補習だな・・・・・・
>>189 正直なところ補習を受けたほうが長い目で見るとおまえのためだろ。
最後に書きこんでから実験のレポートやっててこのスレ見てなかったから
>>169 のプログラムで提出しちゃった。
0のときはif文でやっといたけど。
協力してくれたみなさん、ありがとー。
192 :
デフォルトの名無しさん :02/11/12 00:31
こんな宿題です。 Borland C++ Compailerのbcc32.exeの32のところが 意味する内容を答えなさい。 32ビットてのはわかるんですが、何の32ビットなのか ?であります。よろしこです。
CPUのビット数
194 :
デフォルトの名無しさん :02/11/12 00:36
>>193 32ビットのCPUに対応するコンパイラですよー
て意味で大丈夫でしょうか?、
195 :
デフォルトの名無しさん :02/11/12 00:38
CPUの標準的な転送ビット数 なぜ標準的なのかはMMXが64転送できるから
196 :
デフォルトの名無しさん :02/11/12 00:39
>>195 となると、
CPUに最高32ビットで処理させるコンパイラですよー
て意味ですよね?
197 :
デフォルトの名無しさん :02/11/12 00:41
198 :
デフォルトの名無しさん :02/11/12 00:41
199 :
デフォルトの名無しさん :02/11/12 00:46
>>32 ビットのCPUに対応するコンパイラですよー
こっちの方が正しいかも。。。
80x86系32bitモード用コンパイラだろ
201 :
デフォルトの名無しさん :02/11/12 00:52
先生、よくわからないのですが##の使い方教えてください。 どういう時に使うのですか?
コメントを見やすくする /* ################## ATTENTION!! ################## */
204 :
デフォルトの名無しさん :02/11/12 01:04
で、ちゃんと説明してくれる人はいるんですかね?
##ってマクロで使うやつでしょ。
不満じゃよ。とにかく##が好きなんじゃよ。da##yo好きなんじゃよ。
>>201 ##fusianasan[名前]
で書き込みすると、IDの位置と名前の位置が反転するんだよ。
終了。
209 :
デフォルトの名無しさん :02/11/12 01:17
>>208 fusianasan##[名前]
の間違いじゃないのか?##fusianasan[名前] だとトリップが出てしまうぞ。
現在VC++6.0を使い始めましたがメッセージボックスで『はい』を選んだらプログラムが終了する ようにしたいのですが、まったくわかりません。どなたかちか力を貸していただけませんで しょうか。
>>201 「書き込みすると」よくわかりません先生。
if(MessageBox(HWND_DESKTOP,"終了しますか?","確認",MB_OKCANCEL)==IDOK) PostQuitMessage(0);
終了の仕方とメッセージボックスを調べれ。
ANSIはここで聞くな。 終了。
レスありがとうございます。『はい』『いいえ』で『はい』をクリックすると プログラムが終了するようにしたいのですがその場合はどのように記述すればいいでしょうか?
>>215 MSDN で MessageBox を調べれ。
とってもわかりません。
>>217 あなたが何がわからないのか、とってもわかりません。
219 :
デフォルトの名無しさん :02/11/12 02:26
if(MessageBox(HWND_DESKTOP,"終了しますか?","確認",MB_YESNO)==IDYES) PostQuitMessage(0);
いちいち HWND_DESKTOP って書かなくても、NULL でいいと思うの
そこを記述するとerror C2660: 'MessageBoxA' : 関数が不正な 4 個の実引数をともなって呼び出されました。 って出てしまうんですがなぜでしょう?
>>221 ・・・メッセージボックスで終了確認の前に、ちゃんと動くプログラムは書けてる?
::Messa〜 ってかけ。理由は知らなくてよい。
メッセージボックス以外のプログラムはまだ書いていないです・・・
>>223 原因はそれじゃない。221 のエラーメッセージを良く見ろ。
多分 210 の求めてるコードじゃないが、210 に書かれてる要件は満たしてる。 #include <windows.h> int main() { for(; ; ) if(MessageBox(HWND_DESKTOP,"終了しますか?","確認",MB_YESNO)==IDYES) break; return 0; }
HWND_DESKTOPの部分をとりましたらとりあえず動きますのでありがとうございました。
質問1 Stack Overflow 0xC00000FDというエラーが出て困ってます。 原因を考えるに hairetu[1000][1000] というようなことをしているのですが、ここが原因と考えて良いのでしょうか? 質問2 そこで、 動的に二次元配列を確保すると良いと書いてあったので int size = 1000; int **hairetu, hairetu = (int **)malloc(sizeof(int *)*size); for(int i=0;i<size;i++) hairetu[i] = (int *)malloc(sizeof(int)*size); if(image_in=NULL){ fprintf(stderr,"メモリが足りません!\n"); exit(1); } というプログラムをネットで見つけたので書いたのですが動きません。 エラーは error C2040: 'hairetu' : 'int' は 'int ** ' と間接操作のレベルが異なります。 というものです。 このプログラムのバグを教えてください。 また、これで結果としてhairetu[1000][1000]というものが確保できるのでしょうか? 是非、助けてやってください
実際のコードみないとわかんないよ。 これでhairetu[i][j]でアクセスできるけど。
すみません。 今全文を投稿しようと思っていたら、エラーの場所に気づきました。 int **hairetu, じゃなくて int **hairetu; ですよね。お騒がせしました。 ところで、この配列の宣言方法は 結果的には hairetu[1000][1000] と全く同じ扱いができるってことなのですか??
>>231 全くでもない。関数にこの値を引き渡す時、
void func(int (*)[1000])では受けられない。
void func(int **)で受けること。
>>192 Borland C++ Compailerのbcc32.exeの32のところが意味する..
その課題の期待するところは一体なんなのだろう....
商品名の由来は商品を作った会社の営業にきくのが正しいです。
# ここ、流れるの速いな...
234 :
◆vhNvUwv9iI :02/11/12 23:24
#define VAR(i,j) (i##j) VAR(x,6) の呼び出しは,(x6) に展開されます。
Turbo C++ に在った説明。
>>234 それは調べたんだけど、どうつかったらいいかわからん。
普通に x6 と書けない場面があるのかな。
>>236 ウインドうすのメッセージク落下とかで使われてる。
う〜ん、文字列を繋げるとか・・・か?
"x" "6" でいいし。
どこかのヘッダファイルに #define DUMMY /##/ ってのがあったな。
構造体の変わりに・・・
Q.指定した文字が文字列中に含まれる回数、指定した文字が含まれている文字列中の位置を調べる。 どこが間違ってるかよくわかりません。よろしくお願いします。 1#include<stdio.h> 2 main(){ 3 char a[100],b[1]; 4 int i,count=0;
5 printf(" Input string >> "); 6 scanf("%s",a); 7 printf(" Input character >> "); 8 scanf("%s",b); 9 for(i=0; a[i]!='\0'; i++){ 10 if(a[i]==b[0]){ 11 count++; 12 } 13 printf("a_cnt = %d\n",i); 14 printf("a[]= Number of %s = %d\n",b,count); 15 } 16 exit(0); 17 }
間違いと関係あるのかどうかシランが、 bの長さ1しかないのにscanfなんかしていいのか?
245 :
デフォルトの名無しさん :02/11/13 02:59
#include<stdio.h> main(){ char a[100], b[1]; int i,count=0; printf(" Input string >> "); scanf("%s",a); printf(" Input character >> "); scanf("%s",b); for(i=0; a[i]!='\0'; i++){ if(a[i]==b[0]){ count++; printf("a_cnt = %d\n",i); } } printf("a[]= Number of %s = %d\n", b, count); return 0; }
長さが1だとscanfしてはだめなんですか・・・ 知りませんでした。getsでいてみます
247 :
デフォルトの名無しさん :02/11/13 02:59
fgets使え。
248 :
デフォルトの名無しさん :02/11/13 03:00
char b; scanf(" %c",&b);
すみませんエラーがこのように出ます。 Input string >> afafe Input character >> a_cnt = 0 a[]= Number of (null) = 0 a_cnt = 1 a[]= Number of (null) = 0 a_cnt = 2 a[]= Number of (null) = 0 a_cnt = 3 a[]= Number of (null) = 0 a_cnt = 4 a[]= Number of (null) = 0
あと、指定した文字が文字列中に含まれる位置を示す関数を作ってみたんですが、 文字の文字列中の最後の位置だけしか返すことしか分かりませんでした。 すべての位置を返すアルゴリズムアドバイスいただけるとうれしいです。 int serchchr(char str[], char c) { int i, a=0; for(i=0; str[i]!='\0'; i++) { if (str[i]==c) { a=i; } } return a; }
251 :
デフォルトの名無しさん :02/11/13 03:17
for (s = str; s = strchr(s, c); ) printf("%d,", s-str);
>>251 ありがとうございます。
何をやっているかちょっと分からないので解読したあと組み込んでみます。
253 :
デフォルトの名無しさん :02/11/13 03:29
身長のデータを次々に入力し平均を算出するプログラムを作成せよ。ただし、 入力データは男女混合なので、平均は、男女別に算出。入力データは、 身長データの前に男ならM、女ならFがあるものとする。 M178 F160 : : : 誰かやって下さい。わからんです。
254 :
デフォルトの名無しさん :02/11/13 03:39
#include <stdio.h> #include <stdlib.h> void main() { int msum=0, fsum=0, mcount=0, fcount=0; char buf[100]; while (gets(buf)) { if (buf[0] == 'M') { msum += atoi(buf+1); mcount++; } else if (buf[0] == 'F') { fsum += atoi(buf+1); fcount++; } } printf("男平均:%f\n", mcount?(double)msum/mcount:0); printf("女平均:%f\n", fcount?(double)fsum/fcount:0); }
255 :
デフォルトの名無しさん :02/11/13 04:17
ようやく出来たよ・・・。苦労だったな屑ども。 まあお前等如きに敬語使っちまったけど、一度出来ちまえば用なしよ。 さっさと氏ねばーか。検索なんてくだらねーこといってるんじゃねーよ。 チョン キチガイ ばーかばーかばーか うひゃひゃひゃ 俺に利用されて悔しいか? 精々喚いてろチンカスども。
>>255 いちいち悔しがってたら2chねらなんかやってられん。
というか人生ガンバレヨ。その調子だと将来大変だろうが。
がんばれよ。クリスマスまでに彼女できるといいな。
>>255 HTMLのタグが編集できたぐらいでC/C++スレ来んな。
なんか可哀想な人が現れたの?
すみません。もうすずめが鳴きそうでかなりあさってる242です。 int str[100],b; scanf("%s",str) /*文字列strを記憶*/ scanf("%c",b) /*文字列bを記憶*/ printf("%s %c",str,b) /*str,bを印字*/ これだと、いろいろ調べた結果、str(文字列)、改行の順で記憶するらしくbが記憶されないらしくて困ってます。 gets()使ってみたんですが、コンパイルエラーでました。(gcc使ってます) fgetsはファイルポインタなしでつくれとのことなのでこれなしでつくりたいです。 誰かほんと困ってますので助けてください!
261 :
デフォルトの名無しさん :02/11/13 05:18
scanf(" %c",b)
262 :
デフォルトの名無しさん :02/11/13 05:20
char str[100], b; scanf(" %c",&b)
配列とポインタの関係をいいだすと、多分2週間ぐらい徹夜するはめ になるので、黙ってそういうもんだとおもっといたほうがいい。
できました!
ほんと感謝します!
>>263 ポインタなんかもやもや感がとれないのでポインタの本図書館で借りてきます。
文字列中に含まれる文字の数と
文字列中の文字の最後の場所を印字するとこまでできました。
あとは
>>251 さんのを解読して組み込むだけです。
みなさんレスどうもありがとうございました。
char *s; for (s = str; s = strchr(s, c); ) printf("%d,", s-str+1); printf("\n"); で動くかな。ベタに表示するだけだが。
>>251 できました!
わざわざ最後までつきあってくれてほんとありがとうござした。
こころが休まりました。
267 :
デフォルトの名無しさん :02/11/13 05:58
ようやく出来たよ・・・。苦労だったな屑ども。 まあお前等如きに敬語使っちまったけど、一度出来ちまえば用なしよ。 さっさと氏ねばーか。検索なんてくだらねーこといってるんじゃねーよ。 チョン キチガイ ばーかばーかばーか うひゃひゃひゃ 俺に利用されて悔しいか? 精々喚いてろチンカスども。
がんばれよ。クリスマスまでに彼女できるといいな。
>>267 いちいち悔しがってたら2chねらなんかやってられん。
というか人生ガンバレヨ。その調子だと将来大変だろうが。
>>267 HTMLのタグが編集できたぐらいでC/C++スレ来んな。
なんか可哀想な人が現れたの?
あと30分くらいしたら問題をうpいたします。 神の降臨をお待ちしております。
うpしてたもう。 答えてやろうぞ。
神キタ━(・∀・)━!
おながいします。 てか毎週この時間に出現しますので今後ともおながいします。
問題うpしてないじゃん
問題マダァー?
278 :
[無知無能の神] :02/11/13 16:44
問題来らば全精力を注いで解くなり 今すぐうpするのじゃああああ
イパーイツレタ
無知無能ってよりムチ不能の神だったりしてな
282 :
デフォルトの名無しさん :02/11/13 18:30
モンテカルロ法を使って、半径1の円の面積を求める Cプログラムを作らなきゃいけないんですが、だれか教えてください。 ちなみに、モンテカルロ法はわかるのですが、Cで書けません。 お願いします。
283 :
デフォルトの名無しさん :02/11/13 18:55
Cでかけないってことは、モンテカルロ法を理解してないってことだ。 ただ「使ってる」だけ。 出直して来い。
>>282 > モンテカルロ法はわかるのですが、Cで書けません。
ならば、モンテカルロ法の手順を日本語で書いてみろ。
>>284 V=4×(乱数の組のうち、x+y≦1を満たす組の数)/(全組式N)
これでいいですか?
>>285 誰が公式書けって言ったんだか・・・。
手順とは違うぞ。
287 :
デフォルトの名無しさん :02/11/13 23:38
int main() { int i, j = 0; float x, y; for (int i = 0; i < 100; i++) { x = rnd(); y = rnd(); if (x * x + y * y < 1) j++; } printf("pi = %f\n", 4 * j / i); }
for i = 1 to N x = 0〜1のRND y = 0〜1のRND if (x^2 + y^2 <= 1) count++; next print "pi = "; count / N * 4
>>289 やめとけ、あんたは不真面目あっちは真面目。釣り合わんよ。
>>287 それじゃだめだ
x = rnd()&255;
y = rnd()&255;
if (x * x + y * y <= 255)
あ、だめだ 実数にする 4.0 * j / i
乱数の下位ビットを使うなよ・・・
ビット切り取るのに 10 進数使うなよ・・・
295 :
お願いします! :02/11/17 20:13
5匹の鶴の身長を読み込んで、もっとも身長の高い鶴と もっとも身長の低い鶴の身長を表示するプログラムを作成。なお、鶴の身長はdouble型で表すものとする。 配列をつかって。
296 :
デフォルトの名無しさん :02/11/17 20:17
宿題きた!! 読み込むデータってファイルから?キーボード(標準入力)から?
double table[5]; int i, j; for (i=0; i<5; i++) scanf("%f", table+i); for (i=0; i<5; i++) { double tmp = table[i]; for (j=i, k=j; j < 5; j++) if (table[j] < table[k]) k = j; table[i] = table[k]; table[k] = tmp; } printf("min = %f\n", table[0]); printf("max = %f\n", table[4]);
298 :
デフォルトの名無しさん :02/11/17 20:28
int main(){ double hairetsu[5] = {40,30,60,20}; int i ; double max = 0; double min = 999; for( i=0;i < 5;i++){ if( max < hairetsu[i]){ max = hairetsu[i]; } if(min > hairetsu[i]){ min = hairetsu[i]; } } printf("最高身長:%lf",max); printf("最低身長:%lf",min); return 0; }
double max = hairetu[0]; double min = hairetu[0];
300 :
デフォルトの名無しさん :02/11/17 20:46
ファイルをオープンしてint型の配列をバイナリ保存したいんだけど・・・ どうすればいい?? fprintfではうまくいかなかったよ。
( ´、_ヽ`)・・・
const int SIZE = 10; int a[ SIZE ] ={ 0,1,2,3,4,5,6,7,8,9 }; FILE *lpFile; lpFile = fopen( filename , "wb"); if( lpFile == NULL ){ return -1; } fwrite( a , sizeof( int ) * SIZE , 1 , lpFile ); ( ´、_ヽ`) ?
>>298 あのさ、そのprogではさ、四つだけなんだけど五回ループしているよね?
>300 バイナリデータで保存する時の、 ファイルオープン時の、パラメータ確認した?
データが4つってことね
306 :
デフォルトの名無しさん :02/11/18 00:11
C++について質問させてください。 相互に影響しあうオブジェクトって作れないんですか? クラスAの中からクラスBを呼び出すためには、クラスBを先に作らなくちゃいけないので クラスBの中でクラスAは呼び出せない・・・と。 あたりまえ?もしくは勘違い?
>>306 何がしたいの?
相互に影響しあう、とか、クラスAの中からクラスBを呼び出す、
ってどういうこと?
>>306 クラスを呼び出すってどういうことだ?
言ってることは良くわからんが、君のやりたいことはたぶん出来る。
>>306 クラスを先行宣言(前方宣言)しておけばいいんじゃない?
オブジェクトAとBがあって、Aの変更がBに、Bの変更がAに反映出来るようにしたいんです。
class A; class B { class A* a; }; class A { int i; }; みたいな事はできるが、 class A; class B { class A a; }; class A { int i; }; はエラーです。
C++始めたばっかなので、用語の使い方間違ってるかもしれません
これもエラーか。何とかならんかなあ class A; class B { public: class A* a; B() { a = new A; } void func() { std::cout << "B" << std::endl; } }; class A { public: class B* b; A() { b = new B; } void func() { std::cout << "A" << std::endl; } }; int main() { A a; B b; a.b->func(); b.a->func(); }
>>313 お手数かけてすみません。
クラス分けの時点で間違ってるのかなぁ・・・
とりあえずもう一度考え直してみます。
>>313 正直C++は慣れていないんで、細かい作法は大目にみてくれ。
class A;
class B {
public:
A* getA();
B() { a = NULL; }
void func() { std::cout << "B" << std::endl; }
private:
class A* a;
};
class A {
public:
B* getB();
A() { b = NULL; }
void func() { std::cout << "A" << std::endl; }
private:
class B* b;
};
A* B::getA() { if (a == NULL) a = new A; return a; }
B* A::getB() { if (b == NULL) b = new B; return b; }
int main()
{
A a;
B b;
a.getB()->func();
b.getA()->func();
return 0;
}
コンストラクタを外に置いてみた。これならサイズが確定しているからnew できる。しかしなぜか動かない? class A; class B { public: class A* a; B(); void func() { std::cout << "B" << std::endl; } }; class A { public: class B* b; A(); void func() { std::cout << "A" << std::endl; } }; A::A() { b = new B; } B::B() { a = new A; } int main() { A a; B b; a.b->func(); b.a->func(); }
316です。 このようなプログラムを書くと、aの実体を確保する際にA()が呼ばれ、 その中でbをnewするのでB()が呼ばれ、その中でaをnew・・・・・と いうように堂々巡りになってスタックオーバーフローしていました。 だからやっぱりこんなおかしなプログラムは書いてはだめぽらしい です。どなたか感想きぼん。
> A::A() { b = new B; } > B::B() { a = new A; } ここでやんないで、あとでセットすれば、簡単にサイクルは作れるけど… 単にサイクルを作りたいだけなの?
>>318 わからん。最初に質問した奴は寝ているらしい。
単に異なるクラス間で情報を共有したいだけなら、staticメンバを使う手もあるな。
class base {
public:
static int i;
};
class A : public base {
public:
void func() { std::cout << i << std::endl; }
};
class B : public base {
public:
void func() { std::cout << i << std::endl; }
};
int base::i;
int main()
{
A a;
B b;
a.i = 111;
b.func();
}
320 :
デフォルトの名無しさん :02/11/18 15:27
xの階乗を求めるプログラムを作成せよとあります。 一応その階乗を求めるプログラムは作成できたのですがOVERFLOWの時終了することが できません。整数の最大値がINT_MAXに入っている時、どこでどうやって判断して終了をすればよいのでしょうか? プログラムです #include<stdlib.h> #include<limits.h> main () { int i,n,fact; printf("n="); scanf("%d",&n); fact=1; i=1; while(i<=n){ fact=fact*i; i=i+1; } } printf("%d\n",fact); }
321 :
デフォルトの名無しさん :02/11/18 15:43
>>320 Cでは残念ながらOVERFLOWを検知することは出来ないんで、
> i=1;
> while(i<=n){
> fact=fact*i;
> i=i+1;
> }
for(i = 1, fact = 1; i <= n; i++) {
if(fact < fact * i) {
printf("OVERFLOW!!\n");
break;
}
fact *= i;
}
かな?
# for文を使ったのは俺の趣味
INT_MAXを2からズンズン割っていっていけば、 Overflowになるnが割り出せると思うが(w
__asm 使っていいなら至って簡単なのだが。 while(i <= n) { fact = fact * i; __asm jno next; printf("OVERFLOW!!\n"); break; next: i = i + 1; }
しもた、珍しく来たC++の問題に乗り遅れた…(ノД;)
ひょっとして、テンプレートで、overflowになるnが 静的に割り出せたりする?
326 :
デフォルトの名無しさん :02/11/18 18:00
ちょっとスレ違いかもしれないけど・・・ javaで、あるアプリケーションを作る課題がでました。 そこで「ユーザインターフェースはメニュー方式の文字インターフェースとしてよい」ってあるのですが、これはCUIでいい、というようにとって大丈夫ですよね? 教師に質問メール送ると返るのが遅いのでここで聞きました。 まぁ俺がいいたいのは、文字で ○○○をする:A △△△をする:B のように出力され、Aを入力したら○○○ができる、そんな感じでいいのかな、と。
>>326 超越的にスレ違いだから心配しなくていい。
328 :
デフォルトの名無しさん :02/11/18 20:25
sleepなるものを使って、カウントを表示するプログラムを作ってみました。 #include <stdio.h> int main() { int count; for(count = 10; count > 0; count--) { printf("%d\n", count); sleep(1); } printf("Bomb!!\n"); return 0; } こう書くと、10,9,8,7,...ときちんと1秒待ってから表示してくれるのですが 数字を改行しないで表示させようと始めのprintfの所を printf("%d ", count); とすると、先に10秒待ってから、10 9 8...と一瞬にして表示され、変になります。 これはどうしてでしょうか? ただ改行するのとしないのとでは大違いなのですが...。 どうすれば改行せずに1秒待ったら表示して、また1秒待ったら表示して というようになるのでしょうか? ちなみに当方、UNIX+gccです。
fflush(stdout)
どうでもいいけど #include <unistd.h> しようよ・・・。
unistd.h・・・uninstaller demon?
>>310 何がしたいのか、よくわからない。
#include <iostream>
#include <stringstream>
int
main()
{
stringbuf strbuf;
ostream ostr(&strbuf);
ostr << "Hello The C++ World" << endl;
cout << strbuf.str() << endl;
return 0;
}
こういうのと同じことをしたいってことか??
333 :
デフォルトの名無しさん :02/11/19 02:52
printf("%d\n", count); fflush(stdout); sleep(1);
334 :
デフォルトの名無しさん :02/11/19 05:58
>>328 printf() が呼ばれるのと画面に出力されるのは、同じタイミングとは限らないんだよ。
これは環境によって違う。
ちみの環境だと、通常の文字はすぐに出力されず、バッファにたまっていく。
で、¥nが出力されたときに、そこまでのバッファの内容が一気に出力される。
unix standard
unistd.h /ju:nistaed do:t eit∫/ ■noun (acronym) UNIted STates of Dankan.H (FOXROAD DICTIONARY)
337 :
’N& ◆NAel5Y06Iw :02/11/19 08:22
The cows are bored. To amuse themselves, they have started searching for palindromes in Farmer John's tax forms. Palindromes are numbers that read the same forwards and backwards, e.g., 1234321 (but not 1231). A palindrome can be as short as 1 digit in length Each tax form is an N x N (2 <= N <= 20) table of random single digits (0..9). The cows wish to find paths on the grid such that the sequence of digits the path traces is a palindrome. The cows would like to know how many palindromic paths of a given length L (1 <= L <= 18) exist. Write a program to determine the number of palindromic paths of length L for a given table of digits. If a path and its inverse are distinct, count them as two paths. That is, if traversing a path backwards is not the same as traversing it forwards, count it as two paths. In the example table above, count 122221 as two paths because it can be traversed either starting on the 1 in the first row and ending on the 1 in the third row, or starting on the 1 in the third row and ending on the 1 in the first row. On the other hand, count `949' only once, as it can only be traversed starting at 9, going to 4, and returning to the single 9.
>>337 おいおい、the example table above がないと意味が分からんぞ
(といっても推測できるが)
コピペするなら完璧にしろや(゚Д゚)ゴルァ
>>334 >で、¥nが出力されたときに、そこまでのバッファの内容が一気に出力される。
ダウト。\nをバッファに書き込んだからと言ってフラッシュされるとは限らないと
思うが。
>>339 > *ちみの環境だと* 、通常の文字はすぐに出力されず、バッファにたまっていく。
>で、¥nが出力されたときに、そこまでのバッファの内容が一気に出力される。
日本語の読めない奴か?
341 :
デフォルトの名無しさん :02/11/19 18:56
二次元平面に円を書くプログラムを作成せよ
printf("○");
>>342 なるほど、単純かつ分かりやすい解答だ。
君の答えには私も思わずかつらを脱いだよ。
printf("円");
>>344 漢字の意味からしても「描く」ではなく「書く」だから
こっちの方がより正解に近いのかな。
二次元平面無視してるけどな
ディスプレイが自動的に二次元平面
レイトレして提出しモニタは二次元ですといいながら留年するのが漢
349 :
デフォルトの名無しさん :02/11/19 23:51
>>348 間違っちゃいないよなぁ。
大体本当の円なんてドットで四角く区切られたディスプレイ上じゃ(以下略
プリンタで印刷しる!
Bresenham's Algorithmで検索汁!
スケジュール管理システムを作れと言う課題が出てるので 誰か作ってくださいです。
因みにc++です。 クラスとか使ってくださいです。
>>353 できれば大文字のCを使ってください。小文字だと君の成績みたいに見えるでしょ。
class schedule { public: schedule(); } schedule::schedule() { printf("管理が終了しました"); }
学校の課題なんだから多分変なアルゴリズムで書くんじゃなくて 三角関数使えってことだろうね
357 :
デフォルトの名無しさん :02/11/20 11:26
ファイル検索プログラムをつくれって言う宿題なんですけどやってもらえますか?
>>357 dir か ls コマンドをsystem関数で呼び出しファイルにリダイレクトして
そのファイルを読み込んで整形
xとyの値のリストを読み込んで、最乗自乗法でy=ax+bのaとbを 求めるプログラムお願いします。
y1=ax1+b y2=ax2+b b=(y1+y2-(x1+x2)a)/2 これも誤差を無視した最小自乗法の一種じゃないか! と主張してくれ
363 :
デフォルトの名無しさん :02/11/20 12:07
課題が解けません。どなたか教えてください。m(_ _)m 次の常微分方程式をオイラー法によって解きなさい。 dy/dx=-y (y(0)=1,0<=x<=1,h=0.1) 真値:e^-x
364 :
デフォルトの名無しさん :02/11/20 12:18
あるDLL内で他のDLLを使用したいのですが 可能なのでしょうか? 可能でしたら使い方はどうすればいいのでしょうか?
365 :
Warez :02/11/20 12:34
float euler(float x) { const float h = 0.1; a[0] = 1; for (i = 0; i < 9; i++) { a[i+1] = a[i] - h * a[i]; } return a[(int)x*10]; }
>>364 可能。exeから呼び出すのと全く同じ。
50000までの素数を求めるプログラムをCで組んでもらえませんか?
>>367 誰かコテハンがやってたな。Delふさぎこだったっけ?
素数の定義を知ってるならスピードはともかく動く物は書けると思う。
うp禿しくキボンヌ
#include <stdio.h> #include <limits.h> static unsigned long next_prime(unsigned long n); static int is_prime(unsigned long n){ static unsigned long primes[65535] = { 2 }; static int init = 0; unsigned long *p; if (!init) for (init=1, p = primes; *p++ <= 65535;) *p = next_prime(*(p-1)); for (p = primes; *p * *p <= n; p++) if (n % *p == 0) return 0; return 1; } static unsigned long next_prime(unsigned long n){ while (!is_prime(++n)); return n; } int main(void){ unsigned long i; for (i = 2; i <= 50000; i = next_prime(i)) printf("%10ld\n", i); return 0; }
死ねって言われて死ぬアホがいるか(プ
375 :
デフォルトの名無しさん :02/11/20 14:50
教授に、複素数のクラスを作ってこいと言われますた… この無知に何か助言を頂きたいですm(_ _)m
std::complex朴れ
JPEGの圧縮プログラムの宿題が出たのですが、プログラムを教えていただけませんか?
378 :
デフォルトの名無しさん :02/11/20 16:19
素数判定、因数表示プログラムを作りなさい。 整数を入力し、素数かどうか判定を行う 素数の場合、「素数です」と表示 素数でない場合は、その因数を全て表示する *整数Aを整数Bで割ったとき、余りが0ならBはAの因数(1とA自身は除く) A%B=0 *素数:因数を持たない整数 ヒント:判定変数 初期値は1、 因数があれば0に更新、 ループ終了後も1のままなら素数
377 マルチ氏ね
4桁の2進数を文字列として標準入寮から入力し、 これを10進数へ変換して表示するプログラムを作成せよ。 無知な私を助けてください。
>>380 #include <stdio.h>
#include <stdlib.h>
int main()
{
char buf[5];
fgets(buf,sizeof buf,stdin);
printf("%ld\n",strtol(buf,NULL,2));
return 0;
}
>>382 よくそんな事が言えるな。
マルチポストが何で敬遠されてるかわかってるか?
>>383 はいはい。
怒ってもいいからいちいち注意するな。
>>384 いや、注意してもらったほうがありがたい。
388 :
デフォルトの名無しさん :02/11/20 17:55
>>383 何で敬遠されるんですか?
ぐぐって見たのですが、うまく調べることが出来ませんでした。
教えていただけるとありがたいです。
よろしくお願いします。
追加。 A掲示板とB掲示板にポストして、A掲示板で回答が得られたとしたら、 B掲示板で調べてくれてた人の労力はどーなるん? とか。
391 :
デフォルトの名無しさん :02/11/20 18:12
>>389 どうもありがとうございます。
とてもよくわかりました。
ところで、388はマルチポストだったわけですが、
お気づきになられましたか?
ヽ \
/ \ \
∧_∧/
(;´Д`) i i i
/ ヽ _ i i i--、
./| | | |  ̄ ̄ ̄ |:::::|.
/ \ヽ/| | ノ__ノ..
/ \\| |
/ /⌒\ し(メ .i i i . .
/ / > ) \ ノノノ
/ / / / .\_ ザックザック
し' (_つ /:::::/::... /ヽ
; "ノ・ ./∴: / )i iヽ-、_へ ,ヘ
'',, : :―― / / i i i iヽ . ̄ ゙― ノ /
n_ _/; i .ノ / /ノ-' ̄ ゙ ― 、__ノ
_ノ 二二二、_( _Д_ ;)-ヽ_ノ-'
>>391 ゙ー ''~ ∨ ̄∨
(゚Д゚)ハァ?
394 :
デフォルトの名無しさん :02/11/20 22:49
人、犬、鶏、野菜がボートで向こう岸まで行きたい。ボートは2人までしか乗れない。(例:人、犬、野菜は定員オーバー) ボートは人しか漕げない。人がいないと犬は鶏を、鶏は野菜を食べてしまう。全員無事に 向こう岸にいく手順を出力するプログラムを教えてください。お願いします。
人、犬、鶏、野菜がそれぞれ 1 インスタンスしか存在しないなら解決不能だが?
396 :
Warez :02/11/20 23:08
有名な問題じゃん.鶏を連れてかえるんだよ.
人が鶏を食べちゃうんだろ。
最初に人のインスタンスを3つ作ればいいのか・
#include <stdio.h> int main(void) { puts( "1. 鷄をボートに載せて向こう岸に行く\n" "2. 鷄を置いて戻ってくる\n" "3. 野菜をボートに載せて、ボートの横で犬を泳がせて向こう岸に行く\n" "終了" ); return 0; }
プログラムを教えてください。だから、ニューロサイエンスするのかなー。
ニューロなんか使わなくてよろしい。 バックトラックを使って試行させるだけ。
渡る前に食っちまえ
ただの総当りでいいのか 真面目に考えて損した
「手順を出力するプログラム」であって「手順を求めるプログラム」じゃないんだろ?
じゃあ、
>>399 と同じようなので、ただし文字列は
"1. 鷄をボートに載せて向こう岸に行く\n"
"2. 鷄を置いて戻ってくる\n"
"3. 野菜をボートに載せて向こう岸に行く\n"
"4. 野菜を置き、鶏を連れて戻ってくる\n"
"5. 犬を載せて向こう岸に行く\n"
"6. 犬と野菜を置いて戻ってくる\n"
"7. 鶏を載せて向こう岸に行く\n"
"終了"
本当はこの問題を解かなくちゃいけなくて、プログラムを使って解こうと思ったんだけど プログラムの前に答えがでちゃったのでもういいです。
つーかなんでこのスレこんなレベルさがってんの?
レベルは高いと思うが?
2chに来てレベルうんぬんぬかすヤシの精神的レベルの方が心配だ
>>407 そう気を落とさずにお願いします。似たような問題でこんなのもあります。
宣教師と人食い人種が3人づつ、川の右岸におり、2人乗りのボートがある。
どこにおいても、宣教師の数が人食い人種より少なくなると、宣教師は食べられて
しまう。安全に川の右岸から左岸に渡るにはどうしたらよいか。
人食い人種を頃す
宣教師を船にのせる。人食い人種に河を歩かせる。 3回繰り返す。
SSSHHH SS HH >SH> SS HH <H< S SS H >HH> S SS H <H< SH S H >SH> SH S H <H< SSH S >HH> SSH S <H< SSHH >SH> SSHH 船頭を、人食い人種にまかせる事で、つねに人食い人種が一人足りない状況を作る。
宣教師をもう3人借りてくる
SSSHHH SS HH >SH> SS HH <H< S ← ここで喰われる。
宣教師に船をのせる。
SSSHHH.|< > .| SSHH |→<SH>| SSHH |< >← .|SH SH .|→<SH>|SH SH .|< >← .|SSHH |→<SH>|SSHH | .< >|SSSHHH
SSSHHH.|< > .| SSHH |→<SH>| SSHH |<SH>←| SSHH |→<SH>| SSHH |<SH>←| SSHH |→<SH>| SSHH |<SH>←|
宣教師なんだったら人を食わないように説いてやれや
422 :
Warez :02/11/21 00:43
>412 1瞬(たとえばboatがついてからまた発つまで)でも人食い人種の方が多い状況があったらだめなのか?
SSSHHH.|< >| SSHH .{<SH>| SH |<SH>| SH |<SH>| SSHH |< >| SSSHHH
>>422 そうっす。
できれば自分で解かず、プログラムに解かせてください。
SSSH >HH> SSSH <H< H SSS >HH> H SSS <H< HH SH >SS> HH SH <SH< SH 自分で解いたほうが楽しい問題ってプログラム面倒くさいなあ。
>>424 じゃあ人工知能作るしかないな
こっちでロジック考えてプログラム書いちゃったら
「プログラムが解いた」ということにはならない
C/C++よりLispやPrologのが楽だYO!
ド人
431 :
デフォルトの名無しさん :02/11/21 04:22
インド人
淫ド人
433 :
デフォルトの名無しさん :02/11/22 16:38
4次元ベクトルの内積を求めるプログラムをCで作って下さい。お願いします!
double a[4], b[4]; double inner=0; int i; for (i=0; i<4; i++) inner=a[i]*b[i];
435 :
takeru :02/11/22 18:47
平面上の点を表す構造体Pointを用いて、三角形の三つの頂点座標を持つ構造体 Triangle を以下のように定義した。 struct Point{ float X; float y; }; struct Triangle struct Point a,b,c; ); この定義を用いて、構造体Triangle 型の変数 tri を宣言し、三頂点が(1。0、1。0)、 (5。0、3。0)、(4。0、2。0)になるように初期化するプログラムをつくり、頂点座標を 次のように出力せよ。 出力例 三角形の頂点 (1。0、1。0)、 (5。0、3。0)、 (4。0、2。0) どなたかお願いします。もうしにそうです。
436 :
takeru :02/11/22 18:58
>>435 を利用して、三角形の面積を計算するプログラムをつくれ。
三角形の面積は(a,b),(c,d),(e,f)ならば、
面積=1/2×{(e-a)(d-b)-(c-a)(f-b)} の絶対値で表される。
頂点は
>>435 の値を用いよ。絶対値はifを使っても、fabs()を使っても良い。
出力例
三角形の頂点
(1。000000、1。000000)、
(5。000000、3。000000)、
(4。000000、2。000000)、
面積 1。000
どなたかお願いします。
#include <stdio.h> struct Point{ float X, y; }; struct Triangle { struct Point a, b, c; }; void PutFloat(float f) { char buf[1024], *p; sprintf(buf, "%.1f", f); for(p = buf; *p; p++) { if(*p == '.') fwrite("。", 1, strlen("。"), stdout); else fwrite(p, 1, sizeof(*p), stdout); } } void PutPoint(struct Point *pt) { fwrite("(", 1, strlen("("), stdout); PutFloat(pt->X); fwrite("、", 1, strlen("、"), stdout); PutFloat(pt->y); fwrite(")", 1, strlen(")"), stdout); }
void PutTriangle(struct Triangle *tri) { fwrite("三角形の頂点\n\n", 1, strlen("三角形の頂点\n\n"), stdout); PutPoint(&tri->a); fwrite("、\n", 1, strlen("、\n"), stdout); PutPoint(&tri->b); fwrite("、\n", 1, strlen("、\n"), stdout); PutPoint(&tri->c); fwrite("\n", 1, strlen("\n"), stdout); } void PutTriangleArea(struct Triangle *tri) { float area, a = tri->a.X, b = tri->a.y, c = tri->b.X, d = tri->b.y, e = tri->c.X, f = tri->c.y; fwrite("面積 ", 1, strlen("面積 "), stdout); area = 1.0f / 2.0f * ((e - a) * (d - b) - (c - a) * (f - b)); PutFloat(area < 0.0f? -area: area); fwrite("\n", 1, strlen("\n"), stdout); } int main() { struct Triangle tri = { { 1.0f, 1.0f }, { 5.0f, 3.0f }, { 4.0f, 2.0f } }; PutTriangle(&tri); PutTriangleArea(&tri); return 0; }
しまった、抜け。 #include <string.h>
#include <stdio.h> #include <math.h> struct Point{ float X; float y; }; struct Triangle{ struct Point a,b,c; }; void p(struct Point p){ printf("(%f %f)\n", p.X, p.y); } void main(void) { struct Triangle tri; tri.a.X = 1.0; tri.a.y = 1.0; tri.b.X = 5.0; tri.b.y = 3.0; tri.c.X = 4.0; tri.c.y = 2.0; printf("三角形の頂点\n"); p(tri.a); p(tri.b); p(tri.c); printf("面積%f", fabs(0.5*((tri.c.X - tri.a.X)*(tri.b.y - tri.a.y) - (tri.b.X - tri.a.X)*(tri.c.y - tri.a.y)))); }
442 :
デフォルトの名無しさん :02/11/22 20:12
C言語で画像を (1) 濃度移動 (2) 濃度変換 (3) 輝度分解能(階調数) (4) 空間解像度変換 するプログラムをキボンヌ
>>443 gimpってオープンソフトだっけ?
だったらそのソースコードを読む。
オープンソフト........( ゚д゚)
オープンソース?
オーブントースター?
scanf関数で半径rを入力してもらい、 そのrを円を描く関数に渡して円を描くプログラムを…おながいします。 ちなみに、C言語です。。
printf("r=%dの〇",r);
>449 そのneta 100くらい見た.死ね.
>449 そのneta 100回くらい見た.死ね.
#include <stdio.h> #include <stdlib.h> int main(void) { double r; scanf("%lf", &r); //circle(x, y, r); //適当な関数に置換せよ return EXIT_SUCCESS; }
>452 SotecのWindows Meです.
#include <stdlib.h> #define BEGIN do{ #define END }while(1) #define mymalloc(s) BEGIN m=malloc(s); END #define BYNARY ((((((( #define x )*2+ void *m;int main(void){mymalloc(BYNARY 1 x 1 x 1 x 1 x 1 x 1 x 1 x 1 );return 0;}
>>450-451 騙るわ、間違えて二重投稿するわ、「すれ立てるまでも」で名前消し忘れるわ、、、もっとしっかりしようぜ?
BYNARY?
#define END }while(1) 本気ですか?
>454 結局コンパイラを書かないあたりネタだな、、、
Bresenham's Algorithmで検索汁! このマルチポストやろう!
そういえば、 #define BEGIN } #define END { これってどうよ?
糞
#define SCREEN_SIZE 100 char screen[SCREEN_SIZE][SCREEN_SIZE]; #define pset(x, y) (screen[x][y] = 1) void circle(int x0, int y0, int r) { int x, y, dy; y = r; dy = r - 1; for (x = 0; x <= y; x++) { pset(x0 + x, y0 + y); pset(x0 - x, y0 + y); pset(x0 + x, y0 - y); pset(x0 - x, y0 - y); pset(x0 + y, y0 + x); pset(x0 - y, y0 + x); pset(x0 + y, y0 - x); pset(x0 - y, y0 - x); dy -= x + x + 1; if (dy < 0) { y--; dy += y + y; } } } int main() { int radius, x, y; scanf("%d", &radius); circle(49, 49, radius); for (x = 0; x < SCREEN_SIZE; x++) { for (y = 0; y < SCREEN_SIZE; y++) putchar(screen[x][y] ? '*' : ' '); putchar('\n'); } return 0; }
inline void pset1(int x, int y) { screen[x][y] = 1; } inline void pset2(int x, int y) { screen[y][x] = 1; } inline void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } inline int abs(int x) { return x >= 0 ? x : -x; } inline int signum(int x) { if (x > 0) return 1; else if (x < 0) return -1; else return 0; } void line(int x1, int y1, int x2, int y2) { int x, y, dx = abs(x1 - x2), dy = abs(y1 - y2), d, delta; void (*pset)(int, int) = pset1; if (dy > dx) { swap(&x1, &y1); swap(&x2, &y2); swap(&dx, &dy); pset = pset2; } if (x1 > x2) { swap(&x1, &x2); swap(&y1, &y2); } delta = signum(y2 - y1); d = dx / 2; for (x = x1, y = y1; x <= x2; x++) { pset(x, y); d += dy; if (d >= dx) { d -= dx; y += delta; } } }
>>463 動くけど、なぜ動くか良く分らない…鬱だ
一連のpset(〜);で、中心点(x0,y0)から、対称な八方向にプロットしている。 x+x,y+yなどは微分値を使用。 xで走査しながら、yで中心点から一定の距離のところを取得(微分値・変化率)。 よくわからん・・・
467 :
デフォルトの名無しさん :02/11/24 10:24
(1) 引数に与えられた整数が素数であるかどうかを判定する関数 is_primeを作成し、 入力された正の整数を素数分解して表示するプログラムを作りなさい。 (2) 年(西暦)月日を入力し、その日が1月1日から何日目になるかを表示するプログラムを作りなさい。 ただし、その年がうるう年であるかどうかを判定する関数is_leapを作成して利用しなさい。 うるう年は西暦の年が4で割り切れる年。 ただし、その年が100で割り切れて、かつ、400で割り切れない場合はうるう年ではない。 一度に2つもすみませんがよろしくお願いします。
>>467 で、いつからここは丸投げスレになったんだ?
正直、あんた向いてない。今いる学校なり会社なりやめて違う道探した方が良いと思う。
470 :
デフォルトの名無しさん :02/11/24 12:19
>>468 最初から丸投げスレ。
何も出来ないくせに文句だけ言いたがる厨は、
お外に遊びに言ってなさい。
添削きぼんぬ です。
>>472 良ろしいんじゃないですか?分りやすくて。
ツェラーの公式を使えばもっと短くなるだろうけど、
読んだ人は分らなくなるかも。
あ、文字列定数中の()は、エスケープする必要ない弟子。
>>473 )で関数が閉じてしまって 「" がありません」になるかと思ってたよ、Thax.
ツェラーの公式って曜日を算出するものじゃないの?
どうやるのか ソースプリーズ?
検索したら出てきたよ。
479 :
デフォルトの名無しさん :02/11/24 13:43
ax^2+bx+c=0 #defineマクロ文を使用し係数を読みこんで、判定し、 実数解がある時はそれぞれのマクロ文をコールし解を求め〜 判別式もマクロ文で作成すること 朝から何度も適当にやっても解が合いません 判定式と解を出すのを#defineで作っただけでは駄目ですか 仮引数が無いのが駄目ですか 一回講義を休んで分かりませんその時はIF文を習ってました 教科書はTurboC初級プログラミングです
>>480 禿同。
ほんと厨房は実装プログラム載せないよな。
最短距離を探すプログラムを、POINTERを使って 作ってください。
ここに打ち込むのはけっこう大変なんですけど… なんだか画面狭いし…
気合だ
#include <stdio.h> #include<math.h> #define KAI_0 ((-b+m)/(2.0*a) #define KAI_1 (-b-m)/(2.0*a)) #define KAI_2 (-b/2.0*a) /*QR(a,b,c) (-b+sqrt(b*b-a*c*4))/(a*2)*/ #define DD (b*b - 4.0*a*c) int main(void){ double a,b,c,m,x1,x2; printf("ax^2+bx+c=0\n"); printf("a="); scanf("%lf",&a); printf("b="); scanf("%lf",&b); printf("c="); scanf("%lf",&c);
if (DD > 0.0){ printf("a=%.1lf b=%.1lf c=%.1lf\n",a,b,c); m=sqrt(DD); printf("x1=%lf\nx2=%lf",KAI_0,KAI_1); } else if (DD==0.0){ printf("a=%.1lf b=%.1lf c=%.1lf\n",a,b,c); printf("x=%lf", KAI_2); } else { printf("解なし"); } } 試行錯誤の末全てがおかしいんだ
>>486 >else if (DD==0.0){
浮動小数点でこういうことしない。
そうだぞ、 else if (!DD) { で充分。
あ、ごめん、ネタだったのね。
491 :
デフォルトの名無しさん :02/11/24 15:52
(double)dat==0 では、判定出来ないもの。 abs(dat-0.0)<epsilon だっけ? そんな風に判定しないと
fabs(dat) < DBL_EPSILON -0.0 は必要無いし
494 :
デフォルトの名無しさん :02/11/24 16:28
C言語でhostコマンド似たような実行をするプログラムって、 どんなプログラムになるんでしょう? よろしければ、考えてもらえますか?
マルチポストとはなかなか度胸があるな。
HMX-12 萌え
ふむふむ、 fabs(dat) <DBL_EPSILON が、プレゼンハムのアルゴリズムで、 デジタル微分解析による直線描画で hostコマンドと似たようなのものが実装できると プログラム板は勉強になるなぁ。
499 :
デフォルトの名無しさん :02/11/24 18:13
6と9を読み違えてみたのね… 突っ込みにくいネタはヤメテ!
>>468 プログラムを学んでいる人の大半はプログラマどころか情報系に就職する
わけでもないのだが
502 :
デフォルトの名無しさん :02/11/24 18:30
112233334444555555556666をLz78符号化して 112020343440474059510510606136 という結果を得たとき、これを復号化する際 〜106 を10番目の語句+6ではなく、1番目の語句+0+6番目の語句+…と解釈すると 1122333344445551203316612334となります。 辞書の番号が一桁なのか二桁なのかどう区別したらいいのでしょうか?
503 :
デフォルトの名無しさん :02/11/24 18:30
基地男が発生しました。
>>502 またそのネタかよ…
LZ78は符号化じゃないってば。
符号化の勉強しろよ。エリアス符号とか、SSS符号とか、エントロピー符号化でもイイや。
圧縮スレ行けば?
>>502 宿題なら答えてやるから、宿題の問題文をそのまま示せ。
>>504 エントロピー符号はLZ78に適用出来ないだろ
LZ78自体が表現出来てないんだから
>>506 そのとおりだが、エントロピー符号化の勉強をすれば、
可変長のビット列をバイト指向のストリームに書く方法くらいは
わかるんではないかと思った。
>>506 LZ78,77のようなparsing法は、エントロピー符号化で書けます
1)Eliasのγ、δ符号のように指数部とバイナリ部をエントロピー符号化する
2)記号単位で符号化する(parsing to symbolwise でしらべてみてちょ)
標準入力から無向グラフのデータを与えると、 グラフの辺を全て1度ずつ通る道筋(オイラー路)を出力する Cのプログラムを書きなさい。 入力の形式は、 ・最初の行に頂点の数N ・残りのN行は、それぞれ0番〜N-1番の頂点を表す。 最初に辺の数が書いてあり、その後に辺で結ばれる相手の頂点の番号が 並んでいる。区切り記号は1個の空白とする。 ・グラフは連結であると仮定してよい。 出力は、頂点の番号をたとえば 12-24-179-3-... のようにハイフンで結んで標準出力に書き出すこと。 よろしくお願いします。
510 :
デフォルトの名無しさん :02/11/24 19:39
皆さん、そんな難しい用語使わないで下さい。 大学院にも行ってないので理解できません。
>>510 ちがう。ハミルトン路ならNP完全だが、
オイラー路はO(N)で求まるはず。
513 :
デフォルトの名無しさん :02/11/24 20:15
オイラーはドラマー
514 :
デフォルトの名無しさん :02/11/24 20:25
必ず1ふでがきできるってこと?
>>514 できるかどうかはデータによる。
できるとしたら、解がどのくらいの計算量で求まるかという話。
どなたか
>>467 の(1)の問題わかる方いませんか?
関数が出てきてから理解できなくなってきたんでお願いします。
>>517 2以上の整数で割れたら割って、を続けて行けば?
>>517 #include <stdio.h>
int is_prime( int x ) { /* x が素数なら 0、素数でなければ一番小さい素因数を返す */
int n, i;
if ( x < 2 ) return 0;
if ( x % 2 == 0 ) return 2;
n = x/2;
for ( i = 3; i < n; i+=2 )
if ( x % i == 0 ) return i;
return 0;
}
int main( void ) {
int n, d;
fputs( "正の整数を入力してください: ", stdout );
scanf( "%d", &n );
if ( n < 1 ) {
printf( "%d は正の整数ではありません。\n", n );
exit( 1 );
} else if ( n == 1 ) {
puts( "1" );
exit( 0 );
}
while ( (d = is_prime(n)) != 0 ) {
printf( "%d, ", d );
n /= d;
}
printf( "%d\n", n );
return 0;
}
int is_prime(int n){ for(i=2; i<n; i++) if(n%i==0){ printf("%d ",i); n/=i; i--; } }
できました。 どうもありがとうございました〜。
ちっ、遅かったか bool is_prime(int n, std::vector<int> &factor=std::vector<int>()) { factor.clear() ; for(int i=2;i*i<=n;i++) while(!(n%i)) factor.push_back(i),n/=i ; if(n!=1) factor.push_back(n) ; return factor.size()==1 ; }
524 :
デフォルトの名無しさん :02/11/25 07:59
■問題1 FileName = "test.csv"; を開いて 配列 TextData に 1行ずつ格納する プログラムを書け。 ■問題2 問1の配列を逆順にする プログラムを書け。 ■問題3 test.csv は タブ(\t)区切りフォーマットである。 <table> タグを利用し、CSVファイルの中身を全て表示するプログラムを書け。 C++
>>524 #include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
void readFromStream(std::istream &is,std::vector<std::string> &result)
{
std::string temp;
while(std::getline(is,temp)) {
result.push_back(temp);
}
}
void writeToStream(std::ostream &os,const std::vector<std::string> csv)
{
os << "<table>" << std::endl;
for(std::size_t i = 0;i < csv.size();i++) {
os << "\t<tr>";
std::string line = csv[i];
std::istringstream iss(line);
std::string temp;
while(std::getline(iss,temp,'\t')){
os << "<td>" << temp << "</td>";
}
os << "</tr>" << std::endl;
}
os << "</table>" << std::endl;
}
続き int main(int argc,char **argv) { std::string fileName = "test.csv"; std::ifstream ifs(fileName.c_str()); if(!ifs.is_open()) return 1; std::vector<std::string> csv; readFromStream(ifs,csv); //読み込んで std::reverse(csv.begin(),csv.end()); //逆順にして writeToStream(std::cout,csv); //とりあえず標準出力に書き出してみる return 0; }
とりあえず1と2だけ。 1: std::list< std::string > TextData[1]; std::ifstream ifs(FileName); std::string tmp; while( std::getline(ifs,tmp) ) TextData[0].push_back(tmp); 2: TextData[0].reverse();
528 :
デフォルトの名無しさん :02/11/25 09:35
VC++をつかってじゃんけんのゲームを作ってます。ダイアログベース。グー チョキ パーのボタンをそれぞれ配置して、結果に応じて絵が出るようにしたいでつ。 どう記述すればいいか教えてください。
で、5回負けたらゲームオーバー、5回買ったら勝利ってことにしたいです。 絵が出るというのは、北斗ののびたみたいにアニメチックにしたいです
.NET flame workでコンパイルするときどうするんでつか?
[課題](C言語) 標準入力で入力された文字列を暗号化するプログラムを作成しなさい。
void NullEncrypt(FILE *in, FILE *out) { int ch; while(ch = fgetch(in), ch != EOF ) fputch( ch , out ); } int main() { NullEncrypt( stdin, stdout); return 0;}
#include <stdio.h> int main(void) { int c; while ( (c = fgetc(stdin)) != EOF ) putchar( c-1 ); return 0; }
#include <stdio.h> #include <stdlib.h> int main(int artc, char *argv[]) { int i, c; char *p; if (argc < 2) { fprintf(stderr, "usage: %s keyword...\n", argv[0]); return EXIT_FAILURE; } i = 1; p = argv[1]; while ((c = getchar()) != EOF) { if (! *p) { if (++i >= argc) { i = 1; } p = argv[i]; } putchar(c ^ *p++); } return 0; }
* ビジュネール暗号 */ #include <stdio.h> int encrypt(int code, char *keywords[]) { if (keywords[0] == NULL) { int c = getchar(); if (c != EOF) putchar(c ^ code); return c; } else { char *p; for (p = keywords[0]; *p; p++) if (encrypt(code ^ *p, keywords + 1) == EOF) return EOF; return 0; } } int main(int argc, char *argv[]) { while (encrypt(0, argv + 1) != EOF) ; return 0; }
538 :
デフォルトの名無しさん :02/11/26 13:57
得点を入力してそれの 平均点と標準偏差と偏差値得点を出力するプログラムを作成せよ。 負の数値を入力したら実行は終了するものとせよ
540 :
tekeru :02/11/26 16:46
なんとかまにあったっす。 協力してくれた方々感謝します。
ご協力ありがとうございました。 また来るかもしれないんでよろしくお願いします。
動画を再生するソフト作ってください
多分スレ違いだから安心していい。
545 :
デフォルトの名無しさん :02/11/27 12:48
コンソールからの入力で、実数が入力されたときはdouble型の変数に、 整数が入力されたときにはint型の変数に代入させたい。 とりあえず、 #include <stdio.h> int main( void ){ char buf[100]=" "; int idata; double ddata; char sdata[100]; while( buf[0] != '\n' ){ printf("?"); fgets(buf , sizeof( buf ) , stdin ); if( sscanf( buf , "%d" , &idata ) == 1 ) printf("int型 : %d\n",idata ); else if( sscanf( buf , "%lf" , &ddata ) == 1 ) printf("double型 : %f\n",ddata ); } return 0; } みたいなコードを書いて見たのだけれども、実行してみると、 ?10[Enter] int型 ?10.0[Enter] int型 になっちゃう。(RedHad Linux,gcc) 下の10.0の入力の時に、double型ってなってくれればうれしいのだけれども
[0,1]区間の乱数を十分多く発生させ [0,0.1],[0.1,0.2],・・・・[0.9,1]区間にいくつ乱数があるかカウントせよ 次に乱数の初期値を変えて、同じ処理をせよ ----------------------------------- 誰か、やってくれませんか?
age
>>545 C 標準では、文字列が何を表すかを判定する方法は無い。
さしあたり strchr() で、小数点を意味するドットがあるかどうかを
探してみろ。
>>545 doubleとintで取ってから、値を比べて同じならintを使ったら?
>>546 [0,0.1)とかじゃなくていいのか?
>>549 "10.0" を int にするのか?
あと [0,0.1) って何?
>>546 #include <stdio.h>
#include <stdlib.h>
int main(void)
{
const unsigned int rand_initial = 12345; // ここに乱数の初期値を設定
const unsigned int rand_number = 10000; // ここに乱数を出す数を設定
unsigned int i, cnt[10] = { 0 };
srand(rand_initial);
for(i = 0; i < rand_number; i++)
cnt[(unsigned int)(rand() * 10.0 / RAND_MAX)]++;
for(i = 0; i < 10; i++)
printf("%1.1f 〜 %1.1f の出現数: %u\n", i / 10.0, (i + 1) / 10.0, cnt[i]);
getchar();
return 0;
}
>>551 数学的には 10.0 = 10 だからおかしくないだろ?
[0, 0.1) ってのは、0以上0.1未満の範囲。
サンクスコ
>>552 10.0 は有効桁数が設定してあると考えた場合に = 10 にはならないだろ。
「有効桁数が設定してある」 という話を持ち出すべきでないと言うなら、
「数学的には」 という話も持ち出すべきではない。
まあ、545 が明確なルールを設定していないので無意味な議論だが。
>>551 545のプログラムがトライ&エラーって感じだったので
10.0はint扱いでいいのかなって思ったんだけど、
あー、そういう仕様の解釈の方がまっとうかもな。
>>554 >「有効桁数が設定してある」 という話を持ち出すべきでないと言うなら、
>「数学的には」 という話も持ち出すべきではない。
なんでやねん…
10 = 10.0 = 10.00 = 10.000
は、有効数字が何桁だろうが、有効数字という概念を仮定しようがしまいが
常に成り立つ。
>10 = 10.0 = 10.00 = 10.000 >は、有効数字が何桁だろうが、有効数字という概念を仮定しようがしまいが >常に成り立つ。 もうちょっと有効数字について勉強してくれ
>>557 ハァ?
負け惜しみはもういいよアフォ。
実数⊃整数だから、10も10.0も実数だと思えばいいんじゃないの。 つーか、整数って実数の特殊例でしょ。
たとえば有効数字4桁のとき、10.001と10.002は区別できない。 どちらも10.00という同じ物として扱われる。 そう考えると、10.0は10と同一視するしかない。
>整数って実数の特殊例 それは考え方次第 >そう考えると、10.0は10と同一視するしかない。 いくらなんでも論理展開が無茶苦茶
"10.0" と "10" が別のデータである事は厳然とした事実だ。 あと、554 の最後の行をちゃんと読んでくれ。 それと、556 はおそらく有効数字と言う言葉の解釈が間違ってるから、 本当に調べ直した方がいいぞ。
>>563 数学の話を急にCの仕様の話に戻すのはズルイ、と思います。
無意味な議論には禿働。
別のデータって… 「内部表現が違うから」というなら、内部表現を決める前にそんなことを いうのはおかしい。 プログラマのクセかもしれんが、10は整数で、10.0は浮動小数点数で表さな きゃならないと決めてかかってるんじゃないか? 概念的には(つまり外部仕様としては)整数は実数の一種なんだから、 厳密に10.0として入力されたら、整数の10だと思って問題なかろう。
>>563 >おそらく有効数字と言う言葉の解釈が間違ってるから、
>本当に調べ直した方がいいぞ。
うん。調べなおした。間違ってなかった。
567 :
デフォルトの名無しさん :02/11/27 14:06
有効数字と有効桁数の区別がつかない悲惨な 566 が居るスレはここですか?
厳密でない10.0が何か知らんが 「概念的に整数は実数の一種」というのは中学校の先生が 言っていたのかな?中学校ではよくそう教えるからな
>>567 ヤレヤレ…
有効数字は「桁数」で表します。
「有効数字2桁」とかね。
570 :
デフォルトの名無しさん :02/11/27 14:10
>>568 数⊃複素数⊃実数⊃有理数⊃整数
と大学院(数学専攻)で教わりましたが何か?
そんなの高校で習うよ
へー、整数は実数じゃないんだ。 整数は複素数なの?
575 :
デフォルトの名無しさん :02/11/27 14:12
hage
576 :
デフォルトの名無しさん :02/11/27 14:15
[0,1]区間の乱数を十分多く発生させ [0,0.1],[0.1,0.2]…[0.9,1]区間に幾つ乱数があるかカウントせよ 次に乱数の初期値を変えて同じ処理をせよ。 どういうことが判るか? わかりましぇーん 救済キヴォンヴ
別に間違っているなどとは言っておらん 定義しだいだ、と言ってるだけだ
578 :
デフォルトの名無しさん :02/11/27 14:15
ヽ(´ー`)ノ
>>577 みぐるしいからもうやめれ。
実数に含まれない整数って何だよ(ワラ
「作ればあるもーん。定義すればあるもーん。」だろ(w
>>579 構成的手法では再定義することによって初めて
含まれるようにできるだろ?そういう話
>>582 おいおい。ムズカシイ用語使って煙に巻いたつもりかしらんが、
実数なんていう非加算無限のものに構成的手法が適用できる
わけねーだろ。
s/非加算/非可算/
>>583 その辺は勉強してくれ
デデキントの切断とかコーシー列の同値類とか
>>585 うん。したよ。
自然演繹など、構成論的な手法によって構築できる
公理系は可算無限の対象しか含まないものだけ。
だいたい、constructiveってことはintuitionistic
なんだから、「実数全体の集合」なんてものを扱わない。
587 :
デフォルトの名無しさん :02/11/27 14:27
ようするに10.0を10とみなしても良いってことダロ?
>>587 そんな事は 546 に訊いてくれ。
ちなみに C/C++ の定数の話だったらマズイ。
しまった「構成的」はconstructiveの訳語か、まずった
>ちなみに C/C++ の定数の話だったらマズイ。 数学の話を急にCの仕様の話に戻すのはズルイ、と思います。 まあ、[0, 1.0)という中学校の表記法を知らなかった奴だから、 無理もないんだが。
いやそういうわけでもないな。問題なし
有効数字が「桁数で表すものじゃない」と思っていて、 整数は実数じゃないと思っていて、 [0, 0.1)という表記法を知らなくて、 constructiveという言葉を知らないくせに 構成的手法という言葉を使ってごまかそうと試みる 厨房のいるスレはここですか?
おいおい有効数字の話はよそでやってくれ。 やるんだったら実装レベルの話しをしてくれ。 入力された文字列から小数点検索して処理すれば いいだけのはなしだろ。入力データをdouble と 文字列で持たせてやればたいていのことができる。
[0, 0.1) これどういう意味なんだ? ポインタ本にも書いてあったけど意味わからん
半開区間だっけな? 閉区間 [0,1] 0 <= n<= 1 半開区間 [0,1) 0 <= n< 1 開区間 (0,1) 0 < n < 1
中学校からやり直せ。
括弧の付け間違いで煽られるのか・・・。 書いたヤツがよっぽど高圧的な物言いをしたのか・・・?
区間の表記って中学でやったのか? 最近の中学が進んでいるのか 昔の中学が進んでいたのか 俺の中学だけが遅れていたのか どれなんだろう ちなみに、俺は高校でやった記憶があるのだが
for文の式 for( ;(ima %= 12)!= i; printf("%d時\t",++ima)); というのがあるんですが、「%=」の意味はなんですか?
604 :
デフォルトの名無しさん :02/11/29 00:55
ima = ima % 12の略 imaを12で割った余りをimaに代入っていう意味
605 :
デフォルトの名無しさん :02/11/29 01:23
Windows98,VC++6.0で 改行入りのデータをファイルに書き込みたいんだけど \nの前に\rが入るのを防げませんか?
>>605 ファイルを"wb"モードでfopenしろ。
>>607 wb・・・
成る程、バイナリモードで開くんですね。
多謝!
勉強し直してきます。
609 :
デフォルトの名無しさん :02/11/30 00:36
cの質問です。 データ1、データにを取り込んでそれぞれの平均値、最大値、最小値を求めるプログラムを作成しろとのことです。 ヒントプログラムがあるので書いておきます。 #include <stdio.h> main() { double ×××必要な変数を定義します. int i; FILE *fp1; fp1=fopen("data4.txt","r"); for(i=0;i<3000;i++){ ファイルから読み込んでデータを代入していく処理を追加します } 最大値,最小値を求める処理を追加します. 平均を求める処理を追加します. printf("データ1の最大値=%f\n",data1max); printf("データ1の最小値=%f\n",data1min); printf("データ1の平均=%f\n",data1ave); printf("データ2の最大値=%f\n",data2max); printf("データ2の最小値=%f\n",data2min); printf("データ2の平均=%f\n",data2ave); fclose(fp1); } それでは、よろしくお願いいたします。
>>609 最大値、最小値処理するのはfor文の中でしょ?
てかどっかの本にまるまる載ってそう・・・
ヒントではなく、答えなのでは、と思いつつも データ1とデータ2の仕様(data4.txtの中身)が分からないと 答えようがありません
こういった中身のものが無数に広がっています。 13.160653,-44.018177 6.428124,-36.433974 12.031670,-26.586817 9.300368,-74.639087 11.545353,-55.847211 5.894994,-4.096887 12.608508,-66.110320 8.221066,-9.025639
612の数字が(data4.txt)の中身です。
614 :
デフォルトの名無しさん :02/11/30 00:50
>>612 左がデータ1で右がデータ2なの?
はっきり書けよ。
すみません。 左がデータ1、右がデータ2です。 共に3000個あります。
あ、どういうこと? 右と左をいっこずつ比べるの? っていうかforいらなくねー?
データ1ならデータ1同士を、データ2なら2同士をくらべるみたいです。
double max1,max2,min1,min2,sum1,sum2; くらい宣言しておくか?
>618 多分、こうしたいのでは double data1[3000], data2[3000], buf ; /* 宣言 */ fscanf(fp1,"%lf,%lf",data1+i,data2+i) ; /* forの中身 */
で、その後に、最大・最小・平均値を求めると…
#include <stdio.h> int main(void) { double max_1 = 0,max_2 = 0,min_1 = 0,min_2 = 0,ave_1 = 0,ave_2 = 0; char buf[256]; FILE *fp1,*fp2; fp1=fopen("in_data.txt","r"); fp2=fopen("out_data.txt","w"); while(fgets(buf,sizeof(buf),fp1) != EOF) { ↓あとはたのんだ!
bufは要らなかった…
strtodでできんの?カンマのとこどう区別したらいいんでつか?
C言語についてちょっと質問です。 乱数を使って6面体や8面体などの色々なサイコロを表現しようと思います。 様々な多面体のサイコロを考えるので、汎用性を持たせるために 乱数の部分を以下のような関数にしました。 int ran(int n) { srand((unsigned)time(NULL)); return (rand() % n); } とりあえず、まず6面体のサイコロを10回振ったことを考えようと思い、 これをmain文の中で for(i = 0; i < 10; i++) printf("%d", ran(6)); と呼び出して、結果を表示させるようにすると 結果は6666…のようになります。 これでは1回サイコロを振った結果をただ単に 10回表示させたようにしか見えません。 ループ用変数iを関数ranの引数として追加してやって、 srandのところを、 srand((unsigned)time(NULL) + i); とすればうまくいくことは分かるのですが、 この方法はあまり使いたくありません。 他に正しい結果を得るにはどうしたらよいでしょうか?
>>624 srandはプログラムの最初に一回だけ呼んでやれば
ranの中には必要ないです
>>624 コンピュータの実行速度が速いので、同じtime()のsrand()が何度も実行
されてしまうことが原因。
srand()をran()の外に出して最初に一回だけ実行するようにしてご覧。
毎回同じ値で乱数を初期化してるからだろ。 srand()をmain()に漏ってけ。
int main(void) { struct STATINFO MinMax[2]; double in_dbl[2]; char buf[256]; int cnt, errcnt, i, at1st = 1; FILE *iFP = fopen(DATA_FILE, "r"); if(!iFP) { perror("データファイルが見つかりません"); fputs(DATA_FILE, stderr); return -1; } printf("ファイル %s の処理を開始します。\n", DATA_FILE); for(cnt = errcnt = 0; fgets(buf, sizeof(buf), iFP); cnt++) { if(sscanf(buf, "%lf,%lf", &in_dbl[0], &in_dbl[1]) != 2) { perror("データが不正です"); fprintf(stderr, "%d 行目: %s", cnt, buf); errcnt++; } else if(at1st) { for(i = 0; i < 2; i++) MinMax[i].max = MinMax[i].min = MinMax[i].sum = in_dbl[i]; at1st = 0; }
>625-627 すばやいご解答ありがとうございました。 srandは一回だけでよかったんですね。 mainのfor文の前に持ってきたらランダムな数字が表示されるようになりました。
else for(i = 0; i < 2; i++) { if(MinMax[i].max < in_dbl[i]) MinMax[i].max = in_dbl[i]; else if(MinMax[i].min > in_dbl[i]) MinMax[i].min = in_dbl[i]; MinMax[i].sum += in_dbl[i]; } } if(ferror(iFP)) { perror("データファイルの読み込み中にエラーが発生しました"); fputs(DATA_FILE, stderr); } fclose(iFP); printf("ファイル %s の処理が完了しました。\n", DATA_FILE); printf("%d 件のデータを読み込みました。\n", cnt); errcnt && printf("%d 件のエラーデータがありました。\n", errcnt); if(cnt - errcnt) for(i = 0; i < 2; i++) { printf("データ %d の最大値 = %lf\n", i, MinMax[i].max); printf("データ %d の最小値 = %lf\n", i, MinMax[i].min); printf("データ %d の平均 = %lf\n", i, MinMax[i].sum / (cnt - errcnt)); } return 0; }
#define DATA_FILE "data4.txt" struct STATINFO { double min, max, sum; }; こんなん。
しまった、2 は定数化できるなあ。 あと、構造体の変数名が微妙なのを直すの忘れた。 まー動くから勘弁して。
宿題やってたら手が冷えた
ヒントに従えばこうでしょ? #include <stdio.h> int main() { double data1[3000], data2[3000] ; double data1max, data1min, data1ave, data2max, data2min, data2ave ; int i; FILE *fp1; fp1=fopen("data4.txt","r"); for ( i = 0 ; i < 3000 ; i++ ) { fscanf ( fp, "%lf,%lf", data1 + i, data2 + i ) ; } for ( i = 0 ; i < 3000 ; i++ ) { 最大値,最小値を求める処理を追加します. 平均を求める前処理を追加します. } 平均を求める処理を追加します. printf ( "データ1の最大値=%f\n", data1max ) ; printf ( "データ1の最小値=%f\n", data1min ) ; printf ( "データ1の平均=%f\n", data1ave ) ; printf ( "データ2の最大値=%f\n", data2max ) ; printf ( "データ2の最小値=%f\n", data2min ) ; printf ( "データ2の平均=%f\n", data2ave ) ; fclose ( fp1 ) ; }
> double data1[3000], data2[3000] ; アフォですか?
ごめん。 > for(i=0;i<3000;i++){ > ファイルから読み込んでデータを代入していく処理を追加します > } > 最大値,最小値を求める処理を追加します. > 平均を求める処理を追加します. 分かれてたのね。 ・・・出題者はアフォですか?
for ( i = 0 ; i < 3000 ; i++ ) { data1max<*(data1+i)?data1max=*(data1+i):(data1min>*(data1+i)?data1min=*(data1+i):void); data2max<*(data2+i)?data2max=*(data2+i):(data2min>*(data2+i)?data2min=*(data2+i):void); } atteru?
平均値の前処理忘れた。
#include <stdio.h> int main() { double data1[3000], data2[3000] ; double data1max, data1min, data1ave, data2max, data2min, data2ave ; int i; FILE *fp1; fp1=fopen("data4.txt","r"); for ( i = 0 ; i < 3000 ; i++ ) { fscanf ( fp1, "%lf,%lf", data1 + i, data2 + i ) ; } data1max = data1min = data1ave = data1[0]; data2max = data2min = data2ave = data2[1]; for ( i = 1 ; i < 3000 ; i++ ) { if(data1max < data1[i]) data1max = data1[i]; else if(data1min > data1[i]) data1min = data1[i]; data1ave += data1[i]; if(data2max < data2[i]) data2max = data2[i]; else if(data2min > data2[i]) data2min = data2[i]; data2ave += data2[i]; } data1ave /= 3000; data2ave /= 3000; printf ( "データ1の最大値=%f\n", data1max ) ; printf ( "データ1の最小値=%f\n", data1min ) ; printf ( "データ1の平均=%f\n", data1ave ) ; printf ( "データ2の最大値=%f\n", data2max ) ; printf ( "データ2の最小値=%f\n", data2min ) ; printf ( "データ2の平均=%f\n", data2ave ) ; fclose ( fp1 ) ; }
>>640 data2max = data2min = data2ave = data2[1]; /* data2[1]が素敵♪ */
クソだなあ・・・。 エラーチェックまるで無いし、ファイル読み終わってもすぐに閉じないし。 ローカルに巨大配列もかなり痛い。 こういう教えられ方されてると、仕事でも平気でこういうコード書いたりしそう。
>>641 ||
∧||∧
( ⌒ ヽ トゥ トゥ トゥマシェリ マ シェーリー
∪ 。ノ トゥ トゥ トゥマシェリ マ シェーリー
∪∪
>>629-632 でいいやん・・・。
したら、こんなどうしようもない間違えしないし。
それとも、バッファ 2 時限にして、double 型でループカウンタ作ればヨカタか?
微妙なバグを残してある所が本当に良いと思って
素敵♪って書いたんですけどね
でも、何でタイムスタンプ(01:47)が遅い漏れ(
>>641 )の方が先で
タイムスタンプ(01:46)が早い(
>>642 )の方が後なのだろうか?
ちょっと時空を超えただけだ、気にするな。
タイムスタンプってどこで拾うんだろう・・・
生暖かい場所で拾う。
ちなみに生暖かい温かさは、 プールの中でおしっこを漏らしたときの温度です。
いいえ、感動で流す涙の温度です。
fork()を理解するために、以下のようなプログラムを作成しました。 #include <stdio.h> #include <unistd.h> int main() { if(fork()) printf("親です\n"); else printf("子です\n"); return 0; } これを実行したら結果は 親です 子です となるか、 子です 親です となって、終了するだろうと予想しました。 しかし、実際は 子です親です となって、メッセージが2つ表示された後に、 2回改行されてしまいます。これはなぜでしょうか? 環境はUNIX+gccです。
>>651 親も子も一緒に動いているのに
なんでお行儀良く、片方の出力が完了した後、もう片方が出力される
と思えるのかな?
>>652 一緒に動いているとは言っても、厳密には
CPUは同時に1つのプロセスの処理までしかできない、
そこでCPUスケジューラーによってどれか一つプロセスが
選ばれて、実行されている、そして短時間に何回も
そのプロセスを切り替えることにより、
まるで一緒に動いているかのように見せかけていると聞きます。
その辺はあまり分からないのですが、
もしプログラムの一文単位でプロセスが切り替えられるのなら、
と思って、初め、651のような予想をたてました。
でも652さんのおっしゃることから推測するとそれは違うみたいですね…。
文の途中でもどこか特殊な所ではプロセスが切り替えられているのでしょうか?
例えばそれが\nの直前では常に切り替わる、
とかだと納得がいくのですが…。
654 :
デフォルトの名無しさん :02/11/30 21:24
/*問題 一画素に付き、rgb各8bitの画像データ(320*240)がある。 任意の閾値(0〜255)を入力すると、それ以上の輝度値を持つ画素のみの画像を 作成するプログラムを作成せよ。 */ #include<stdio.h> #include<stdlib.h> main() { unsigned char *img1,*img2; FILE *fp1; FILE *fp2; int x=256,y=256,z=256,i=0,j=0,k=0,l,m,n=0,o=0; int W[320][240][3],t=0,d=0,A[54];
655 :
デフォルトの名無しさん :02/11/30 21:24
m=54+320*240*3; img1=malloc(m); img2=malloc(m); while(x>=256){ printf("青の閾値(0〜255)=\n"); scanf("%d",&x); } while(y>=256){ printf("緑の閾値(0〜255)=\n"); scanf("%d",&y); } while(z>=256){ printf("赤の閾値(0〜255)=\n"); scanf("%d",&z); } fp1=fopen("Red1.bmp","rb"); fp2=fopen("AAA.bmp","wb");
656 :
デフォルトの名無しさん :02/11/30 21:25
fread(img1,m,1,fp1); for(i=0;i<=319;i++){ for(j=0;j<=239;j++){ for(k=0;k<=2;k++){ W[i][j][k]=(int)*(img1+t+k+54); } t=t+3; k=0; } t=t+240; j=0; } for(o=0;o<=53;o++){ A[o]=(int)*(img1+o); } for(i=0;i<=319;i++){ for(j=0;j<=239;j++){ for(k=0;k<=2;k++){ if(k==0){ if(W[i][j][k]<x){ W[i][j][k]=0; } }
657 :
デフォルトの名無しさん :02/11/30 21:27
else if(k==1){ if(W[i][j][k]<y){ W[i][j][k]=0; } } else{ if(W[i][j][k]<z){ W[i][j][k]=0; } } } k=0; } j=0; }
658 :
デフォルトの名無しさん :02/11/30 21:27
for(i=0;i<=319;i++){ for(j=0;j<=239;j++){ for(k=0;k<=2;k++){ *(img2+t+k+54)=(unsigned char)W[i][j][k]; } t=t+3; k=0; } t=t+240; j=0; } for(o=0;o<=53;o++){ *(img2+o)=(unsigned char)A[o]; } fwrite(img2,m,1,fp2); free(img1); free(img2); fclose(fp1); fclose(fp2); } て宿題なんだけど、これコンパイルしても上手く動かない…。 どこが悪いか教えていただけないでしょうか
>>653 君の予想はノンプリエンプティブなマルチタスクでのみ当てはまる。
そういうシステムではプロセスは勝手に切り替わらないで、特定の場所でのみ切り替わる。
プリエンプティブなマルチタスクOSではほとんどいつでもどこでも切り替わる。
切り替わるのはCPUの命令単位でプログラムの1文字じゃない。
切り替えるタイミングは要するに時間で決まるので、切り替わる場所は不定。
逆に切り替えられない場所が特殊な場所は有る。
詳しく知りたければアセンブラ勉強しなさい。
>>660 加藤茶以外はなかなかつけませんが・・・
662 :
名無しの学生サソ :02/12/01 01:32
swap (type, a, b) でtype型の a と b の値を交換する関数マクロを作成せよ。 という問題がわかりません。どなたかヒントを…
>>662 #define swap(type,a,b) {type t;t=a;a=b;b=t;}
正確には #define swap(type,a,b) do{type t, t=a, a=b, b=t;}while(0)
>664 なるほど!関数マクロで{}が使えるんですね!気が付かなかった… どうもありがとうございました。
訂正 ×気が付かなかった ○知らなかった
関数はマクロじゃないしマクロは関数じゃない。
パラメータ付きのマクロを関数マクロという。
この場合パラメータの有無は関係ないけどな。
671 :
デフォルトの名無しさん :02/12/01 02:07
普通は関数型マクロというな。
「関数マクロ」(w こいつらアフォだ。
関数マクロなんて聞いたことないYO! いかにもDQNっぽいな。
規格だと、標準ライブラリ 関数が同時にマクロとしても定義してあっても良いことになっている。 たとえば、getcharやgetcはたいてい関数定義とマクロ定義の両方が ある。 それとごっちゃにしてるんでは? 引数のあるマクロは「引数つきマクロ」だよ。
google 「関数マクロ C言語」 318件 「関数型マクロ C言語」 38件 「引数つきマクロ C言語」 23件 (ププッ
俺の問題分かる人おらんのかな?
>>678 読む気がしない。
やってることを言葉で説明してみ
>>674-676 だぁーーーーっはっはっはっは!!!
D Q N 決 定 だ な (プー
>>654 まず輝度から調べなおせ。
“任意の閾値(0〜255)を入力するとそれ以上の輝度値”と
言われてるのに、三色の閾値を要求しているのは明らかな勉強不足による無知
(ヒント Y=0.3*R+0.59*G+0.11*B)
つかそれ以前に、 int W[320][240][3] は、やめてくれよ。
int W[320][240][3]は問題でつか?
>>683 コンパイラ(環境)によっては通るんだろうけどなぁ。。。
いきなりスタックを200KB強とるプログラムってのはいかがなもんかと。
ダイアログベースで作成しています。ファイルをコピーするアプリケーションで コピー元コピー先をボタンをクリックしファイルダイアログボックスを表示させ 、スタティックテキストにファイルまでのパスを表示するというものです。そし て、もう一つのボタンがありクリックすると、ファイルのコピーを開始するとい うものです。 但し、以下の場合はメッセージボックスを 表示する。 1.コピー元ファイル名が指定されていない。 2.指定のコピー元ファイルが存在しない。 3.コピー先ファイル名が指定されていない。 4.コピー先ファイルが既に存在する。 4の場合は、問い合わせメッセージの表示とし ユーザが上書きOKを選択した場合のみ、 コピー実行されるようにする。 という感じです。よろしくお願いします。
何をよろしくお願いするんだ?
ソースの方よろしくおねがいします。
ルーク!!ソースを使え!!
( ゚д゚)ポカーン
「関数マクロ C言語」 318件 これってほとんど「関数、マクロ」に引っかかってるけど…
ところで「関数マクロ」って英語でなんていうの?
functional macro
>>691 function-like macro
日本語では「関数型マクロ」あるいは「関数形式マクロ」だろうな。
「関数マクロ」は俺も聞いたことない。つーか、なんか変。
694 :
デフォルトの名無しさん :02/12/01 04:25
なんも冠つけないでただ「マクロ」と呼んでるんだが・・・ ひょっとして俺だけか?
>>693 #define N 100
みたいなのは?
>>693 じゃなくて
>>694 ですた。
#define swap(x, y) (...)
が「マクロ」なら、
#define N 100
はなんと呼ぶの?
どっちもマクロでしょ
MSDN では単にマクロと呼んでいるな。
>>654 > それ以上の輝度値を持つ画素のみの画像を作成
その輝度に満たないピクセルを、最低輝度の灰色でべったり埋めればいいのか?
全部を白ピクセルで埋めても仕様的に問題なさそうだ。
(char)w[240][300][3];奈良?
いずれにせよ外部のデータを扱う時は malloc() なり new なりにしなさい。
703 :
デフォルトの名無しさん :02/12/01 09:30
int getchar();int putchar(int);int main(){char k[]="A52A2245332A252B435B2222A2" "B2A2A23A2C32A3B5B2222A52B43532A2352C23A52A2246D2A3533B35K2A4D22A3224A45D2C25B" "2A32A5D2C25D4A26C4A1",*p=k;int i,c,b=1;while(*p){c=0;for(i=0;i<8;i++){if(*p== '0'){if(!*++p)break;b=!b;}c=(c<<1)+b;if((*p)--=='A')*p='0';if(*p >= 'A')b=!b;} if(c)putchar(c);}getchar();return 0;} このプログラムが「オマエモナー」を出力するようにkの初期値を書き換えてください。
A52A224:ト 5332A2:ロ 52B435:イ B2222:の 。。。 「〜木馬」ですか?
char k[]="A52B2A2252A5A252B34535C52A2B226D2A2";
char k[]="A6B3C26B25A2B2A2A23A2C32A3B6B3A2B5B23B25D2A45G226C2A3";
char k[]="A5E5A5B2A32A5F3B5B3B3A5B2A4B5E3C5B23A4A5A6E2A3C53A36C222A4A3A3A2A6C22B2C2252A2A2A262232"
みんなつまんね〜な
char k[]="A5B2A3A25B4325B22A3A5B24C5B2A32A5B4325B22B36B25A5B22A3";
トロイ=とろいウィルスの事 本気で信じてた時期があった・・・
ファイル内の日本語を検索するプログラムを教えてください。 対象ファイル、検索文字列はプログラム内に書き、検索文字列の存在確認はあるかないかだけを 表示するものでお願いします。
C言語でお願いします。
Warning: illegal pointer combination (param) ってエラーが出るんですが何を直せばいいんでしょうか。 C言語のファイルの入出力をやっています。構造体? というかポインターに問題があるってこと?
Did you free?
あなたは自由でしたか? あなたはタダでしたか?
>>716 その場合は Were you free?
ですよね・・。(param)はパラメーター違反ってことは {}とかがあってないか根本的に間違ってるか。
はーい。
ダイアログベースで作成しています。ファイルをコピーするアプリケーションで コピー元コピー先をボタンをクリックしファイルダイアログボックスを表示させ 、スタティックテキストにファイルまでのパスを表示するというものです。そし て、もう一つのボタンがありクリックすると、ファイルのコピーを開始するとい うものです。 但し、以下の場合はメッセージボックスを 表示する。 1.コピー元ファイル名が指定されていない。 2.指定のコピー元ファイルが存在しない。 3.コピー先ファイル名が指定されていない。 4.コピー先ファイルが既に存在する。 4の場合は、問い合わせメッセージの表示とし ユーザが上書きOKを選択した場合のみ、 コピー実行されるようにする。 です。よろしくお願いします。
ぽかーn
>>722 CやC++以前に日本語の練習がだいぶ必要。
725 :
デフォルトの名無しさん :02/12/02 17:12
行列 ( 0 1 ) ( 1 1 ) のn乗の計算が出来るプログラムを作りたいのですが・・・ まるっきりわかりません よろしくお願いします・・・
どこまで出来るの? 行列の乗算するプログラムは作れるのか?
727 :
デフォルトの名無しさん :02/12/02 17:15
行列の普通の掛け算は出来るのですが n乗はわかりません・・・
>>725 |0 1|n |fib(n) fib(n+1)|
|1 1| == |fib(n) fib(n+1)|
ここに、fib(n)はフィボナッチ数列のn番目の数値を表す
>>729 |0 1|n |fib(n-1) fib(n) |
|1 1| == |fib(n) fib(n+1)|
と違う?
>>703 うちの環境では、gCnCXg[Bという文字しか表示されなかったぞ。
コンパイルに何かオプションでもつけなきゃならんの?
gcc使ってるんだけど。
>>731 Shit-JIS だから。nkfしる!!
703 のコード自体は文字コードに依存していない。 char k[] の初期値によっては EUC の出力もできる。
>>733 どうしてスレ違いなんですか?こういう宿題が出てるんですが
わからないんで皆さんのお力を借りようと思っているんです。
次の各プログラムを作成せよ。 ただし、各関数は並記する書式にしたがって呼び出されるものとし、 それに合わせて関数の戻り値および引数を設定することとする。 ただし、配列のデータを引数として与える際には、 関数側ではポインタによる表記と配列による表記のいずれか一方で記述すれば良いこととする。 半径rの円の円周の長さlおよび面積sを算出する関数 circle() を定義し、 半径10.0[cm]の円についてそれぞれの値を求める。ただし、π=3.1415926536とする。 書式:void circle(double r, double *1, double *s) 他にも同じような問題がいくつかあるので 参考にするためにできるだけ簡単な構文で作ってもらえると助かります。 どなたか、お願いします。
>>737 円周とか円の面積って中学生あたりだっけ?
どこがわかんねーのよ
>>739 ポインタを習い、その演習としての問題なんですが
ポインタ自体の使い方、書式などがさっぱりです。
>>741 まず教科書を読み直せ。
void circle(double r, double *l, double *s)
{
*l = 円周の計算;
*s = 面積の計算;
}
> double *1 ・・・何だって?
>>743 それは突っ込むのもアホくさいので無視した。
#include <stdio.h> #define PI 3.1415926536 void circle(double, double *, double *); int main(){ double r=10.0,l,s; circle(r,&l,&s); printf("l=%lf s=%lf\n",l,s); return 0; } void circle(double r, double *l, double *s){ *s = r*r*PI; *l = 2*r*PI; }
ポインタを使えばまるで関数から 複数の値が返ってきたように考えることができるってやつだっけか?
今の流行は、 double *1 です。
もらったレスから以下のように考えたんですが正しい答えが出ません。 どこがまずいんでしょうか? とりあえず、流行のdouble *1は直しました。 #include <stdio.h> void circle(double r, double *l, double *s) { *l = 2 * r * 3.1415926536; *s = r * r * 3.1415926536; } int main() { double r, l, s; printf("r: "); scanf("%f", &r); circle(r, &l, &s); printf("l = %f, s = %f\n", l, s); return 0; }
749 :
デフォルトの名無しさん :02/12/03 00:27
scanf("%lf", &r);
doubleはlfで取らなきゃ。
752 :
デフォルトの名無しさん :02/12/03 00:31
>>750 いや、それよか東芝でないというなら社名10択ぐらいで挙げてほしい。
>>752 家電メーカー?
SONY 松下 日立 三洋 …だめぽ
現在の教育指導要項にしたがってπ=3で計算(略
(略しちゃだめ
おかげで、正しい答えが出ました。 有難うございます。
757 :
デフォルトの名無しさん :02/12/03 01:41
きいてよ。 これとおなじ名前のスレで2chで初めて1000とったよ。
758 :
デフォルトの名無しさん :02/12/03 01:43
そいつぁよかった。sage
762 :
デフォルトの名無しさん :02/12/03 01:45
やっふーい! ありがとう! でも2Getは一度もないんだな。
int disp(void) int sakujo(struct temp dt[],int su) void ichiran(struct temp dt[],int su) この3つの関数のプロトコル宣言の書き方を教えてください。 で通じるのでしょうか? お願いします(´Д⊂)
>>763 プロトコル宣言じゃなくてプロトタイプ宣言だろ。
最後に ; (セミコロン)を付けるだけだぞ。
>>764 ありがとございます。
C言語わけわかんなくなってきたyp
include <stdio.h> #include <string.h> struct temp{ char na[20]; int yu1; int yu2; char addr[40]; }data[50]; int disp(void); int tuika(struct temp dt[],int su); int sakujo(struct temp dt[],int su); void ichiran(struct temp dt[],int su); void main(void) { int cnt; int no; do{ no = disp(); switch (no){ case 1: cnt = tuika(data,cnt); break; case 2: cnt = sakujo(data,cnt); break; case 3: ichiran(data,cnt); break; } }while(no != 4); }
int disp(void) { int bango,i; char menu[4][18] = {"1:データ追加","2:データ削除","3:データ一覧表示","4:終了"}; printf("<<処理メニュー>>\n"); for(i = 0;i < 4;i++) printf("%s\n",menu[i]); while(1){ printf("\n処理番号ーー>"); scanf("%d",&bango); if(bango >= 1 && bango <= 4)break; printf("入力エラー!!再入力して下さい。\n"); } return bango; } int tuika(struct temp dt[],int su) { char ans; do{ printf("氏名ーー>"); scanf("%s",dt[su].na); printf("郵便番号ーー>"); scanf("%d-%d",&dt[su].yu1,&dt[su].yu2); printf("住所ーー>"); scanf("%s",dt[su].addr); su++; printf("データの追加を続けますか?(y/n)"); rewind(stdin); scanf("%C",&ans); }while(ans == 'y' || ans =='Y'); return su; }
int sakujo(struct temp dt[],int su) { int i,j; char name[20]; char ans; do{ printf("削除するデータの氏名ーー>"); scanf("%s",name); for(i = 0;i < su;i++){ if(strcmp(name,dt[i].na) = 0)break; } if(i < su){ for(j = i + 1;j < su;j++) dt[j-1] = dt[j]; su--; } else printf("その氏名のデータはありません。\n"); printf("データの削除を続けますか?(y/n)"); rewind(stdin); scanf("%c",&ans); }while(ans == 'y' || ans =='Y'); return su; }
void ichiran(struct temp dt[],int su) { int i; printf("<<データ一覧>>\n\n"); printf("番号 氏名 郵便番号 住 所\n"); for(i = 0;i <= su;i++) printf(" %2d %-18s %03-%04d %-28s\n",i + 1,temp[i].na,temp[i].yu1,temp[i].yu2,temp[i].addr); rewind(stdin); getchar(); }おてあげ ∩(・∀・)∩
(main関数内) int cnt; → int cnt = 0; (tuika関数内) scanf("%C",&ans); → scanf("%c",&ans); (sakujo関数内) if(strcmp(name,dt[i].na) = 0)break; → if(strcmp(name,dt[i].na) == 0)break; (ichiran関数内) for(i = 0;i <= su;i++) → for(i = 0;i < su;i++) printf(" %2d %-18s %03-%04d %-28s\n",i + 1,temp[i].na,temp[i].yu1,temp[i].yu2,temp[i].addr); → printf(" %2d %-18s %03d-%04d %-28s\n",i + 1,dt[i].na,dt[i].yu1,dt[i].yu2,dt[i].addr);
#include <iostream> #include <list> #include <string> #include <algorithm> using namespace std; class personal_data { public: void input() { char dummy; cout << "氏名ーー>"; cin >> name; cout << "郵便番号ーー>"; cin >> zip_main >> dummy >> zip_branch; cout << "住所ーー>"; cin >> address; } void output(size_t record_no) { cout.width(4); cout<< record_no << " "; cout.width(18); cout.setf(ios::left, ios::adjustfield); cout << name << " "; cout.width(3); cout.fill('0'); cout << zip_main << '-'; cout.width(3); cout.fill('0'); cout << zip_branch << " "; cout.width(18); cout.fill(' '); cout.setf(ios::left, ios::adjustfield); cout << address << endl; cout.setf(ios::internal); } inline bool operator==(const string &s) { return name == s; } private: string name; int zip_main, zip_branch; string address; };
class manager { public: void run() { while(execute_menu()); } private: list<personal_data> DataList; bool execute_menu() { int menu_no; cout << "<<処理メニュー>>" << endl; cout << "1:データ追加、2:データ削除、3:データ一覧表示、4:終了" << endl; cout << "処理番号ーー>"; cin >> menu_no; switch(menu_no) { case 1: add(); break; case 2: remove(); break; case 3: show(); break; case 4: return false; default: cout << "入力エラー!!再入力して下さい。" << endl; break; } return true; }
void add() { char answer; do { personal_data new_data; new_data.input(); DataList.push_back(new_data); cout << "データの追加を続けますか?(y/n)"; cin >> answer; } while(answer == 'y' || answer =='Y'); } void remove() { char answer; string target_name; do { cout << "削除するデータの氏名ーー>"; cin >> target_name; list<personal_data>::iterator itr = find(DataList.begin(), DataList.end(), target_name); if(itr == DataList.end()) cout << "その氏名のデータはありません。" << endl; else DataList.erase(itr); cout << "データの削除を続けますか?(y/n)"; cin >> answer; } while(answer == 'y' || answer =='Y'); }
void show() { cout << "<<データ一覧>>" << endl; cout << "番号 氏名 郵便番号 住 所" << endl; list<personal_data>::iterator itr; size_t record_no = 0; for(itr = DataList.begin(); itr != DataList.end(); itr++) itr->output(++record_no); } }; int main(void) { manager DataManager; DataManager.run(); return 0; }
何だ!?ソース荒らしか?
C++で ダイアログベースでグーチョキパー3つのボタンを配置してジャンケンするプログラムを作りたい。 おながいします。
ちなみに形だけはいっちょまえにつくりますた。
ワケ ワカ ラン
マジなのかネタなのかわからねぇ。 しまいにゃメール欄に「マジです」とかいてネタ 投稿するぞ。
まじです
781 :
デフォルトの名無しさん :02/12/04 12:53
DirectX SDKのDebug版とRetail版の違いは何ですか?
>>775 766-769 に回答しただけなんだが・・・。
783 :
デフォルトの名無しさん :02/12/04 16:17
ある文法にしたがったソースを読み込み、そのプログラムを解析する プログラムを作るというもんだいなんですが。 ようはコンパイラを作る課題の第1歩なんですけど 例えば A=12; をよみこんだら A 変数 = 代入文 12 数値 なんて表示されるものです。 このプログラムは出来たのですが、次の問題に 前問(上の問題)から字句解析機能を関数として作成し前問と同じ プログラムを作成せよ。ただし変数表の管理にハッシュテーブルライブラリーを つかうこと。 となっています。 ハッシュテーブルをどこでどうつかうかわからないんですが。。。 分かる方、ご指導おねがいします
あ、上のはC言語でです。 おねがいします
ただし変数表の管理にハッシュテーブルライブラリーをつかうこと。 て書いてあるじゃない。 変数名(例えば A)をハッシュテーブルに入れていけってことじゃないの?
その場合ハッシュ値はどんなのがいいんでしょう。。。? 前にやった例だと入れるものが数字だったので その数値をある数でわってあまりをaとすると hash[a]のとこにいれてくってかんじだったんですが この場合は変数はアルファベットですよね。 hash[A]なんてするわけにはいかないし。。。 どうすればいいんでしょう?
文字列のハッシュ関数のサンプルなんて腐る程あると思うが。 つーかハッシュテーブルについてどう習った?
文字も内部データ的には整数。 例えば、 printf( "%d\n", 'A' ); とかしてみたら、A という文字に対応する整数が表示される。 だから文字列の場合、一番簡単な例でいくと、 全ての文字(に対応する整数)を足した数をハッシュ値にすればいい。
いきなり問題をやらされた感じです。。。 上に書いたような数値の例で。 文字列の例調べてみます
C言語の問題です。 「2次方程式 ax^2+bx+c=0 において,実数 a,b,c を代入し,その解を求めるプログラムを作成せよ」 という問題なのですが,注意点として 計算機の中では実数は倍精度で処理すると有効数字として15桁程度の精度を持つが, それ以下の桁では誤差が生じる。その場合,2つの実数の差の絶対値を取り, それが十分小さければ2つの実数は同じ値であると考える。 と書かれていたのですが,虚数解を求めるところでどうすれば誤差が生じないのか分かりません。 アドバイスお願いします。
>788 あ、なるほど! もしかして例えば変数Dだったら hash[D-A]=変数 ってすればいいんですかね!?
>>783 別に A を引く必要はない。そのままの値を使いな。
あ、正確には hash[(int)'A'-'D'] ですね。 >792 そのままの値、ということは配列の最初のほうには 何も入らないと云う事ですよね? 宣言を char hash[(int)'Z'] にしてやればいいのかな
>>791 とりあえず変数名が文字列だとしたら、ハッシュキーの作成は
unsigned int makeHashKey( char *str )
{
unsigned int hash = 7743;
int i;
for( i = 0 ; str[i] != '\0' ; i++ ){
hash = ( hash << 3 ) ^ hash ^ str[i];
}
return ( hash % cHASHTABLESIZE );
}
って感じが良いと思うよ。
>>793 いや....ある値で割って余りをとるんでしょ?
例えば、割り切れる数だったら 0 になるじゃない?
う。。。またわからんくなってきた。。。 えーと、この場合ハッシュ関数はどうなるのでしょう? 割る数はハッシュサイズですよね? てかハッシュサイズはどうなるんだ。 そいや数字もつかえるからA〜Zと1〜9の組み合わせ。。。 割られる数は。。。? >794 forのループでが何を意味してるかわからないのですが そこではなにをしてるのでしょう? あと7743ってなんすか?
>>783 教科書とかにハッシュ法は載ってないのか?
一度じっくり本を読め。
しつもーん!
>>783 にあるハッシュテーブルライブラリはどこに行きましたか?
ハッシュ関数とか用意されてないんですか?
ハッシュテーブルライブラリなら文字列をキーとして値を入力できそうですが?
>>796 ハッシュキーを作成する関数=ハッシュ関数じゃないのかな。
7743は適当な定数。短い変数名文字列が、ハッシュテーブルの
前半に集中するのを防ぐために適当に入れただけ。名無しさんとかって
したんだけど、本当は適当に大きな素因数の方が良いのかも。
forループの中では適当な計算をしている。ハッシュ関数は同じ
入力が与えられたら同じキーを発行したら良いから、適当にキーが
バラけて、かつ速い計算が良い。
文字列の文字全てをキーに使う為のforループで、中で行っている
計算はxor。andならキーが0に収束するし、orなら1に収束するから
xorが向いている。シフトしているのは文字だけじゃなくてその文字が
文字列のどの場所に出てくるかによってもキーが変わるように。
シフトしていない部分とのxorも求めているのは、長い文字列で最初の
方の文字がシフトによって消されないため。
漏れもハッシュの演習を学校でやった事があったけど、実際に数千個の
英単語を入れてキーをグラフにしてみたらちゃんとバラけてた。
教科書は入門書しかないんで役にたたないす。。。 ネットで調べてみたところ、例えば Abcって変数ならAとbとcをそれぞれコードにしてくっつけて それを割った値をキーにすればいいんですよね? でもその前にこの場合のハッシュサイズはどうなるんでしょう?
> xor それって何か意味のある動作をするか?
ごめん、シフトもするのね。
>799 うぅ。。。なんかむずすぎて全然わからん。。。 800みたいなやりかたじゃだめすかね? ABCの文字コードが65、66、67なら 656667と言う数字をハッシュサイズで割り、そのあまりを 添字にもつ配列にいれる。 ハッシュサイズがわからんと思ったけど調べてると 別に割る数はハッシュサイズでなく適当でいいと書いてるとこも ありましたがそれでいいのかなぁ?
あらかじめハッシュサイズを手動で(100とか)きめといて (65+66+67)/100をハッシュ値にするのが簡単そうですが これじゃだめすかね。。。?
いいから 783 は 798 の質問に答えてくれよ
>>804 (65+66+67)%100 ね。
別にそれでいいんじゃないかなぁ?
そんなに高度なのは求められてないんでしょ。
>805 あ、ハッシュテーブルライブラリーは別の問題でつくったんですよ。 でもそのままではつかえないのでそれを参考に考えるんだと 思います。 ちょっと問題はしょって書いたし書方わるかったかな。。。
(´-`).。oO(流用できないようなものをライブラリーと呼ぶのか。。。)
809 :
デフォルトの名無しさん :02/12/04 19:03
(´Д⊂ヽ仕様がない
>>806 それは最後の文字しか意味を持たないじゃん。
ハッシュ関数の意味判ってんねぇんだな。 あれでいいと思うんなら下手な計算せずに先頭一文字だけそのまま使っとけば?
>>811 わりっす。>803とごっちゃにしちまった。
814 :
デフォルトの名無しさん :02/12/04 20:45
char型のアルファベットの文字列をint型に直す関数ってありますか? atoiだと文字型の数字しかint型になおらないですよね?
815 :
デフォルトの名無しさん :02/12/04 20:47
char c= 'A'; int i= (int)c;
817 :
デフォルトの名無しさん :02/12/04 20:49
文字列を直したいんです。 ABCとかいう文字列をなんか一発で。。。 そういうのが無ければ普通に書けばいいんですが 一発で変換みたいなのがあればらくだなと
818 :
デフォルトの名無しさん :02/12/04 20:49
文字列を?
ABCが数値としていくつになればいいの?
123
822 :
デフォルトの名無しさん :02/12/04 20:53
つーかchar[]そのものが多倍長整数なんだが。
”ABC"='A' * 0x10000 + 'B' * 0x100 + 'C'
function書くしかないんじゃない。
MD5つかえ
>>822 バカモノ。
なにがABCとかいう文字列だ。
16進数字じゃねぇのか?
>>824 それで本当に2748になるのか?
char *c="ABC"; int i; memcpy(&i,c,sizeof(int));
>>790 誰かこれもお願いできませんか?
実数解の場合は分かったんだけど,虚数解の場合がどうしても分からない。
ちなみに実数の場合は
D = b*b -4.0*a*c;
if(D > 0.0) { /* 実数解 (D > 0) */
x1 = (fabs(b) + sqrt(D)) / (2.0 * a);
if ( b >= 0.0 ) {
x1 = -x1;
}
x2 = c / (a * x1);
printf("x1 = %15.15f, x2 = %15.15f\n", x1, x2);
}
みたいな感じでやりました。
さて本物のレスがないのは釣りだったのだろうか?
結局普通に自分で書きました(^^; アルファベットを文字コードにして足して行っただけですが。 ちなみに僕は817しかかいてないですよ
足してどーすんだよ
833 :
デフォルトの名無しさん :02/12/04 21:31
質問! MS-DOS上でTurboC++使って制御の勉強をやってます。 プログラム→Rs-232C(1)→データ処理→Rs-232C(2)→データ処理 →計算など と制御させると全体の周期が0.5秒くらいなんです。 そのうち、Rs-232C(1)とRs-232C(2)での外部処理で0.2秒ずつ食われます。 Rs-232Cでコマンドを送った後、データが返ってくるまで 他の処理をさせたいのですが、DOSでは無理ですか? 割り込み処理などでなんとかなるもんですか?
>>833 データ送受信を割込みで処理すれば割込みが有るまで好きなことが出来る罠。
「はじめて読む486」を参考にしてマルチタスクを実装する。
レス感謝です。
>>834 その手法を考えて実装してみます。
どこか参考になるHPなどないかなぁ。
(TurboというかBorlandのヘルプはすでに読みましたけど・・・)
>>835 それ持ってます。途中まで読んで休止状態です(w
>>835 俺へのレスですよね?
>>486 以降を読んでも誤差を考慮した虚数解については書かれて無いんですけど・・・
>835は>833だと思われ。
>837はネタだと思われ
>>838 あ,そうでしたか。同じ2次方程式の問題だったから勘違いしてしまいますた。
ネタじゃないです。マジで誰かお願いします。
>>841 ん〜。ここで
>>829 に書いてある実数解のを見つけたんですけど,虚数解のはなかったんですよね。
>>842 大体虚数をどう表す気だ。 doubleは実数しか表せないんだぞ?
それさえ判れば自明じゃないのか?
>>843 今はreal,imagをdoubleで宣言して,
real = -(b / (2.0*a));
imag = sqrt(fabs (D)) / (2.0*a);
printf("x1 = %15.15f + %15.15fi (虚数解)\n", real, imag);
printf("x2 = %15.15f - %15.15fi (虚数解)\n", real, imag);
のようにやってるんですけど,
>>841 のページを見ると実数の場合,
if(d >= 0){ /* 判別式が正のとき、解を計算 */
x1 = (-b + sqrt(d)) / (2.0 * a);
x2 = (-b - sqrt(d)) / (2.0 * a);
printf("x1 = %27.20e(%27.20e)\n",x1,a*x1*x1+b*x1+c);
printf("x2 = %27.20e(%27.20e)\n",x2,a*x2*x2+b*x2+c);
}
では桁落ちするらしく,
if(d >= 0){ /* 判別式が正のとき、解を計算 */
x1 = (fabs(b) + sqrt(d)) / (2.0 * a); /* 修正箇所 */
if ( b >= 0.0 ) {
x1 = -x1;
}
x2 = c / (a * x1); /* 修正箇所 */
printf("x1 = %27.20e(%27.20e)\n",x1,a*x1*x1+b*x1+c);
printf("x2 = %27.20e(%27.20e)\n",x2,a*x2*x2+b*x2+c);
}
のように修正すると書かれてたので,虚数解の場合も修正しないとまずいのでは?
と思ったのですが違うのでしょうか?
>>844 追加
Dもdoubleで宣言し,↓のようにしています。
D=b*b -4.0*a*c
毎度お馴染み TURBO C++ です。 #include <iostream.h> #include <complex.h> int main(void) { double x = 3.1, y = 4.2; complex z = complex(x,y); cout << "z = "<< z << "\n"; cout << " and imaginary real part = " << imag(z) << "\n"; cout << "z has complex conjugate = " << conj(z) << " \n"; return 0; }
848 :
デフォルトの名無しさん :02/12/05 19:00
引き篭もり
double _Complex z;
850 :
デフォルトの名無しさん :02/12/06 00:34
#include <stdio.h> #include <math.h> main() { int c=0,temp=0; while((c=getchar())!='a'){ if(c==' ') temp=c; else{ if(temp==' ') { putchar(temp); temp='a'; } putchar(c); } } return 0; } 上のプログラムは,某本の二つ以上の空白を一つの空白に置き換えながら,入力を出力しなさいという問題の答えです。 このプログラムの改善点などありますでしょうか?
#include <stdio.h> #include <math.h> main() { int c=0,temp=0; while((c=getchar())!='a'){ if(c==' ') temp=c; else{ if(temp==' ') { putchar(temp); temp='a'; } putchar(c); } } return 0; } 上のプログラムは,某本の二つ以上の空白を一つの空白に置き換えながら,入力を出力しなさいという問題の答えです。 このプログラムの改善点などありますでしょうか?
#include <stdio.h> #include <math.h> main() { int c=0,temp=0; while((c=getchar())!='a'){ if(c==' ') temp=c; else{ if(temp==' ') { putchar(temp); temp='a'; } putchar(c); } } return 0; } 上のプログラムは,某本の二つ以上の空白を一つの空白に置き換えながら,入力を出力しなさいという問題の答えです。 このプログラムの改善点などありますでしょうか?
ワラタ
>>852 #include <stdio.h>
int main(void)
{
int ch;
while ( (ch = getchar() ) != EOF )
{
putchar( ch );
while ( ch == ' ' )
ch = getchar();
}
return 0;
}
>>854 それだと,
aa a a a a
が
aa
になってしまいます
aa a a a a
とならなくてはいけないので
int ch, last_char_was_space = 0; while ((ch = getchar()) != EOF) { if (! last_char_was_space || ch != ' ') putchar(ch); last_char_was_space = (ch == ' '); }
last_char_was_space = (ch == ' '); の部分はどういう処理で? chに' 'を入れる必要性は?
>last_char_was_space 長ぇよ!w
>>858 chがスペースなら1,でないなら0っすか
で,if文で調べると
こんな高等な技術があったとは
>>859 あほな僕でもわかるようにと,考えてくださったのでしょう
>>862 がんがれ。オレも初めてこの使い方をみた時は正直あせったよ。
呼んだ?
#include <iostream> #include <iterator> #include <algorithm> bool space_seq(char f,char s){return (f==' ')&&(s==' ');} main(){ std::cin.unsetf(std::ios::skipws); std::unique_copy(std::istream_iterator<char>(std::cin),std::istream_iterator<char>(),std::ostream_iterator<char>(std::cout),space_seq); }
866 :
デフォルトの名無しさん :02/12/06 07:49
for(;;) { char* c=new char[100]; c=NULL; }
for(;;) { char* c=new char[100]; c=NULLPO; }
868 :
デフォルトの名無しさん :02/12/06 13:46
869 :
宿題教えて! :02/12/06 16:02
#include<iostream.h> /*行列を表すクラス*/ template <class T=int,int a=3> class Matrix { T x[a]; public : Matrix(); T &set(int row,int col){return x[(row-1)+(col-1)*a];} //+演算子 friend Matrix<T,a> operator+(Matrix<T,a> &n,Matrix<T,a> &m){ int i; Matrix<T,a> ret; for(i=0; i<a*a; i++){ret.x[i] = n.x[i]+m.x[i];} return ret; } void show(); }; //コンストラクタ template<class T,int a> Matrix<T,a>::Matrix(){ int i; for(i=0; i<a*a; i++) x[i] = 0;} //表示関数 template<class T,int a>void Matrix<T,a>::show(){ int i; for(i=0; i<a*a; i++){cout << x[i] << " " ;if(i%a == 2)cout << "\n";} }
870 :
宿題教えて! :02/12/06 16:03
int main(){ int length=3; Matrix<int ,3> a,b,c;//3行3列の行列 int bNumber[9] = {6,5,4,3,2,1,9,8,7}; int i; for(i=0; i<length*length; i++){a.set(i%length+1,i/length+1) = (i+1)*10;//i*10をセットする} for(i=0; i<length*length; i++){b.set(i%length+1,i/length+1) = bNumber[i];//あらかじめ用意されたbNumberを入れる} c.show(); c = a + b;//ここが実行されない c.show(); return 0; } /*C++ですが、行列のクラスをテンプレートで実現して、 + - * の演算子とinverse関数を実現せよ!とか云って来るんですよ だから・・・お願いします。教えてください。 +のとこだけでよいので・・・ 相談スレでスレ違いだったのでこっちに聞きます マルチですが、相談すれは無視してください。 */
マルチうざー
872 :
宿題教えて! :02/12/06 16:15
マルチっていうかスレ違いって云われて
こっちに誘導されますた
>>871 分かるならおしえて!
実行されないってどういうことよ?
>>869-870 T x[a];
でa(=3)個分しか用意してないのにa*a個にアクセスしようとしているお前に乾杯
875 :
デフォルトの名無しさん :02/12/06 16:24
friend... You and I are friend?
876 :
宿題教えて! :02/12/06 16:33
877 :
宿題教えて! :02/12/06 16:36
できた〜〜 いちおーjavaプログラマのつもりだったのに 情けないです・・・ 修行してきます
878 :
デフォルトの名無しさん :02/12/06 17:37
>>875 ×You and I are friend?
○Are you my friend?
879 :
デフォルトの名無しさん :02/12/06 17:47
int ch, last_ch = 0; while ((ch = getchar()) != EOF) { if (ch == ' ' && last_ch != ' ') putchar(ch); last_ch = ch; }
880 :
デフォルトの名無しさん :02/12/06 17:49
おもいっきり間違えた…。 while ((ch = getchar()) != EOF) { if (ch != ' ' || ch != last_ch) putchar(ch); last_ch = ch; }
881 :
デフォルトの名無しさん :02/12/06 17:50
全然ダメだ…。 while ((ch = getchar()) != EOF) { if (ch != ' ' || (ch == ' ' && ch != last_ch) ) putchar(ch); last_ch = ch; } つーか複雑になってきたので意味無し。
何したいのさ
つーか JPS、前に 「漏れに聞け」 スレで全く同じの扱ったろう。 もう ungetc() を忘れたのか?
>>881 if(ch != ' ' || lash_ch != ' ')
>>883 JPSのカキコは全部釣りだって気づいてないのか?
reiterate me.
(´-`).。oO(VBスレで釣りだって喚いてた人かな…
if (fabs(DD) <= EPSILON)
>>889 EPSILONって「十分小さい値」って意味ですかね?
入門用の本にはのって無いんですが。
if(D == 0.0)をif (fabs(DD) <= EPSILON)に置き換えたら, Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland niji.c: エラー E2451 niji.c 41: 未定義のシンボル DD(関数 main ) エラー E2451 niji.c 41: 未定義のシンボル EPSILON(関数 main ) 警告 W8070 niji.c 61: 関数は値を返すべき(関数 main ) っていうエラーが返ってきちゃったんですけど,なにか定義しなくちゃいけないんでしょうか?
いや、それは自分で定義するもんじゃないの。 fabsって見た感じ、絶対値返すっぽいし。
探すか,創る。つか、それぐらい作れ
>>894 > #define EPSILON 0.0001
そんな事するなするな。
<float.h> の DBL_EPSILON や FLT_EPSILON を使え。
> DBL_EPSILON や FLT_EPSILON まあ、もともとこんな定数用意してるぐらいだったら、標準で判定関数かマクロか 用意してくれてもいいじゃんとは思うけどナー。
#include <float.h> if(fabs(D) <= DBL_EPSILON) 記述の方法は↑で良いのでしょうか? microsoftのページに 2.2204460492503131e-016 として定義された double 用の定数 DBL_EPSILONとあったのですが, DBL_EPSILONは「どんな場合にも適したdouble用のEPSILONの値」という認識で間違ってませんか?
判別式が負だったら解なし、解を二つ求めて等しくなったら重解ってことにすりゃいいじゃん。
>>898 その場合でも
|x1-x2|<=DBL_EPSILONにする必要がありそうな
>>899 非常に近いけど重解じゃありません、でいいんじゃん?
fabs() 呼ぶのと、-DBL_EPSILON 〜 DBL_EPSILON の範囲でチェックするのとでは どっちが速いんだろうな?
微妙だが、FPU持っててインラインに展開されるとか、signビットのクリアに なるようならfabs()のほうが速いかもしれん。
要素数が n である配列 a から key と一致する全要素の添え字を、配列 idx の先頭から 順に格納し、一致した要素数を返す以下の関数を作成せよ。 int seachidx(int a[], int n, int key, int idx[]); 誰か完成させてくださいませんか?
>>903 これでいいのか?
int seachidx(int a[], int n, int key, int idx[]) {
int i, j;
j = 0;
for (i = 0; i < n; i ++) {
if (a[i] == key) {
idx[j] = a[i];
j ++;
}
}
return j;
}
906 :
デフォルトの名無しさん :02/12/07 23:35
0から1の実数をパラメータとして白黒階調画像を表示するPGを作りたい んですけどアドバイスもらえませんか?
907 :
option :02/12/07 23:41
>◆F52DmOxJlcさん ありがとうございました。 今コンパイル出来ませんが(都合により)後日コンパイルしてみます。 本当に助かりました。
>>907 インデントに全角スペース使ってるからコピペはするなよ。
>>906 画像関係は経験ないのでわからない。すまん。
>>903 C++なら一行。
int seachidx(int a[], int n, int key, int idx[]) {
return std::remove_copy_if(a, a+n, idx, std::bind2nd(std::not_equal_to<int>(), key)) - idx;
}
>>906 よくわからんが、
「1つ1つの画素の輝度が[0,1]の実数で表されている画像を、
白黒2値の表示装置で表示したい」という意味なら、ディザリング
するのがよろしかろう。
#include <stdlib.h>
void dither(double input[], char output[], unsigned size,
double contrast, double brightness)
{
unsigned i;
for (i = 0; i < size; i++) {
double d = rand() * 2.0 / (RAND_MAX + 1) - 0.5;
output[i] = (input[i] + d * contrast > brightness);
}
}
>>909 >906の言う「0から1の実数」が、「0以上1以下の実数」のことだったら
256倍すると256諧調に収まらないので、
255倍の方がいいかも。
しまった!添え字を入れるのか・・・
たくさんの方ありがとうございます。 912さんの言われると通り0以上1以下の値を持った 2次元配列の値をパラメータとしてそのパラメータを 突っ込めば白黒階調画像が表示できるようなPGという意味でした。 説明不足ですみません。
255倍というナイスアイディアありがとうございました。 ぐぐりました所いい感じのソースが見つかりました。 またなにかありましたらよろしくお願いします。
>>917 そうか、ここはOKなんだな。>1にもとくに書いてないし。
宿題スレは丸投げ上等だからな。 よくわからん質問。マルチは不定だが。
920 :
デフォルトの名無しさん :02/12/08 12:45
こんな宿題がでました。 typedef struct{ int y;/*西暦年*/ int m;/*月(1〜12)*/ int d;/*日(1〜31)*/ }YMD; 上の構造体が与えられているとする。 日付xのn日後の日付を返す以下の関数を作成せよ。 YMD after(YMD x, int n); 日付xのn日前の日付を返す以下の関数を作成せよ。 YMD before(YMD x, int n); 。。。ヒント。。。 ★日にち★ ▼1〜27▼ 日にちに+1 ▼28(2月) うるう年か?▼YES 日にち+1,NO 月+1、日にち+1 ▼29 2月?▼YES 月+1、日にち=1,NO 日にち+1 ▼30 4,6,9,11月?▼YES 月+1、日にち=1,NO 日にち+1 ▼31 12月?▼YES 年+1、月=1、日にち=1,NO 月+1、日にち=1 うるう年は int isleap(int year) { return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); } で求める。 ちなみに西暦は深く考えなくていいです。1735年(?)以前がどうとかあった 気がしましたが。 丸投げ上等らしいので、誰かソース提供して欲すぃのですが・・・。 だめかなぁ・・・。
static long jday(YMD x) { int y = x.y, m = x.m; long d = x.d; if ((m -= 3) < 0) {m += 12; y--;} d += (long)y * 365 + y / 4 - y / 100 + y / 400; return d + (m * 153 + 2) / 5; }
static YMD toYMD(long d) { int y, m; --d; y = d / (365 * 400 + 97) * 400; d %= 365 * 400 + 97; y += (d / (365 * 4 + 3)) * 4; d %= 365 * 4 + 3; y += d / 365; d %= 365; m = (d / 153) * 5; d %= 153; m += (d / 61) * 2; d %= 61; m += d / 31; d %= 31; ++d; if ((m += 3) > 12) {m -= 12; ++y;} {YMD x = {y, m, d}; return x;} }
YMD after(YMD x, int n) { return toYMD(jday(x) + n); } YMD before(YMD x, int n) { return after(x, -n); }
ヒントが出てるんならそれに沿って回答した方が先生も喜ぶかな。 YMD after(YMD x, int n) { int i; for (i = 0; i < n; i ++) { if (x.d < 28) { x.d ++; } else if (x.d == 28) { if (x.m == 2 && isleap(x.y)) { x.m ++; x.d = 1; } else { x.d ++; } } else if (x.d == 29) { if (x.m == 2) { x.m ++; x.d = 1; } else { x.d ++; }
} else if (x.d == 30) { if (x.m == 4 || x.m == 6 || x.m == 9 || x.m == 11) { x.m ++; x.d = 1; } else { x.d ++; } } else { if (x.m == 12) { x.y ++; x.m = 1; x.d = 1; } else { x.m ++; x.d = 1; } } return x; } before() は after() を改造すればできるよね。
おぉ!!こんなにソースが!! 有難いです。ここにいる方々には感謝してもしきれません。 本当にありがとうございました。 >◆F52DmOxJlc さん あなたの事は神と呼ばせて下さい!! 神(^^)/ありがとう!!
>>926 インデントに全角スペース使ってるからコピペはするなよ。
しかも動作確認してないから間違ってたら適当に修正しておくれ。
//この程度で神はカンベンw
いやー、JPSも成長したなあ。 人にいろいろ教えてあげるようになったとは。
929 :
デフォルトの名無しさん :02/12/08 14:48
配列にデータを入力し、二乗の和と平均を表示するプログラムを作りなさい。 ただし、入力、二乗の和、合計のための関数を作って利用しなさい。 #include <stdio.h> void input(double a[], int n); double sum2(double sum2[],int n); double sum(double sum[], int n); int main(int argc, char* argv[]) { double y[1000]; int n; printf("いくつ入力するか決めてください:"); scanf("%d",&n); input(y,n); printf("二乗の和は%fです。\n",sum2(y,n)); printf("平均値は%fです。\n",sum(y,n)/n); return 0; } void input(double a[], int n) { int k; for(k = 0; k < n; k++) { printf("%d個目の数字を入力してください:", k+1); scanf("%lf", &a[k]); } }
馴れ合いはカンベンw
double sum2(double sum2[], int n) { int i; double x = 0; for (i = 0; i < n; i++) { x += sum2[i]*sum2[i]; } return x; } double sum(double sum[], int n) { int i; double x = 0; for (i = 0; i < n; i++) { x += sum[i]; } return x ; } 作ってみたんですけど不安なのでおかしいところとか言ってくれませんか?
すまん、
>>922 は間違ってた。百年単位の閏年の処理を抜かしてたのと、4年単
位のところでなぜか3を足してた。
static YMD
toYMD(long d)
{
int y, m;
--d;
y = d / (365 * 400 + 97) * 400; d %= 365 * 400 + 97;
y += (d / (365 * 100 + 24)) * 100; d %= 365 * 100 + 24;
y += (d / (365 * 4 + 1)) * 4; d %= 365 * 4 + 1;
y += d / 365; d %= 365;
m = (d / 153) * 5; d %= 153;
m += (d / 61) * 2; d %= 61;
m += d / 31; d %= 31;
++d;
if ((m += 3) > 12) {m -= 12; ++y;}
{YMD x = {y, m, d}; return x;}
}
修正ありがdです。 学校行ったらさっそく試してみますね。
>>932 たびたびすまん。2000/2/29が間違ってた。
> y += (d / (365 * 100 + 24)) * 100; d %= 365 * 100 + 24;
ここをこうしる。
if (d == 365 * 400 + 96) {
y += 3;
d = 365 * 100 + 24;
}
else {
y += (d / (365 * 100 + 24)) * 100; d %= 365 * 100 + 24;
}
>>934 禿しく鬱。
static YMD
toYMD(long d)
{
int y, m, i;
--d;
y = d / (365 * 400 + 97) * 400; d %= 365 * 400 + 97;
if (d == 365 * 400 + 96) {
y += 399;
d = 365;
}
else {
y += (d / (365 * 100 + 24)) * 100; d %= 365 * 100 + 24;
y += (d / (365 * 4 + 1)) * 4; d %= 365 * 4 + 1;
if (d == 365 * 4) {y += 3; d = 365;}
else {y += d / 365; d %= 365;}
}
m = (d / 153) * 5; d %= 153;
m += (d / 61) * 2; d %= 61;
m += d / 31; d %= 31;
++d;
if ((m += 3) > 12) {m -= 12; ++y;}
{YMD x = {y, m, d}; return x;}
}
N×L行列と、L×M行列の積を求めるプログラムですが、 N、L、Mをmain関数の中で与えたいのですが、 どのようにしたらよろしいのでしょうか? #include <stdio.h> #include <stdlib.h> #define N 3 #define L 5 #define M 4 typedef double matNL[N][L]; typedef double matLM[L][M]; typedef double matNM[N][M]; void multiply(matNM c, matNL a, matLM b) { int i, j, k; double s; for (i = 0; i < N; i++) for (j = 0; j < M; j++) { s = 0; for (k = 0; k < L; k++) s += a[i][k] * b[k][j]; c[i][j] = s; } } void matprint(int nrow, int ncol, double *a) { int i, j; for (i = 0; i < nrow; i++) { for (j = 0; j < ncol; j++) printf("%8.1f", *a++); printf("\n"); } }
int main(void) { int i, j; static matNL a; static matLM b; static matNM c; for (i = 0; i < N; i++) for (j = 0; j < L; j++) a[i][j] = rand() / (RAND_MAX / 10 + 1); for (i = 0; i < L; i++) for (j = 0; j < M; j++) b[i][j] = rand() / (RAND_MAX / 10 + 1); printf("A\n"); matprint(N, L, (double *)a); printf("B\n"); matprint(L, M, (double *)b); multiply(c, a, b); printf("AB\n"); matprint(N, M, (double *)c); return (0); }
>>939 malloc/freeは少しだけ使ったことあります。。
mallocでa[N][L]、b[L][M]、c[N][M]を確保して、
やろうと思ったのですが、
multiply()を定義する部分で、
()内をどうしたらよいのかわかりませんでした。
void multiply(double *c, double *a, double *b, int l, int n, int m) { int i, j, k; double s; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { s = 0; for (k = 0; k < l; k++) s += a[i*l+k] * b[k*m+j]; c[i*m+j] = s; } } }
>>941 ありがとうございます。
ちょっと、やってみます。
すみません。C言語のMAKEファイルの宿題が出たんですが さっぱりわからないんですがどこかに使い方の解説のサイトは無いでしょうか? すれ違い?
C言語初心者です。 19の47乗を143で割った余りを求めたかったので C言語で以下のような記述をしました。 printf("%d\n", (int)pow(19, 47) % 143); すると表示される結果は-24となります。 正の数を正の数で割ったので、あまりがマイナスになることはありません。 実際に合同式を用いて手作業で計算すると、 答えは24になりました。 どうしてC言語を用いて計算するとマイナスになるのでしょうか? 環境はCygwin+gccです。
区間[0,1),[1,2),[2,3)に含まれるデータの個数を 配列を用いてカウントするプログラムを作成せよ。 ただし、個数のカウントに条件分岐をしようしてはいけない。 データ型の変換について習ったんでそれを使うんでしょうが、 条件分岐を使わないでどう組むのか全く分かりません。 助言お願いします。
>>944 19の47乗は61桁ほどになり、通常の処理系ではintでもdoubleでも正確に
表せないからどちらにしろ答えは無意味。
>>944 19の47乗は10進で61桁の数になる。
浮動小数点数の有効桁数は17桁くらいだから、
正確な計算は全く期待できない。
>>945 その3つの区間の数値は、小数点以下を切り捨てるとそれぞれ
0, 1, 2になる。これを配列の添え字に使う。
>>944 > 実際に合同式を用いて手作業で計算すると、
最初からそっちでプログラムしろ。
>>939 ,941
ありがとうございました。
無事解決できました。
>>944 前スレに似たような質問があったような気がするが。
unsigned long int modpow(unsigned long int a,unsigned long int k,unsigned long int m){ unsigned long int b; for(b = 1; k > 0; a = a * a % m, k >>= 1) if(k & 1) b = b * a % m; return b; }
>>953 ビット演算がよく分かりません。
それはどういうアルゴリズムで、
どのぐらいの大きさまで計算できるんですか?
956 :
デフォルトの名無しさん :02/12/09 04:34
>>955 その(゚Д゚)ハァ?の意味がわからない。どこかおかしいか?
958 :
デフォルトの名無しさん :02/12/09 04:50
959 :
デフォルトの名無しさん :02/12/09 05:24
リストに関するプログラム例として英語の文書ファイルに現れる単語リスト を作成するプログラムを考えることにする。 #include <stdio.h> #include <stdlib.h> #include <string.h> struct CELL{ char word[32]; struct CELL *next; }; int main(){ struct CELL *words, *p; char newword[32]; words = NULL; while(scanf("%s",newword)== 1){ for(p=words; p!=NULL; p=p->next) if(strcmp(newword, p->word)==0)break; if(p==NULL){ p=(struct CELL *)malloc(sizeof(struct CELL)); strcpy(p->word,newword); p->next=words; words = p; } } for(p=words; p!=NULL; p=p->next)printf("%s\n", p->word); }
960 :
デフォルトの名無しさん :02/12/09 05:26
>>959 の例プログラムを単語リストがアルファベット順になるように
機能拡張してください。よろしくお願いします。
>>946 有難うございました。当方初心者なものでこれでも
難しいです。MAKEする上でコンパイルについて簡単に書かれて
いるものってないでしょうか。
962 :
デフォルトの名無しさん :02/12/09 06:12
スプレットシートのコード教えて
>>961 >>946 のページはgoogleで出た中で一通り書いてある所を選
んだだけだから、もっと単純なところも出て来るよ。
>>960 〜略〜
int main(){
struct CELL *words, *p, *prev;
char newword[32];
words = NULL;
while(scanf("%s",newword)== 1){
prev=NULL;
for(p=words; p!=NULL; p=p->next){
if(strcmp(newword, p->word)<0)break;
prev=p;
}
p=(struct CELL *)malloc(sizeof(struct CELL));
strcpy(p->word,newword);
if(p==NULL || prev==NULL){
p->next=words;
words = p;
} else {
p->next=prev->next;
prev->next=p;
}
}
for(p=words; p!=NULL; p=p->next)printf("%s\n", p->word);
}
>>964 どうもありがとうございます!
これで、レポートは間に合いそうです。
>>954 (m-1)*(m-1) が桁溢れしなければ計算できるよ。
m が大きい場合はかけ算も同じように二進展開して計算するといい。
968 :
デフォルトの名無しさん :02/12/11 19:02
最後の伸びが悪いな。 宿題こいやこいや〜。
Amazon で注文したあずまんが大王が先ほど届いたので、これから読もうと思います。 応援してください。
引き篭もりは篭れ!
鼻血出ますた
973 :
デフォルトの名無しさん :02/12/11 22:16
入力されたタブを,次のタブストップまでのスペースをうめる適当な数の空白で置き換える プログラムを書け。 タブストップの位置は,例えばn文字ごとというように固定して考えよ。 という問題なんですが,文章の意味をもう少し判りやすく説明してください。
「タブストップ」の意味はわかっているのか?
975 :
デフォルトの名無しさん :02/12/11 22:27
日本語を噛み砕けというのは C/C++ の話じゃないと思うが・・・。 例えば 「タブ幅=4」 と設定された時に、 "a[\t]bc[\t]def[\t]ghij[\t]klmno[\t]pqrstu という文字列を、 "a bc def ghij klmno pqrstu" に展開しろという事だろ。
>>974 ただの\tじゃないんですか?
[\t]がタブストップ?
>>977 その通り。
[\t] は単に見やすく書いただけ
>>976 そういうことですか
\tの時に,
if(c[cnt]=='\t'){
printf(" ");
printf(" ");
printf(" ");
printf(" ");
}
という風に,表示するのをスペースにするものだと思っていました
文字列自体を変換するってことですか
いろいろとありがとうでした
>if(c[cnt]=='\t'){ >printf(" "); >printf(" "); >printf(" "); >printf(" "); >} これだと条件が足りない。 ab[\t]cd のとき、 abの後ろに、半角スペースが ’2個 ’ だから。
981 :
デフォルトの名無しさん :02/12/12 14:34
新スレ逝くの?
982 :
デフォルトの名無しさん :02/12/12 14:44
ねえ逝っちゃうよ?逝っていいの?ぬるぽ(((;゚∀゚)))ガクガクブルブル
983 :
デフォルトの名無しさん :02/12/12 21:42
>>976 アニキ
そのプログラムできませんでした・・・
教えて・・・
s1=strtok(" ",s);//hankaku'space'kugiri space_of_long = 4-strlen(s1); put(s1); space_of_long bun space put... ?
TpTab
int main(void) { const int tab_stop = 4; char buf[] = "a\tbc\tdef\tghij\tklmno\tpqrstu\t"; char *p = buf; int col = 0; printf("\"%s\"\n", buf); putchar('\"'); while(*p) { if(*p == '\t') do putchar(' '); while(col = (col + 1) % tab_stop); else putchar(*p), col++; p++; } putchar('\"'); return 0; } strtok() だと最後のタブ文字が捕捉できないにょ
英小文字を英大文字に出力が作りたくて 以下のように組んだんですが、大文字がうまく変換されません。 どこがまずいでしょうか? #include<stdio.h> void change(char *a) { while (*a != '\0'){ if (0x61 <= *a <= 0x7a) *a -= 32; a++; } } main() { char a[100]; printf("input words\n"); scanf("%s", a); printf("%s\n", a); change(a); printf("%s\n", a); return 0; }
よくわからんが toupper() を使え。
989 :
デフォルトの名無しさん :02/12/13 15:33
>>987 よくわかるが toupper() を使え
#include <stdio.h> #include <ctype.h> int main(void) { char buf[100], *p = buf; puts("input words"); fgets(buf, sizeof(buf), stdin); fputs(buf, stdout); while(*p = toupper(*p)) p++; fputs(buf, stdout); return 0; }
レス、有難うございます。 書き忘れていたんですが ASCIIコードを使って変換しろということでした、すみません。 前述したプログラムを実行すると 英大文字も小文字と同様 -32されているようなので if (0x61 <= *a <= 0x7a) これがまずいのかなと考えてるんですが・・?
> ASCIIコードを使って変換しろ その課題出した香具師、砲撃していいよ・・・
if (0x61 <= *a <= 0x7a) ↓ if (0x61 <= (unsigned char)*a <= 0x7a)
>>991 > if (0x61 <= *a <= 0x7a)
そういう書き方はできないよ。
if (0x61 <= *a && *a <= 0x7a)
995 :
デフォルトの名無しさん :02/12/13 16:18
a++している場所が悪 よく考えて
996 :
bloom :02/12/13 16:19
997 :
デフォルトの名無しさん :02/12/13 16:20
>>991 激しく( ゚Д゚)マズーです
if (0x61 <= *a && *a <= 0x7a)
としなさい
<=は左結合演算子なので左から順に評価されます
0x61 <= *a <= 0x7a とすると
まず 0x61 <= *a が評価され
この時点で大文字も小文字も真になります
言い切れませんが真は大抵 1 なので
0x61 <= *a が 1 に置き換わり
その後に右の <= が評価されるので
1 <= 0x7a が評価されることになり
これも真となります。
結局 if (0x61 <= *a <= 0x7a) だと
大文字小文字どころか
0x61 <= *a が成り立てば
全部通ってしまいます
if ('A' <= *a && *a <= 'Z') *a = (*a - 'A') + 'a'; よく読んでないけど、こうすべきだと思ったのは俺だけか
次スレ立つまで書き込み禁止
漏れ立てられないからだれかヨロシク
>>993 おいおい
1000 :
デフォルトの名無しさん :02/12/13 16:20
お前等C/C++なんて糞言語やってないでDelphiしろ! デルファイ!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。