C/C++の宿題なら俺にやらせろ!

このエントリーをはてなブックマークに追加
1C++房 ◇9ye75cT6
俺はC++房。
今まで8ヶ月、毎日休まず一生懸命C++を勉強してきた。
わからない宿題若しくは処理があったら俺にやらせてくださいm(_ _)m
ただしソート、2分木など俺が5分以上悩むの問題はお断りだ。
他の手強に聞いてくれ
3C++房 ◆Mjk4PcAe16 :02/11/06 17:49
C++房#::
C++房#2
4C++房 ◆bK0oO/M0ho :02/11/06 17:49
5C++房 ◆9J9ye75cT6 :02/11/06 17:50
 
前スレ:C/C++の宿題なら俺にやらせろ!
http://pc3.2ch.net/test/read.cgi/tech/1021862587/
7 ◆9J9ye75cT6 :02/11/06 17:57
お疲れ
8お願い・・:02/11/06 17:58
線形探索法の検索の計算量は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.ハッシュよりも単純である。
148です。。:02/11/06 18:17
すみません、、
登録されているデータ値は0以上9999
以内の整数です、というのを書き忘れました。
15デフォルトの名無しさん:02/11/06 18:19
>>14
キーが整数ってこと?
データは?
キーの重複や値の重複があるかどうかを教えてくれ。
17デフォルトの名無しさん:02/11/06 18:24
int d[10000];
で解決ですね。
キーの種類が1000で整数なら、配列に入れるだけで解決だけど。
(これもハッシュといえばハッシュだけど)
198です。。:02/11/06 18:30
問題文をそのまま写します。

線形探索法の検索の計算量は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 の言っているやり方だろうね。
最適化で削られる気がする。
2421:02/11/06 18:38
あ、mallocの引数の"テーブルサイズ"とfor内の"テーブルサイズ"は何気に別物だけどその辺脳内補完よろしく
258です。。:02/11/06 18:45
ありがとうございます.
17様、21様のやり方で考えてみます。
26gcc:02/11/06 18:45
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;
時刻に時刻を足すなんて・・・そもそも意味不明じゃん・・・
時刻に時間を足すんならわかるが・・・・
31gcc:02/11/06 19:05
>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;
}
33gcc:02/11/06 20:41
ST_TIME sum;
のsumって何の事ですか?
Jishohike
summer_time
36デフォルトの名無しさん:02/11/06 23:27
あぁ、踊りの得意な
37コンパイラ:02/11/07 21:43
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
>何処が違ってますか?教えて下さい。

実行してみれば分かるじゃん。

39コンパイラ:02/11/07 22:15
実行したら、日がうまくでません。
>>37
26 と同じ話か?
41デフォルトの名無しさん:02/11/07 22:20
sum.day = sum.hour/24
42コンパイラ:02/11/07 22:21
同じですが、>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(「悩むの問題」ってなんだよ…)
45コンパイラ:02/11/07 22:26
>43
while文などを使ってはできませんか?
46デフォルトの名無しさん:02/11/07 22:27
>>45
できるよ。
>>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() は、引き算とかに流用できる。
48コンパイラ:02/11/07 22:39
>47
確かにそうなのですが、>43のプログラム以外の
プログラムが勉強のために欲しかったのです。
ありがとうございました。
どうせ課題で「whileを使うこと」みたいな条件がでてるんだろ。
50コンパイラ:02/11/07 22:56
>50
でてない。
構造体の課題で、whileを使うかどうかなんて
関係ないでしょ
>>48
常に最適解を求める勉強をしてくれ。
つーか、腕試しなら人に訊くな。
>>50
つーか、結局課題なのかよ。
自分で解けよ。
>>52
腕試しでないと思われ
>>53
解けないから、ここに来てるんだろ
>>53
いや、ここはそのためのスレじゃないのか?
>>56
よく考えたらそうだな。
>>51-57
ここの最適解を(以下略
>>58
任せた。
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;
}
6562:02/11/08 15:08
早速レス感謝
言葉足らずでした。なにせ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
人に聞くときは、初心者であろうが、凡人であろうが
実装プログラムを書くのが一般的。
6862,65:02/11/08 15:19
>>66
ありがとうございます!できました!!
この2日間の悩みが解決できました。感謝です

>>67
ご指摘感謝
次回お世話になる時はそうします
69両津勘吉:02/11/08 16:15
#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;
}

大ピンチになっています。上のプログラムを改良して両津勘吉という名前を
一文字づつ表示するプログラムはなんとかできました。
でもそこは提出しなくていいらしくて、今度はそれを改良して、両津勘吉という文字を、
一文字づつ左に表示して、左端についたら次に右に一文字づつ
表示するプログラムを作りたいのです。

どなたか暇な方がいたらよろしくお願いします。
71両津勘吉:02/11/08 16:18
出力例

1     吉
2    勘
3   津
4  両
5   津 
6    勘
7     吉

どなたか助けてくださいお願いします

72両津勘吉:02/11/08 16:19
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;
}

つーか、これでいいのか?
76両津:02/11/08 17:42
>>75さん




いまCCがうまくいきますた。何とかなりそうですありがとうございます。

CCってカードキャプター?
>>77
そうです。
1.足し算関数を作成しなさい

int hoge( short* a, short b )
引数
short* a 加算先
short b 加算数
戻値0 正常
1 加算でオーバーフロー

…という問題が出されたんですけど、わかりません。
8079:02/11/08 20:59
#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
だった場合どうするの?
8281:02/11/08 21:06
= が一個抜けた…
>>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;
}
こういうことじゃないの?
8479:02/11/08 21:07
>>81
abs()で絶対値とってるからオーバーフローになると思います。
8579:02/11/08 21:15
>>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;

名前空間を知ってね。
9287:02/11/09 21:42
>>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;
}

9695:02/11/09 22:10
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にはリソースエディタついてないんですか?
103超初心者:02/11/09 22:38
>>98
汎用化したいのだろう?

>>95
面白そうなんで組んでみる。
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
>>102
誤爆スマソ。
>>95-96
勤労感謝の日だって・・・いつだっけ?
煩悩
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); // ここでエラー

これってなんかまずいことやってるんですか?
11095:02/11/09 23:06
>>100
変数は、何か単語みたいなの方が良いんでしょうか?
「使いやすさ」という点でそこら辺を考慮してみて、考察したいと思います。

オブジェクト化…(以下略
は、ちょっと良く意味が分からないので、調べてみます。
レスありがとうございました。

>>103
そうです、汎用化したいのです。#Define とか使えそうですかね?

>>106
今から見てみます。わざわざありがとうございます。

>>107
???
111デフォルトの名無しさん:02/11/09 23:06
a[i]=1;
11295:02/11/09 23:07
>>110
defineか…
113106:02/11/09 23:09
>>95
#defineではなくて>>100の言う通り、メンバでまとめる方向で。
114103:02/11/09 23:10
誤 106
正 103
115106:02/11/09 23:18
誤 103
正 106
11695:02/11/09 23:19
>>113
メンバって構造体とかあの辺でしょうか?
実はまだ習ってないんです。いい機会なんでそこら辺読んで見ます。

乗算ってなるべく回数減らすように、うまく変形したほうが良いんですよね?
pow()ってのがありますが、これはアルゴリズム的にあまり優れてないんでしょうか?
これはlog計算してからというように遠回り(?)してるので、効率的でないと
聞いたことがあります。どうでしょうか?
>>109
a.reserve(10); → a.resize(10);
118103:02/11/09 23:25
>>113
なかなか2分法・・・手ごわいです。

>pow
えっ・・・、普通にpowで組んでいますが。
そこまで速度は変わるものではないと勝手に思い込んで作っちゃっています。
こういうのか?
ax^3+bx^2+cx+d
((ax+b)x+c)x+d
12095:02/11/09 23:34
>>118
いや、このくらいのプログラミングなら問題ないんですがね…

自分がやってるのは詳しく言うと、
f(x) = mx^3 - 3mnx^2 + (3mn^2 - m)x -mn^3 + mn
って、式があって、mとnは各人違う値が与えられて、
その解の一つの前後0.5で、はさみうちを実行して、真の解に対して1%
以下の誤差になるまで何回計算したらいいのか?

って感じです。
しかし、収束が早いのか1回で求まる。
ニュートン法も1回でした。2次収束でこれだけ速いのか…
12195:02/11/09 23:35
>>119
そうです。そういうことです。乗算の回数はできるだけ減らしたほうが
効率はあがりそうですから。加算に比べて乗算は4,5倍遅いって聞いたことあるので。
>>116
double使ってる時点であんまり関係ないと思う。
再帰的にX^nを求めてやってX^2〜X^nをどこかに
ストックして再利用すれば、計算は減らせるね。
挟み込むべき点を導関数で求めてやる時にも
使えそうだし。
12395:02/11/09 23:42
>>122
そっか〜。では、m,nをintにして、キャストしてみるってのはどうでしょう?
12495:02/11/09 23:45
>>120
間違った…
nの前後ではさみうちだった…

とりあえず風呂入って考えてきます。
>>123
m,nの範囲の想定次第。
12695:02/11/09 23:49
>>125
そうですが、この場合は整数しかみんな与えられませんでしたので。
しかし、汎用性を考えるとやはりdoubleか。
q2 = ( f( q1 )*q0 - f( q0 )*q1 )/( f( q1 ) - f( q0 ) );
はさみうちってこうやるの?
q2 = (q0+q1)/2;
かと思った。
128103:02/11/10 00:00
>>95
汎用設計は、ほぼ出来たよー。
、て言うかクラスのヘッダー部分だけ('д';)

方程式の計算等はみんなの方が詳しそうだから任せたー。
>>127
if ( f( q2 )*f( q1 ) > 0 ){
  q0 = q2;
}
else
  q1 = q2;
とあるじゃん。
少し違うけど。
130103:02/11/10 00:15
>>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
それじゃ一回目で終わるだろが。
13295:02/11/10 00:29
>>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;
}
134133:02/11/10 00:38
>>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++でしかコンパイル通してない。
>>127
中間値?
136103:02/11/10 00:43
>>95
ま・・・まじっすか〜。~(°°;)))オロオロ(((;°°)~

しかし、こちらも勉強になりました・・・。
13795:02/11/10 00:43
>>133
なるほど。はさみうち自体を関数にしてしまって、回数を戻すってことですか。

(*f)(double)とdouble* xは何なんでしょうか?後者は真値でしょうか?

>>134
え!?マジっすか?VisualC++でやってるからコンパイルできたんでしょうか?
138103:02/11/10 00:48
しかし、>>130修正。
コンストラクタはdouble配列で渡すようにした方が汎用性よし。
SetFuncやらを追加して、関数の定義しなおしを定義するように
した方がいい。(その場合、コンストラクタをオーバーロードできて
いい感じかも)

もうぜんぜん関係なかったけど以上です。
>>137
double (*f)(double) 引数 double 戻り値 doubleの関数のポインタ。
double* x はxのポインタ。
将来Cを使い込むのであればポインタは理解しとくといい。
14095:02/11/10 00:50
>>138
本当にすみません…
関数のポインタ f ってのは、
double Func(double a){
}
という関数があるとき
f=Funcと関数を値(アドレス)にできること。
142103:02/11/10 00:53
>>95
いいって事よ♪
143139:02/11/10 00:54
x はxのポインタ-->x はdoubleのポインタ
シマツタ
103ってイイ奴だな。
14595:02/11/10 01:06
ってことは、
k = hasami( &f,q0, q1, 0.08,&x);
printf("回数 = %d\n",k);

って感じでいいんでしょうか?
はさみうちを関数にしたほうが汎用性は高いですね。
146133:02/11/10 01:23
>>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文がいまいち理解できてないので分かりません。お願いします。
150PROBLEM 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;
}
>>149
専修・・・
#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);
}
>>149
演習ですか?
>>153
専修の課題です。
157デフォルトの名無しさん:02/11/10 15:24
専修って、専門って意味?
専修大学ネットワーク情報学部
159149:02/11/10 15:38
違う大学ですが・・・
160デフォルトの名無しさん:02/11/10 15:41
あ、専修って大学があるのね。
161149:02/11/10 15:46
154のプログラムだと8桁以外はうまくいかないんですが。
あと123400などの場合は4321ってのも。
162デフォルトの名無しさん:02/11/10 15:52
>>161
当たり前だろ。配列数8なんだから…
00のところは条件判断で捨てればいいんじゃないの?
>>162
可変長配列使うって手は?
164154:02/11/10 15:55
>>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);
}
165JPS ◆M0LaMzf5rY :02/11/10 15:57
8桁までだから、そこはお前が欲しい最大の桁に変えればいいべ。
166デフォルトの名無しさん:02/11/10 15:59
>>163
それでscanfして勝手に灰列数変えればいいか。マクロ使ったほうが良さそう。
167149:02/11/10 16:06
たしか配列使わなくてもできるって言ってました。
168JPS ◆M0LaMzf5rY :02/11/10 16:09
>>167
オレには分かんない。ごめん。
169103:02/11/10 16:25
>>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);
}
170103:02/11/10 16:27
ということで、出かけてきます。
171149:02/11/10 16:37
>>169
どうもありがとうございます。
#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
>>149を作ってみた。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=28
添削などしてもらえませんか?

ソース中のprintfを消すと正常に動作しません。
原因をできたら教えてください。
179デフォルトの名無しさん:02/11/10 22:10
みんなスマートに書いてるのに
なんでオレはこんなに長ったらしくなるんだろう。
180103:02/11/10 22:13
あら、間違ってるわ(汗)
逝ってきます。
181178:02/11/10 22:19
一応)コンパイラはbccです。
182178:02/11/10 22:40
ソースうぷ板の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;
}
185takeru: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++;
186takeru@つづき: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はこれ以上無理だそうなのでこれ以上助言しても無駄です。
189takeru:02/11/11 16:22
宿題手伝いますyo!
のほうの819のやつもCCはできてもa.outするとうまくいかない・・・
あきらめたほうがいいっぽいです・・・・
いろいろおしえてくれたみなさま。おれがアホですいません・・。
あと宿題手伝いますYO!の818のひともありがとうございました。
ただ主旨が少し勘違いされてしまいました・・・。

あといっかい出さないと補習だな・・・・・・

>>189
正直なところ補習を受けたほうが長い目で見るとおまえのためだろ。
191149:02/11/11 23:43
最後に書きこんでから実験のレポートやっててこのスレ見てなかったから
>>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
>>196
それでよろしい



オソラク...
198デフォルトの名無しさん:02/11/12 00:41
>>197
どうもありがとうございました!
199デフォルトの名無しさん:02/11/12 00:46
>>32ビットのCPUに対応するコンパイラですよー
こっちの方が正しいかも。。。
80x86系32bitモード用コンパイラだろ
201デフォルトの名無しさん:02/11/12 00:52
先生、よくわからないのですが##の使い方教えてください。
どういう時に使うのですか?
>>201
無理して使わなくていいよ。
コメントを見やすくする
/* ################## ATTENTION!! ################## */
204デフォルトの名無しさん:02/11/12 01:04
で、ちゃんと説明してくれる人はいるんですかね?
>>203では不満なのかね。
##ってマクロで使うやつでしょ。
不満じゃよ。とにかく##が好きなんじゃよ。da##yo好きなんじゃよ。
>>201
##fusianasan[名前]
で書き込みすると、IDの位置と名前の位置が反転するんだよ。
終了。
209デフォルトの名無しさん:02/11/12 01:17
>>208
fusianasan##[名前]
の間違いじゃないのか?##fusianasan[名前] だとトリップが出てしまうぞ。
210ゆうじ:02/11/12 01:18
現在VC++6.0を使い始めましたがメッセージボックスで『はい』を選んだらプログラムが終了する
ようにしたいのですが、まったくわかりません。どなたかちか力を貸していただけませんで
しょうか。
>>201
「書き込みすると」よくわかりません先生。
if(MessageBox(HWND_DESKTOP,"終了しますか?","確認",MB_OKCANCEL)==IDOK)
PostQuitMessage(0);
終了の仕方とメッセージボックスを調べれ。
ANSIはここで聞くな。
終了。
215ゆうじ:02/11/12 01:54
レスありがとうございます。『はい』『いいえ』で『はい』をクリックすると
プログラムが終了するようにしたいのですがその場合はどのように記述すればいいでしょうか?
>>215
MSDN で MessageBox を調べれ。
217ゆうじ:02/11/12 02:07
とってもわかりません。
>>217
あなたが何がわからないのか、とってもわかりません。
219デフォルトの名無しさん:02/11/12 02:26
if(MessageBox(HWND_DESKTOP,"終了しますか?","確認",MB_YESNO)==IDYES)
PostQuitMessage(0);
いちいち HWND_DESKTOP って書かなくても、NULL でいいと思うの
221ゆうじ:02/11/12 02:51
そこを記述するとerror C2660: 'MessageBoxA' : 関数が不正な 4 個の実引数をともなって呼び出されました。
って出てしまうんですがなぜでしょう?
>>221
・・・メッセージボックスで終了確認の前に、ちゃんと動くプログラムは書けてる?
::Messa〜
ってかけ。理由は知らなくてよい。
224ゆうじ:02/11/12 02:57
メッセージボックス以外のプログラムはまだ書いていないです・・・
>>223
原因はそれじゃない。221 のエラーメッセージを良く見ろ。
多分 210 の求めてるコードじゃないが、210 に書かれてる要件は満たしてる。

#include <windows.h>
int main()
{
for(; ; )
if(MessageBox(HWND_DESKTOP,"終了しますか?","確認",MB_YESNO)==IDYES) break;
return 0;
}
227ゆうじ:02/11/12 03:14
HWND_DESKTOPの部分をとりましたらとりあえず動きますのでありがとうございました。
>>224
猫の 「C言語編」 第1〜57章、次に 「Windows SDK編 第1部」 第1〜8章を見れ。
http://www.kumei.ne.jp/c_lang/
質問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]でアクセスできるけど。
231229:02/11/12 18:30
すみません。
今全文を投稿しようと思っていたら、エラーの場所に気づきました。
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) に展開されます。
235234:02/11/12 23:27
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);
249242:02/11/13 03:11
すみませんエラーがこのように出ます。
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
250242:02/11/13 03:14
あと、指定した文字が文字列中に含まれる位置を示す関数を作ってみたんですが、
文字の文字列中の最後の位置だけしか返すことしか分かりませんでした。
すべての位置を返すアルゴリズムアドバイスいただけるとうれしいです。
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);
252242:02/11/13 03:21
>>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++スレ来んな。
なんか可哀想な人が現れたの?
260242:02/11/13 05:17
すみません。もうすずめが鳴きそうでかなりあさってる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週間ぐらい徹夜するはめ
になるので、黙ってそういうもんだとおもっといたほうがいい。
264242:02/11/13 05:35
できました!
ほんと感謝します!

>>263
ポインタなんかもやもや感がとれないのでポインタの本図書館で借りてきます。

文字列中に含まれる文字の数と
文字列中の文字の最後の場所を印字するとこまでできました。
あとは>>251さんのを解読して組み込むだけです。

みなさんレスどうもありがとうございました。
265251:02/11/13 05:41
char *s;
for (s = str; s = strchr(s, c); )
printf("%d,", s-str+1);
printf("\n");
で動くかな。ベタに表示するだけだが。
266242:02/11/13 05:47
>>251
できました!
わざわざ最後までつきあってくれてほんとありがとうござした。
こころが休まりました。
267デフォルトの名無しさん:02/11/13 05:58
ようやく出来たよ・・・。苦労だったな屑ども。
まあお前等如きに敬語使っちまったけど、一度出来ちまえば用なしよ。
さっさと氏ねばーか。検索なんてくだらねーこといってるんじゃねーよ。
チョン
キチガイ
ばーかばーかばーか
うひゃひゃひゃ

俺に利用されて悔しいか?
精々喚いてろチンカスども。
がんばれよ。クリスマスまでに彼女できるといいな。
>>267
いちいち悔しがってたら2chねらなんかやってられん。
というか人生ガンバレヨ。その調子だと将来大変だろうが。
>>267
HTMLのタグが編集できたぐらいでC/C++スレ来んな。
なんか可哀想な人が現れたの?
272教えて厨:02/11/13 12:26
あと30分くらいしたら問題をうpいたします。
神の降臨をお待ちしております。
273:02/11/13 12:28
うpしてたもう。
答えてやろうぞ。
神キタ━(・∀・)━!
275教えて厨:02/11/13 12:35
おながいします。
てか毎週この時間に出現しますので今後ともおながいします。
問題うpしてないじゃん
問題マダァー? 
278[無知無能の神] :02/11/13 16:44
問題来らば全精力を注いで解くなり
今すぐうpするのじゃああああ
イパーイツレタ
>>279
俺たちの青春をかえせー
無知無能ってよりムチ不能の神だったりしてな
282デフォルトの名無しさん:02/11/13 18:30
モンテカルロ法を使って、半径1の円の面積を求める
Cプログラムを作らなきゃいけないんですが、だれか教えてください。
ちなみに、モンテカルロ法はわかるのですが、Cで書けません。
お願いします。
283デフォルトの名無しさん:02/11/13 18:55
Cでかけないってことは、モンテカルロ法を理解してないってことだ。
ただ「使ってる」だけ。
出直して来い。
>>282
> モンテカルロ法はわかるのですが、Cで書けません。
ならば、モンテカルロ法の手順を日本語で書いてみろ。
285282:02/11/13 23:06
>>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
>>287
ケコーンを前提にハァハァ
>>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
バイナリデータで保存する時の、 
ファイルオープン時の、パラメータ確認した? 
305303:02/11/18 00:01
データが4つってことね
306デフォルトの名無しさん:02/11/18 00:11
C++について質問させてください。
相互に影響しあうオブジェクトって作れないんですか?

クラスAの中からクラスBを呼び出すためには、クラスBを先に作らなくちゃいけないので
クラスBの中でクラスAは呼び出せない・・・と。

あたりまえ?もしくは勘違い?
>>306
何がしたいの?
相互に影響しあう、とか、クラスAの中からクラスBを呼び出す、
ってどういうこと?
>>306
クラスを呼び出すってどういうことだ?
言ってることは良くわからんが、君のやりたいことはたぶん出来る。
>>306
クラスを先行宣言(前方宣言)しておけばいいんじゃない?
310306:02/11/18 00:33
オブジェクト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;
};
はエラーです。
312306:02/11/18 00:34
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();
}
314306:02/11/18 01:09
>>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
OS書けやボケ。
>>357
dir か ls コマンドをsystem関数で呼び出しファイルにリダイレクトして
そのファイルを読み込んで整形
xとyの値のリストを読み込んで、最乗自乗法でy=ax+bのaとbを
求めるプログラムお願いします。
y1=ax1+b
y2=ax2+b
b=(y1+y2-(x1+x2)a)/2
これも誤差を無視した最小自乗法の一種じゃないか!
と主張してくれ
>>361
いやだ。
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を使用したいのですが
可能なのでしょうか?
可能でしたら使い方はどうすればいいのでしょうか?
365Warez: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から呼び出すのと全く同じ。
367おねがい:02/11/20 13:22
50000までの素数を求めるプログラムをCで組んでもらえませんか?
>>367
誰かコテハンがやってたな。Delふさぎこだったっけ?

素数の定義を知ってるならスピードはともかく動く物は書けると思う。

369367:02/11/20 13:34
うp禿しくキボンヌ
>>369
こっから自分の好きなものを取ってこい

素数 "列挙" アルゴリズムを極めるスレ
http://pc3.2ch.net/test/read.cgi/tech/1018657457/
>>369
死ね。
#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;
}
373367:02/11/20 14:22
死ねって言われて死ぬアホがいるか(プ
>>373
スレ違い出て行け (プ
375デフォルトの名無しさん:02/11/20 14:50
教授に、複素数のクラスを作ってこいと言われますた…
この無知に何か助言を頂きたいですm(_ _)m
std::complex朴れ
377弁士:02/11/20 15:53
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;
}
>>379
マルチポストくらいで怒るな
>>382
よくそんな事が言えるな。
マルチポストが何で敬遠されてるかわかってるか?
>>383
はいはい。
怒ってもいいからいちいち注意するな。
>>384
いや、注意してもらったほうがありがたい。
386380:02/11/20 17:52
>>381
ありがとうございました。
>>377
マルチうぜーよ。
388デフォルトの名無しさん:02/11/20 17:55
>>383
何で敬遠されるんですか?

ぐぐって見たのですが、うまく調べることが出来ませんでした。
教えていただけるとありがたいです。
よろしくお願いします。
>>388
おまいは無能クンか。
「マルチポスト 嫌われる」 で検索すれば、しこたま出てくるわ。

とりあえずめぼしいのはこんなところ。
http://www.ippo.ne.jp/netiquette/common/04question/multipost.htm
http://www.so-net.ne.jp/ClubHouse/room/manner2.html#multi
390389:02/11/20 18:07
追加。
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 インスタンスしか存在しないなら解決不能だが?
396Warez:02/11/20 23:08
有名な問題じゃん.鶏を連れてかえるんだよ.
人が鶏を食べちゃうんだろ。
最初に人のインスタンスを3つ作ればいいのか・
#include <stdio.h>
int main(void) {
puts(
"1. 鷄をボートに載せて向こう岸に行く\n"
"2. 鷄を置いて戻ってくる\n"
"3. 野菜をボートに載せて、ボートの横で犬を泳がせて向こう岸に行く\n"
"終了"
);
return 0;
}
プログラムを教えてください。だから、ニューロサイエンスするのかなー。
>>399
イイ
ニューロなんか使わなくてよろしい。
バックトラックを使って試行させるだけ。
>>399
鶏を飛ばしておく
渡る前に食っちまえ
ただの総当りでいいのか
真面目に考えて損した
「手順を出力するプログラム」であって「手順を求めるプログラム」じゃないんだろ?
じゃあ、>>399と同じようなので、ただし文字列は
"1. 鷄をボートに載せて向こう岸に行く\n"
"2. 鷄を置いて戻ってくる\n"
"3. 野菜をボートに載せて向こう岸に行く\n"
"4. 野菜を置き、鶏を連れて戻ってくる\n"
"5. 犬を載せて向こう岸に行く\n"
"6. 犬と野菜を置いて戻ってくる\n"
"7. 鶏を載せて向こう岸に行く\n"
"終了"
本当はこの問題を解かなくちゃいけなくて、プログラムを使って解こうと思ったんだけど
プログラムの前に答えがでちゃったのでもういいです。
408394:02/11/20 23:38
>>406
手順を求めて出力です。間違えました。
つーかなんでこのスレこんなレベルさがってんの?
レベルは高いと思うが?
2chに来てレベルうんぬんぬかすヤシの精神的レベルの方が心配だ
412394:02/11/20 23:56
>>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>←|
宣教師なんだったら人を食わないように説いてやれや
422Warez: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

自分で解いたほうが楽しい問題ってプログラム面倒くさいなあ。
http://www.vector.co.jp/soft/dl/data/prog/se002453.html
↑これの中の、cannibal.cを読んでみそ。
「宣教師と土人」のプログラムがあるから。

#どうでもいいけどATOK15では「土人」が一発で変換しない。差別用語だからか。
>>424
じゃあ人工知能作るしかないな
こっちでロジック考えてプログラム書いちゃったら
「プログラムが解いた」ということにはならない
C/C++よりLispやPrologのが楽だYO!
429394:02/11/21 00:59
>>426
ありがとう。助かったよ
430テストIME2000:02/11/21 01:09
ド人
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];
435takeru: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)

どなたかお願いします。もうしにそうです。
436takeru: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))));
}
>>440
仕様をよく読めよ。
442デフォルトの名無しさん:02/11/22 20:12
C言語で画像を
(1) 濃度移動
(2) 濃度変換
(3) 輝度分解能(階調数)
(4) 空間解像度変換
するプログラムをキボンヌ
>>442
画像ソフトを買え。
>>443
gimpってオープンソフトだっけ?
だったらそのソースコードを読む。
オープンソフト........( ゚д゚)
オープンソース?
オーブントースター?
scanf関数で半径rを入力してもらい、
そのrを円を描く関数に渡して円を描くプログラムを…おながいします。
ちなみに、C言語です。。
printf("r=%dの〇",r);
450448:02/11/24 02:09
>449
そのneta 100くらい見た.死ね.
451448:02/11/24 02:10
>449
そのneta 100回くらい見た.死ね.
>>448
環境ぐらい書くもんだ。逝ね。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
double r;

scanf("%lf", &r);
//circle(x, y, r); //適当な関数に置換せよ
return EXIT_SUCCESS;
}
454448:02/11/24 02:16
>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
で、いつからここは丸投げスレになったんだ?

正直、あんた向いてない。今いる学校なり会社なりやめて違う道探した方が良いと思う。
>>468
>で、いつからここは丸投げスレになったんだ?
スレできた当初から。
で、〇投げだめな宿題Cスレ
http://pc3.2ch.net/test/read.cgi/tech/1038024989/l50
470デフォルトの名無しさん:02/11/24 12:19
>>468
最初から丸投げスレ。
何も出来ないくせに文句だけ言いたがる厨は、
お外に遊びに言ってなさい。
471C言語暦 3ヶ月:02/11/24 12:20
>>467の(2)を作ってみたよ。
正月を「経過日数1」とした。

今現在は16行制限みたいなんで
4/1000もレスを消費するともったいないので

姉妹スレのソーススレ借りました。

宿題のソースはここにおいてね
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=36
472C言語暦 3ヶ月:02/11/24 12:21
添削きぼんぬ です。
>>472
良ろしいんじゃないですか?分りやすくて。
ツェラーの公式を使えばもっと短くなるだろうけど、
読んだ人は分らなくなるかも。

あ、文字列定数中の()は、エスケープする必要ない弟子。























475C言語暦 3ヶ月:02/11/24 12:43
>>473
)で関数が閉じてしまって 「" がありません」になるかと思ってたよ、Thax.

ツェラーの公式って曜日を算出するものじゃないの?
どうやるのか ソースプリーズ?


























477C言語暦 3ヶ月:02/11/24 12:47
検索したら出てきたよ。
ここが良くまとまっている。
ttp://www.ne.jp/asahi/futohen/sankaku/h102.htm
479デフォルトの名無しさん:02/11/24 13:43
ax^2+bx+c=0
#defineマクロ文を使用し係数を読みこんで、判定し、
実数解がある時はそれぞれのマクロ文をコールし解を求め〜
判別式もマクロ文で作成すること

 朝から何度も適当にやっても解が合いません
判定式と解を出すのを#defineで作っただけでは駄目ですか
仮引数が無いのが駄目ですか
一回講義を休んで分かりませんその時はIF文を習ってました
教科書はTurboC初級プログラミングです




>>479
書いたソース載せろや。
>>480
禿同。
ほんと厨房は実装プログラム載せないよな。
最短距離を探すプログラムを、POINTERを使って
作ってください。
483ねた:02/11/24 13:49
ここに打ち込むのはけっこう大変なんですけど…
なんだか画面狭いし…
気合だ
485479:02/11/24 13:53
#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);

486479:02/11/24 13:53
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) {
で充分。
>>488
アフォですか?
あ、ごめん、ネタだったのね。
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 萌え
>>463
ブレゼンハムのアルゴリズムだね。

>>464
デジタル微分解析による直線描画。
ふむふむ、
fabs(dat) <DBL_EPSILON
が、プレゼンハムのアルゴリズムで、

デジタル微分解析による直線描画で
hostコマンドと似たようなのものが実装できると

プログラム板は勉強になるなぁ。
499デフォルトの名無しさん:02/11/24 18:13
>>498
Kitty-Guy が発生しました
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
>>509
これってNP完全じゃないの?
皆さん、そんな難しい用語使わないで下さい。
大学院にも行ってないので理解できません。
>>510
ちがう。ハミルトン路ならNP完全だが、
オイラー路はO(N)で求まるはず。
513デフォルトの名無しさん:02/11/24 20:15
オイラーはドラマー
514デフォルトの名無しさん:02/11/24 20:25
必ず1ふでがきできるってこと?
>>512
ケーリーだ。ケーリー。
>>514
できるかどうかはデータによる。
できるとしたら、解がどのくらいの計算量で求まるかという話。
517467:02/11/24 23:26
どなたか>>467の(1)の問題わかる方いませんか?
関数が出てきてから理解できなくなってきたんでお願いします。
>>509
再帰関数
>>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--;
}
}
522467:02/11/25 00:30
できました。
どうもありがとうございました〜。
ちっ、遅かったか
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++をつかってじゃんけんのゲームを作ってます。ダイアログベース。グー チョキ パーのボタンをそれぞれ配置して、結果に応じて絵が出るようにしたいでつ。
どう記述すればいいか教えてください。
529528:02/11/25 09:38
で、5回負けたらゲームオーバー、5回買ったら勝利ってことにしたいです。
絵が出るというのは、北斗ののびたみたいにアニメチックにしたいです
53046:02/11/25 09:42
.NET flame workでコンパイルするときどうするんでつか?
>>530 それが宿題なんですね。
>>527
ワラタヨ
[課題](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
得点を入力してそれの
平均点と標準偏差と偏差値得点を出力するプログラムを作成せよ。
負の数値を入力したら実行は終了するものとせよ
>>538
単純すぎてつまらない。
540tekeru:02/11/26 16:46
なんとかまにあったっす。
協力してくれた方々感謝します。
541533:02/11/26 17:17
ご協力ありがとうございました。
また来るかもしれないんでよろしくお願いします。
>>540
だれ?
動画を再生するソフト作ってください
多分スレ違いだから安心していい。
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型ってなってくれればうれしいのだけれども
546教えて厨:02/11/27 12:54
[0,1]区間の乱数を十分多く発生させ
[0,0.1],[0.1,0.2],・・・・[0.9,1]区間にいくつ乱数があるかカウントせよ

次に乱数の初期値を変えて、同じ処理をせよ


-----------------------------------
誰か、やってくれませんか?
547教えて厨:02/11/27 12:54
age
>>545
C 標準では、文字列が何を表すかを判定する方法は無い。
さしあたり strchr() で、小数点を意味するドットがあるかどうかを
探してみろ。
>>545
doubleとintで取ってから、値を比べて同じならintを使ったら?

>>546
[0,0.1)とかじゃなくていいのか?
550546:02/11/27 13:12
>>549
いいです。
>>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未満の範囲。
553546:02/11/27 13:19
サンクスコ
>>552
10.0 は有効桁数が設定してあると考えた場合に = 10 にはならないだろ。
「有効桁数が設定してある」 という話を持ち出すべきでないと言うなら、
「数学的には」 という話も持ち出すべきではない。

まあ、545 が明確なルールを設定していないので無意味な議論だが。
555549:02/11/27 13:32
>>551
545のプログラムがトライ&エラーって感じだったので
10.0はint扱いでいいのかなって思ったんだけど、
あー、そういう仕様の解釈の方がまっとうかもな。
>>554
>「有効桁数が設定してある」 という話を持ち出すべきでないと言うなら、
>「数学的には」 という話も持ち出すべきではない。
なんでやねん…

10 = 10.0 = 10.00 = 10.000
は、有効数字が何桁だろうが、有効数字という概念を仮定しようがしまいが
常に成り立つ。
>10 = 10.0 = 10.00 = 10.000
>は、有効数字が何桁だろうが、有効数字という概念を仮定しようがしまいが
>常に成り立つ。

もうちょっと有効数字について勉強してくれ
>>557
ハァ?
負け惜しみはもういいよアフォ。
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/s/shannon.html
ここの
if (i>3]&=bit0[cell[i].len&7];
の行、コンパイルエラーになるんだけど、誰かおしえてー
実数⊃整数だから、10も10.0も実数だと思えばいいんじゃないの。

つーか、整数って実数の特殊例でしょ。
たとえば有効数字4桁のとき、10.001と10.002は区別できない。
どちらも10.00という同じ物として扱われる。

そう考えると、10.0は10と同一視するしかない。
>整数って実数の特殊例
それは考え方次第

>そう考えると、10.0は10と同一視するしかない。
いくらなんでも論理展開が無茶苦茶
"10.0" と "10" が別のデータである事は厳然とした事実だ。
あと、554 の最後の行をちゃんと読んでくれ。

それと、556 はおそらく有効数字と言う言葉の解釈が間違ってるから、
本当に調べ直した方がいいぞ。
564549:02/11/27 13:59
>>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
国際的エロリスト

エロカイダ 同時多発エロ おっぱいが高層ビルに激突

http://tv2.2ch.net/test/read.cgi/eva/1038360362/l50



>>568
数⊃複素数⊃実数⊃有理数⊃整数
と大学院(数学専攻)で教わりましたが何か?
>>567=>>568=スーパーDQN
573546:02/11/27 14:11
そんなの高校で習うよ
へー、整数は実数じゃないんだ。
整数は複素数なの?
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]区間に幾つ乱数があるかカウントせよ
次に乱数の初期値を変えて同じ処理をせよ。
どういうことが判るか?

わかりましぇーん
救済キヴォンヴ
577568:02/11/27 14:15
別に間違っているなどとは言っておらん
定義しだいだ、と言ってるだけだ
578デフォルトの名無しさん:02/11/27 14:15
ヽ(´ー`)ノ
>>577
みぐるしいからもうやめれ。
実数に含まれない整数って何だよ(ワラ
>>576
ネタだとしたら、2 点。
「作ればあるもーん。定義すればあるもーん。」だろ(w
582579:02/11/27 14:19
>>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)という中学校の表記法を知らなかった奴だから、
無理もないんだが。
591589:02/11/27 14:32
いやそういうわけでもないな。問題なし
有効数字が「桁数で表すものじゃない」と思っていて、
整数は実数じゃないと思っていて、
[0, 0.1)という表記法を知らなくて、
constructiveという言葉を知らないくせに
構成的手法という言葉を使ってごまかそうと試みる
厨房のいるスレはここですか?
>>835
アフォですか?
おいおい有効数字の話はよそでやってくれ。
やるんだったら実装レベルの話しをしてくれ。
入力された文字列から小数点検索して処理すれば
いいだけのはなしだろ。入力データをdouble と
文字列で持たせてやればたいていのことができる。
[0, 0.1)
これどういう意味なんだ?
ポインタ本にも書いてあったけど意味わからん
半開区間だっけな?
閉区間  [0,1] 0 <= n<= 1
半開区間 [0,1) 0 <= n< 1
開区間  (0,1) 0 < n < 1
中学校からやり直せ。
>>594
過ぎた話を蒸し返すのはやめてくれ。
括弧の付け間違いで煽られるのか・・・。

書いたヤツがよっぽど高圧的な物言いをしたのか・・・?
区間の表記って中学でやったのか?
最近の中学が進んでいるのか
昔の中学が進んでいたのか
俺の中学だけが遅れていたのか
どれなんだろう
ちなみに、俺は高校でやった記憶があるのだが
for文の式

for( ;(ima %= 12)!= i; printf("%d時\t",++ima));

というのがあるんですが、「%=」の意味はなんですか?
>>602
余りを代入。
604デフォルトの名無しさん:02/11/29 00:55
ima = ima % 12の略
imaを12で割った余りをimaに代入っていう意味
605デフォルトの名無しさん:02/11/29 01:23
Windows98,VC++6.0で
改行入りのデータをファイルに書き込みたいんだけど
\nの前に\rが入るのを防げませんか?
>>603-604
ありがとうございました
607483-485:02/11/29 01:36
>>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);
}

それでは、よろしくお願いいたします。
610JPS ◆M0LaMzf5rY :02/11/30 00:42
>>609
最大値、最小値処理するのはfor文の中でしょ?
てかどっかの本にまるまる載ってそう・・・
ヒントではなく、答えなのでは、と思いつつも
データ1とデータ2の仕様(data4.txtの中身)が分からないと
答えようがありません
612609:02/11/30 00:45
こういった中身のものが無数に広がっています。

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
613609:02/11/30 00:48
612の数字が(data4.txt)の中身です。
614デフォルトの名無しさん:02/11/30 00:50
>>612
左がデータ1で右がデータ2なの?
はっきり書けよ。
615609:02/11/30 00:55
すみません。
左がデータ1、右がデータ2です。

共に3000個あります。
616JPS ◆M0LaMzf5rY :02/11/30 00:56
あ、どういうこと?
右と左をいっこずつ比べるの?
っていうかforいらなくねー?
617609:02/11/30 00:57
データ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の中身 */
620619:02/11/30 01:05
で、その後に、最大・最小・平均値を求めると…
621JPS ◆M0LaMzf5rY :02/11/30 01:05
#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)
{

↓あとはたのんだ!
622619:02/11/30 01:06
bufは要らなかった…
623JPS ◆M0LaMzf5rY :02/11/30 01:07
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()に漏ってけ。
>>625-627
ケコーン(w
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;
    }
630624:02/11/30 01:23
>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] ;

アフォですか?
637636:02/11/30 01:38
ごめん。

> 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?
639638:02/11/30 01:39
平均値の前処理忘れた。
#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]が素敵♪ */
642640:02/11/30 01:46
クソだなあ・・・。
エラーチェックまるで無いし、ファイル読み終わってもすぐに閉じないし。
ローカルに巨大配列もかなり痛い。

こういう教えられ方されてると、仕事でも平気でこういうコード書いたりしそう。
643640:02/11/30 01:48
>>641
   ||
 ∧||∧
(  ⌒ ヽ トゥ トゥ トゥマシェリ マ シェーリー
 ∪ 。ノ    トゥ トゥ トゥマシェリ マ シェーリー
  ∪∪
644640:02/11/30 01:50
>>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
親も子も一緒に動いているのに
なんでお行儀良く、片方の出力が完了した後、もう片方が出力される
と思えるのかな?
653651:02/11/30 20:39
>>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文字じゃない。
切り替えるタイミングは要するに時間で決まるので、切り替わる場所は不定。
逆に切り替えられない場所が特殊な場所は有る。

詳しく知りたければアセンブラ勉強しなさい。
>>659
アセンブラか?
>>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)
665662:02/12/01 01:45
>664
なるほど!関数マクロで{}が使えるんですね!気が付かなかった…
どうもありがとうございました。
666662:02/12/01 01:48
訂正
×気が付かなかった
○知らなかった
関数はマクロじゃないしマクロは関数じゃない。
>>667
俺もオモタ。
パラメータ付きのマクロを関数マクロという。
この場合パラメータの有無は関係ないけどな。
671デフォルトの名無しさん:02/12/01 02:07
>>669
岩ねーよ(w
普通は関数型マクロというな。
>>671
キティはだまってろ
「関数マクロ」(w
こいつらアフォだ。
関数マクロなんて聞いたことないYO!
いかにもDQNっぽいな。
規格だと、標準ライブラリ
関数が同時にマクロとしても定義してあっても良いことになっている。
たとえば、getcharやgetcはたいてい関数定義とマクロ定義の両方が
ある。

それとごっちゃにしてるんでは?
引数のあるマクロは「引数つきマクロ」だよ。
google
「関数マクロ C言語」 318件
「関数型マクロ C言語」 38件
「引数つきマクロ C言語」 23件
(ププッ
678654:02/12/01 02:24
俺の問題分かる人おらんのかな?
>>678
読む気がしない。
やってることを言葉で説明してみ
>>674-676
だぁーーーーっはっはっはっは!!!
D Q N 決 定 だ な (プー
>>654
まず輝度から調べなおせ。
“任意の閾値(0〜255)を入力するとそれ以上の輝度値”と
言われてるのに、三色の閾値を要求しているのは明らかな勉強不足による無知
(ヒント Y=0.3*R+0.59*G+0.11*B)
つかそれ以前に、

int W[320][240][3]

は、やめてくれよ。
683654:02/12/01 02:52
int W[320][240][3]は問題でつか?
>>683
コンパイラ(環境)によっては通るんだろうけどなぁ。。。
いきなりスタックを200KB強とるプログラムってのはいかがなもんかと。
685超初心者:02/12/01 02:58
ダイアログベースで作成しています。ファイルをコピーするアプリケーションで
コピー元コピー先をボタンをクリックしファイルダイアログボックスを表示させ
、スタティックテキストにファイルまでのパスを表示するというものです。そし
て、もう一つのボタンがありクリックすると、ファイルのコピーを開始するとい
うものです。
但し、以下の場合はメッセージボックスを
表示する。
1.コピー元ファイル名が指定されていない。
2.指定のコピー元ファイルが存在しない。
3.コピー先ファイル名が指定されていない。
4.コピー先ファイルが既に存在する。

4の場合は、問い合わせメッセージの表示とし
ユーザが上書きOKを選択した場合のみ、
コピー実行されるようにする。


という感じです。よろしくお願いします。
何をよろしくお願いするんだ?
687超初心者:02/12/01 03:03
ソースの方よろしくおねがいします。
ルーク!!ソースを使え!!
( ゚д゚)ポカーン
「関数マクロ C言語」 318件
これってほとんど「関数、マクロ」に引っかかってるけど…
ところで「関数マクロ」って英語でなんていうの?
functional macro
>>691
function-like macro
日本語では「関数型マクロ」あるいは「関数形式マクロ」だろうな。

「関数マクロ」は俺も聞いたことない。つーか、なんか変。
694デフォルトの名無しさん:02/12/01 04:25
なんも冠つけないでただ「マクロ」と呼んでるんだが・・・
ひょっとして俺だけか?
>>693
#define N 100
みたいなのは?
>>695
は?
>>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";
トロイ=とろいウィルスの事


本気で信じてた時期があった・・・
ファイル内の日本語を検索するプログラムを教えてください。
対象ファイル、検索文字列はプログラム内に書き、検索文字列の存在確認はあるかないかだけを
表示するものでお願いします。
712711:02/12/01 13:08
C言語でお願いします。
>>1
トリップはc++で。
714714:02/12/01 13:42
Warning: illegal pointer combination (param)
ってエラーが出るんですが何を直せばいいんでしょうか。
C言語のファイルの入出力をやっています。構造体?
というかポインターに問題があるってこと?

Did you free?
716:02/12/01 14:08
あなたは自由でしたか?
あなたはタダでしたか?
>>716
その場合は Were you free?
>>714
間違ったポインタを渡してる。
719714:02/12/01 16:47
ですよね・・。(param)はパラメーター違反ってことは
{}とかがあってないか根本的に間違ってるか。
>>719
たぶん後者。
つーかマルチやめい。
721714:02/12/01 17:10
はーい。
722超初心者:02/12/01 23:58
ダイアログベースで作成しています。ファイルをコピーするアプリケーションで
コピー元コピー先をボタンをクリックしファイルダイアログボックスを表示させ
、スタティックテキストにファイルまでのパスを表示するというものです。そし
て、もう一つのボタンがありクリックすると、ファイルのコピーを開始するとい
うものです。
但し、以下の場合はメッセージボックスを
表示する。
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
>>725
進級できるといいな
行列の普通の掛け算は出来るのですが
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使ってるんだけど。
>>730
そうだわゴメソ。
>>722

ス レ チ ガ イ
>>731
Shit-JIS だから。nkfしる!!
703 のコード自体は文字コードに依存していない。
char k[] の初期値によっては EUC の出力もできる。
736超初心者:02/12/02 22:52
>>733 どうしてスレ違いなんですか?こういう宿題が出てるんですが
わからないんで皆さんのお力を借りようと思っているんです。
次の各プログラムを作成せよ。
ただし、各関数は並記する書式にしたがって呼び出されるものとし、
それに合わせて関数の戻り値および引数を設定することとする。
ただし、配列のデータを引数として与える際には、
関数側ではポインタによる表記と配列による表記のいずれか一方で記述すれば良いこととする。

半径rの円の円周の長さlおよび面積sを算出する関数 circle() を定義し、
半径10.0[cm]の円についてそれぞれの値を求める。ただし、π=3.1415926536とする。
書式:void circle(double r, double *1, double *s)

他にも同じような問題がいくつかあるので
参考にするためにできるだけ簡単な構文で作ってもらえると助かります。
どなたか、お願いします。
>>736
どの言語かもわかりません。
>>737
円周とか円の面積って中学生あたりだっけ?

どこがわかんねーのよ
740超初心者:02/12/02 23:14
>>738 すいませんVC++です。
>>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);
>>748
マジックナンバーをばらまくな。
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
>>757
オメ
>>757
(ノ゚ο゚)ノ おーパチパチ
そいつぁよかった。sage
>>757
市ね
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;
}
何だ!?ソース荒らしか?
7767C:02/12/04 09:36
C++で
ダイアログベースでグーチョキパー3つのボタンを配置してジャンケンするプログラムを作りたい。
おながいします。
7777C:02/12/04 09:37
ちなみに形だけはいっちょまえにつくりますた。
ワケ ワカ ラン
マジなのかネタなのかわからねぇ。
しまいにゃメール欄に「マジです」とかいてネタ
投稿するぞ。
7807C:02/12/04 12:17
まじです
781デフォルトの名無しさん:02/12/04 12:53
DirectX SDKのDebug版とRetail版の違いは何ですか?
782771-774:02/12/04 15:39
>>775
766-769 に回答しただけなんだが・・・。
783デフォルトの名無しさん:02/12/04 16:17
ある文法にしたがったソースを読み込み、そのプログラムを解析する
プログラムを作るというもんだいなんですが。
ようはコンパイラを作る課題の第1歩なんですけど
例えば
A=12;
をよみこんだら
A 変数
= 代入文
12 数値
なんて表示されるものです。
このプログラムは出来たのですが、次の問題に
前問(上の問題)から字句解析機能を関数として作成し前問と同じ
プログラムを作成せよ。ただし変数表の管理にハッシュテーブルライブラリーを
つかうこと。
となっています。
ハッシュテーブルをどこでどうつかうかわからないんですが。。。
分かる方、ご指導おねがいします
784783:02/12/04 17:26
あ、上のはC言語でです。
おねがいします
ただし変数表の管理にハッシュテーブルライブラリーをつかうこと。
て書いてあるじゃない。
変数名(例えば A)をハッシュテーブルに入れていけってことじゃないの?
786783:02/12/04 17:36
その場合ハッシュ値はどんなのがいいんでしょう。。。?
前にやった例だと入れるものが数字だったので
その数値をある数でわってあまりをaとすると
hash[a]のとこにいれてくってかんじだったんですが
この場合は変数はアルファベットですよね。
hash[A]なんてするわけにはいかないし。。。
どうすればいいんでしょう?
文字列のハッシュ関数のサンプルなんて腐る程あると思うが。
つーかハッシュテーブルについてどう習った?
文字も内部データ的には整数。
例えば、
printf( "%d\n", 'A' );
とかしてみたら、A という文字に対応する整数が表示される。
だから文字列の場合、一番簡単な例でいくと、
全ての文字(に対応する整数)を足した数をハッシュ値にすればいい。
789783:02/12/04 17:44
いきなり問題をやらされた感じです。。。
上に書いたような数値の例で。
文字列の例調べてみます
C言語の問題です。
「2次方程式 ax^2+bx+c=0 において,実数 a,b,c を代入し,その解を求めるプログラムを作成せよ」
という問題なのですが,注意点として

計算機の中では実数は倍精度で処理すると有効数字として15桁程度の精度を持つが,
それ以下の桁では誤差が生じる。その場合,2つの実数の差の絶対値を取り,
それが十分小さければ2つの実数は同じ値であると考える。

と書かれていたのですが,虚数解を求めるところでどうすれば誤差が生じないのか分かりません。
アドバイスお願いします。
791783:02/12/04 17:48
>788
あ、なるほど!
もしかして例えば変数Dだったら
hash[D-A]=変数
ってすればいいんですかね!?
>>783
別に A を引く必要はない。そのままの値を使いな。
793783:02/12/04 17:55
あ、正確には
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 になるじゃない?
796783:02/12/04 18:05
う。。。またわからんくなってきた。。。

えーと、この場合ハッシュ関数はどうなるのでしょう?
割る数はハッシュサイズですよね?
てかハッシュサイズはどうなるんだ。
そいや数字もつかえるからA〜Zと1〜9の組み合わせ。。。
割られる数は。。。?

>794
forのループでが何を意味してるかわからないのですが
そこではなにをしてるのでしょう?
あと7743ってなんすか?
>>783
教科書とかにハッシュ法は載ってないのか?
一度じっくり本を読め。
しつもーん!
>>783にあるハッシュテーブルライブラリはどこに行きましたか?
ハッシュ関数とか用意されてないんですか?
ハッシュテーブルライブラリなら文字列をキーとして値を入力できそうですが?

799794:02/12/04 18:26
>>796
 ハッシュキーを作成する関数=ハッシュ関数じゃないのかな。

 7743は適当な定数。短い変数名文字列が、ハッシュテーブルの
前半に集中するのを防ぐために適当に入れただけ。名無しさんとかって
したんだけど、本当は適当に大きな素因数の方が良いのかも。

 forループの中では適当な計算をしている。ハッシュ関数は同じ
入力が与えられたら同じキーを発行したら良いから、適当にキーが
バラけて、かつ速い計算が良い。
 文字列の文字全てをキーに使う為のforループで、中で行っている
計算はxor。andならキーが0に収束するし、orなら1に収束するから
xorが向いている。シフトしているのは文字だけじゃなくてその文字が
文字列のどの場所に出てくるかによってもキーが変わるように。
 シフトしていない部分とのxorも求めているのは、長い文字列で最初の
方の文字がシフトによって消されないため。

 漏れもハッシュの演習を学校でやった事があったけど、実際に数千個の
英単語を入れてキーをグラフにしてみたらちゃんとバラけてた。
800783:02/12/04 18:28
教科書は入門書しかないんで役にたたないす。。。

ネットで調べてみたところ、例えば
Abcって変数ならAとbとcをそれぞれコードにしてくっつけて
それを割った値をキーにすればいいんですよね?

でもその前にこの場合のハッシュサイズはどうなるんでしょう?
> xor

それって何か意味のある動作をするか?
802801:02/12/04 18:30
ごめん、シフトもするのね。
803783:02/12/04 18:35
>799
うぅ。。。なんかむずすぎて全然わからん。。。
800みたいなやりかたじゃだめすかね?
ABCの文字コードが65、66、67なら
656667と言う数字をハッシュサイズで割り、そのあまりを
添字にもつ配列にいれる。

ハッシュサイズがわからんと思ったけど調べてると
別に割る数はハッシュサイズでなく適当でいいと書いてるとこも
ありましたがそれでいいのかなぁ?
804783:02/12/04 18:40
あらかじめハッシュサイズを手動で(100とか)きめといて
(65+66+67)/100をハッシュ値にするのが簡単そうですが
これじゃだめすかね。。。?
いいから 783 は 798 の質問に答えてくれよ
>>804
(65+66+67)%100 ね。
別にそれでいいんじゃないかなぁ?
そんなに高度なのは求められてないんでしょ。
807783:02/12/04 18:53
>805
あ、ハッシュテーブルライブラリーは別の問題でつくったんですよ。
でもそのままではつかえないのでそれを参考に考えるんだと
思います。
ちょっと問題はしょって書いたし書方わるかったかな。。。
(´-`).。oO(流用できないようなものをライブラリーと呼ぶのか。。。)
809デフォルトの名無しさん:02/12/04 19:03
(´Д⊂ヽ仕様がない
>>806
それは最後の文字しか意味を持たないじゃん。
>>810
んなこたーない
ハッシュ関数の意味判ってんねぇんだな。
あれでいいと思うんなら下手な計算せずに先頭一文字だけそのまま使っとけば?
813810:02/12/04 19:17
>>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;
>>815
文字じゃなくて文字列ですよ。
817デフォルトの名無しさん:02/12/04 20:49
文字列を直したいんです。
ABCとかいう文字列をなんか一発で。。。
そういうのが無ければ普通に書けばいいんですが
一発で変換みたいなのがあればらくだなと
818デフォルトの名無しさん:02/12/04 20:49
文字列を?
ABCが数値としていくつになればいいの?
>>817
書けるんだったら書いてみてくれ。
123
822デフォルトの名無しさん:02/12/04 20:53
>>819
2748です。
つーかchar[]そのものが多倍長整数なんだが。
824つまり:02/12/04 20:55
”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);
}
みたいな感じでやりました。
さて本物のレスがないのは釣りだったのだろうか?
831814:02/12/04 21:19
結局普通に自分で書きました(^^;
アルファベットを文字コードにして足して行っただけですが。
ちなみに僕は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」を参考にしてマルチタスクを実装する。
836833:02/12/04 22:14
レス感謝です。
>>834
その手法を考えて実装してみます。
どこか参考になるHPなどないかなぁ。
(TurboというかBorlandのヘルプはすでに読みましたけど・・・)

>>835
それ持ってます。途中まで読んで休止状態です(w
837790:02/12/04 22:52
>>835
俺へのレスですよね?
>>486以降を読んでも誤差を考慮した虚数解については書かれて無いんですけど・・・
>835は>833だと思われ。
>837はネタだと思われ
840790:02/12/04 23:18
>>838
あ,そうでしたか。同じ2次方程式の問題だったから勘違いしてしまいますた。
ネタじゃないです。マジで誰かお願いします。
>>840
よーわからんが、この辺はどうだ?
http://cl.rc.kyushu-u.ac.jp/Literacy/PP/H14/adp/program/equation.html
842790:02/12/04 23:25
>>841
ん〜。ここで>>829に書いてある実数解のを見つけたんですけど,虚数解のはなかったんですよね。
>>842
大体虚数をどう表す気だ。 doubleは実数しか表せないんだぞ?
それさえ判れば自明じゃないのか?
844790:02/12/05 00:08
>>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);
}
のように修正すると書かれてたので,虚数解の場合も修正しないとまずいのでは?
と思ったのですが違うのでしょうか?
845790:02/12/05 00:11
>>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;
}
>>846
Cの問題なので却下。
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;
}

上のプログラムは,某本の二つ以上の空白を一つの空白に置き換えながら,入力を出力しなさいという問題の答えです。
このプログラムの改善点などありますでしょうか?
ワラタ
854JPS ◆M0LaMzf5rY :02/12/06 00:40
>>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に' 'を入れる必要性は?
858JPS ◆M0LaMzf5rY :02/12/06 00:53
>>857
入れてるんでなくて、比較してんの
>last_char_was_space
長ぇよ!w
>>858
いや・・じらさないで早く挿入れて!
>>846
これなに?
>>858
chがスペースなら1,でないなら0っすか
で,if文で調べると
こんな高等な技術があったとは

>>859
あほな僕でもわかるようにと,考えてくださったのでしょう
863JPS ◆M0LaMzf5rY :02/12/06 01:06
>>862
がんがれ。オレも初めてこの使い方をみた時は正直あせったよ。
864西門 ◆J1DLkSnXwI :02/12/06 01:11
呼んだ?
#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
>>865
キタ
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
>>874
あ・・・
ほんとだ
スマソ
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スレで釣りだって喚いてた人かな…
>>487
遅レスに便乗質問なんですけど,

>>else if (DD==0.0){
>浮動小数点でこういうことしない。

とあるのですが,この場合はどう処理するのが正しいのでしょうか?

http://www.google.co.jp/search?q=cache:http://www.cpnet.co.jp/gfan/techdoc/Geometry/numerr.htmに
2つの浮動小数点数を、「==」で比較してはならない。「等しい」と判定されなければならない場面で、誤差により、
等しくならないことはしばしばである。この場合、2つの浮動小数点数の差を取り、
その絶対値が、誤差限界より小さい時には、等しいものと判定するようにする。

とあったのですが,どう書いたらよいのか分かりません。お願いします。
if (fabs(DD) <= EPSILON)
890888:02/12/07 16:07
>>889
EPSILONって「十分小さい値」って意味ですかね?
入門用の本にはのって無いんですが。
891888:02/12/07 16:14
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って見た感じ、絶対値返すっぽいし。
探すか,創る。つか、それぐらい作れ
894888:02/12/07 16:34
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_why_floating_point_numbers_may_lose_precision.asp
に書いてあるように,

#define EPSILON 0.0001

を追加し,if (fabs(DD)→if (fabs(D)にしたらできました。

実際問題,判別式として分ける場合,EPSILONはどの程度の値として定義すればいいのでしょうか?
0.0001よりもだいぶ小さい値になってるのもあるようなのですが…。
>>894
> #define EPSILON 0.0001

そんな事するなするな。
<float.h> の DBL_EPSILON や FLT_EPSILON を使え。
> DBL_EPSILON や FLT_EPSILON

まあ、もともとこんな定数用意してるぐらいだったら、標準で判定関数かマクロか
用意してくれてもいいじゃんとは思うけどナー。
897888:02/12/07 18:36
#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()のほうが速いかもしれん。
903option:02/12/07 22:59
要素数が n である配列 a から key と一致する全要素の添え字を、配列 idx の先頭から
順に格納し、一致した要素数を返す以下の関数を作成せよ。

int seachidx(int a[], int n, int key, int idx[]);

誰か完成させてくださいませんか?
904 ◆F52DmOxJlc :02/12/07 23:10
>>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;
}
>>903
丸なげ?
906デフォルトの名無しさん:02/12/07 23:35
0から1の実数をパラメータとして白黒階調画像を表示するPGを作りたい
んですけどアドバイスもらえませんか?
907option:02/12/07 23:41
>◆F52DmOxJlcさん
ありがとうございました。
今コンパイル出来ませんが(都合により)後日コンパイルしてみます。
本当に助かりました。
908 ◆F52DmOxJlc :02/12/07 23:43
>>907
インデントに全角スペース使ってるからコピペはするなよ。

>>906
画像関係は経験ないのでわからない。すまん。
>>906
256倍して表示汁。
>>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;
}
911西門 ◆J1DLkSnXwI :02/12/08 00:22
>>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倍の方がいいかも。
913910:02/12/08 00:25
しまった!添え字を入れるのか・・・
914906:02/12/08 00:46
たくさんの方ありがとうございます。
912さんの言われると通り0以上1以下の値を持った
2次元配列の値をパラメータとしてそのパラメータを
突っ込めば白黒階調画像が表示できるようなPGという意味でした。
説明不足ですみません。
915906:02/12/08 01:08
255倍というナイスアイディアありがとうございました。
ぐぐりました所いい感じのソースが見つかりました。
またなにかありましたらよろしくお願いします。

>>905
ここは、そういうスレじゃないのか?
>>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);
}
924 ◆F52DmOxJlc :02/12/08 13:33
ヒントが出てるんならそれに沿って回答した方が先生も喜ぶかな。

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 ++;
   }
925 ◆F52DmOxJlc :02/12/08 13:35
  } 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() を改造すればできるよね。
926920:02/12/08 14:36
おぉ!!こんなにソースが!!
有難いです。ここにいる方々には感謝してもしきれません。
本当にありがとうございました。
>◆F52DmOxJlc さん
あなたの事は神と呼ばせて下さい!!
神(^^)/ありがとう!!
927 ◆F52DmOxJlc :02/12/08 14:42
>>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
931929:02/12/08 14:50
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;}
}
933920:02/12/08 15:17
修正ありが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;
    }
>>929
それでいい。
>>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");
}
}
938937:02/12/08 16:35


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);
}
>>937
malloc/freeって知ってる?
940937:02/12/08 17:15
>>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;
    }
  }
}
942937:02/12/08 17:44
>>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)に含まれるデータの個数を
配列を用いてカウントするプログラムを作成せよ。
ただし、個数のカウントに条件分岐をしようしてはいけない。

データ型の変換について習ったんでそれを使うんでしょうが、
条件分岐を使わないでどう組むのか全く分かりません。
助言お願いします。
>>943
「MAKEファイル」でぐぐっただけだがこんなんはどうよ。
http://www-clim.kugi.kyoto-u.ac.jp/yasunaga/make.html
>>944
19の47乗は61桁ほどになり、通常の処理系ではintでもdoubleでも正確に
表せないからどちらにしろ答えは無意味。
>>944
19の47乗は10進で61桁の数になる。
浮動小数点数の有効桁数は17桁くらいだから、
正確な計算は全く期待できない。
>>945
その3つの区間の数値は、小数点以下を切り捨てるとそれぞれ
0, 1, 2になる。これを配列の添え字に使う。
>>944
> 実際に合同式を用いて手作業で計算すると、
最初からそっちでプログラムしろ。
951937:02/12/08 19:16
>>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
ビット演算がよく分かりません。
それはどういうアルゴリズムで、
どのぐらいの大きさまで計算できるんですか?
>>947
(゚Д゚)ハァ?
956デフォルトの名無しさん:02/12/09 04:34
>>954
処理系に依存するっスよ
>>955
その(゚Д゚)ハァ?の意味がわからない。どこかおかしいか?
958デフォルトの名無しさん:02/12/09 04:50
>>955
新しいため息のつきかた・・・
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の例プログラムを単語リストがアルファベット順になるように
機能拡張してください。よろしくお願いします。
961943:02/12/09 05:51
>>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 が大きい場合はかけ算も同じように二進展開して計算するといい。
967943:02/12/09 19:00
>>963
もう少し探してみます。どうもです。
968デフォルトの名無しさん:02/12/11 19:02
最後の伸びが悪いな。
宿題こいやこいや〜。
Amazon で注文したあずまんが大王が先ほど届いたので、これから読もうと思います。
応援してください。
引き篭もりは篭れ!
>>969
やめとけ、今の君には刺激が強すぎる。
鼻血出ますた
973デフォルトの名無しさん:02/12/11 22:16
入力されたタブを,次のタブストップまでのスペースをうめる適当な数の空白で置き換える
プログラムを書け。
タブストップの位置は,例えばn文字ごとというように固定して考えよ。

という問題なんですが,文章の意味をもう少し判りやすく説明してください。
「タブストップ」の意味はわかっているのか?
975デフォルトの名無しさん:02/12/11 22:27
>>973
出題者にきけよ
日本語を噛み砕けというのは C/C++ の話じゃないと思うが・・・。

例えば 「タブ幅=4」 と設定された時に、

"a[\t]bc[\t]def[\t]ghij[\t]klmno[\t]pqrstu という文字列を、
"a   bc  def ghij    klmno   pqrstu" に展開しろという事だろ。
977 :02/12/11 22:34
>>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++している場所が悪 よく考えて
996bloom: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しろ! デルファイ!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。