1 :
C++房 ◆vKuy6bx7T2 :
02/12/13 18:43
■■■ 最近多い質問とその答え ■■■
Q. javac コマンドを実行したときに、
『コマンドまたはファイル名が違います』や
『'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。』
と表示されてコンパイルできません。
A. javac.exeへのPATHが通っていません。
http://java.sun.com/j2se/1.4.1/ja/install-windows.html を良く読んで、javac.exe のあるディレクトリ(例: C:\j2sdk1.4.1_01\bin )のパスを
環境変数PATHに追加してください。
その後、
Windows98/MEの場合はOSを再起動、
Windows2000/XPの場合はコマンドプロンプトを新たに立ち上げなおしてください。
設定したパスが正しければ、javacが使えるようになります。
それでも同じエラーが出る場合は、設定した値が間違っています。よく見直してください。
Q. javac Hello.java でコンパイルはできるのですが、
java Hello を実行しようとすると
『Exception in thread "main" java.lang.NoClassDefFoundError: Hello』
と表示されて実行できません。
A. カレントディレクトリ(.)がクラスパス(classpath)に含まれていません。
コマンドプロンプトで、
set CLASSPATH=%CLASSPATH%;.
と設定する。最後の「;」と「.」を見落とさないように!
または、
http://www.gimlay.org/~javafaq/S004.html#S004-02 を読んでカレントディレクトリ「.」を環境変数CLASSPATHに追加してください。
JavaFAQ 基礎知識
http://www.gimlay.org/~javafaq/S004.html
乙 でも何だか 2 の雰囲気が違う
[質問]まず,ファイルにデータの個数nと,その個数分のデータ(整数データ)を保存する.プログラムinsert.cは,まずファイルからnを読み込み,その数だけデータを読み込み,挿入ソートを実行する.そして最後にソート結果を表示する. というプログラムを作ってみたんですが、エラーが出てしまいます(^^;)↓のどこをどうなおせばいいでしょうか?
BOOL UdprocDdeConnect(CString cappname, CString ctopicname){ HSZ hszApp, hszTopic; HCONV hConv; int ret; //コールバックハンドラ定義 if ((ret=DdeInitialize(&idInst, (PFNCALLBACK)UdprocDdeCallback, APPCMD_CLIENTONLY, 0L)) != DMLERR_NO_ERROR){ AfxMessageBox("Failed to DdeInitialize (%d)", ret); return true; } hszApp = DdeCreateStringHandle(idInst, cappname, 0); // DDE Application Name hszTopic = DdeCreateStringHandle(idInst, ctopicname, 0); // DDE Topic Name // DDE接続
#include <stdio.h>#include <stdlib.h>#define N 100 void insertionsort(int *A, int n); void insertionsort(int *A, int n)/*配列A[0],…,A[n-1]を挿入ソートにより整列*/ {int i, k, a; for(i = 1; i < n; i++) { a = A[i];k = i; while(a<A[k-1] && k-1>=0) {A[k] = A[k-1]; k = k-1;} A[k] = a;} } int main(int argc, char* argv[]) {int j,n;int A[100]; FILE *file; file=fopen("data", "r"); fscanf(file,"%d",&n); if(n > N){ printf("Illegal array size n = %d",n);exit(1); } printf("n = %d\n a = ",n); for(j=0; j<n; j++) fscanf(file,"%d",&A[j]); for(j=0; j<n; j++)printf("%d",A[j]); printf("\n");fclose(file); insertionsort(*A,j); printf("%d",A[j]);}
下から二行目 insertionsort(*A,j) は insertionsort(A, j) でないかな? これ↓だとちゃんと動くのだけど。 #include <stdio.h> int hoge (int * a) { printf("%d\n", a[2]); return 0; } int main(int argc, char * argv[]) { int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; hoge(a); return (0); }
>>5 こんな感じ
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define swap_int(a, b) { int tmp = a; a = b; b = tmp; }
#define ITEM_NUM 10
void PrintArray(int A[], size_t size) {
size_t i;
for(i = 0; i < size; i++)
printf("%d ", A[i]);
putchar('\n');
}
void InsertionSort(int A[], size_t size) {
size_t max, i;
while(size--) {
for(max = 0, i = 1; i <= size; i++)
if(A[i] > A[max])
max = i;
swap_int(A[max], A[size]);
}
}
int main(int argc, char* argv[]) {
int A[ITEM_NUM];
size_t i;
srand(clock());
for(i = 0; i < ITEM_NUM; i++) A[i] = rand();
PrintArray(A, ITEM_NUM);
InsertionSort(A, ITEM_NUM);
PrintArray(A, ITEM_NUM);
return 0;
}
指摘されたことで、無事できました。 有難うございました。
なぁ。スレタイでC/C++と謳っておきながら
>>2 でJavaのFAQなのはどういうネタ?
全然面白くないのでなんか別の意味があるのかと思ったんだけどよく分からん。
1 と 2 は別の人だと思う
>>7 >>8 レスありがとうございますm(_ _)m
>>7 できればファイルからの入力をしたいのですが(^^;
どこが違うのかわからなくて(汗)
>>8 sizeというのは?
初心者なもので何もわからなくてすみませんm(_ _)m
> size というのは? 変数名。
> size というのは? サイズや数量を表すためのデータ型。 大抵は unsigned または unsigned long の別名。 つーか、コンパイラのヘルプとかマニュアルとかリファレンスとか、参照できないの?
この前 友達から聞かれた問題なのですが 自分は 情報系ではなく C言語をかじった程度なので分かりません 問題は 以下のような概要?をプログラム言語で書くというものなのですが、 これがC言語でできるのかも自分には わかりません。 どなたか 前文 書いてください。 c←0.5+0.1i for j ←1 to 100 for k ←1 to 100 compute z0 z←z0 for n ←1 to 10 z ←z^3 + c if |real(z)|or|imag(z)|or|z|>10 then jump out of loop if |real(z)|or|imag(z)|<10 then plot(j,k)black else plot(j,k)white どのようなことをしているのかは 分かるんですけど どう書いていいのか 自分には さっぱりです ちなみに z ←z^3 + c というのは Zn+1=Zn^3+c ということです
>>13 み
よけいな例を書かなきゃよかったかな。
>>6 の下から二行目の "insertionsort(*A,j)" がおかしいかと。
"*A" でなく "A" つまり "insertionsort(A,j)" と直せばいいんじゃないかな。
他の部分は合ってると思う。
ついでに最後の "printf("%d",A[j])" は不要と思われ。
>>13 #include <stdio.h>
#include <stdlib.h>
#define swap_int(a, b) { int tmp = a; a = b; b = tmp; }
int *GetFromFile(const char *filename, size_t *size) {
int error_occurred = 1;
int *A = NULL;
FILE *iFP = fopen(filename, "r");
if(!iFP)
perror(filename);
else if(fscanf(iFP, "%d\n", size) < 1 || !size)
perror("cannot read data count");
else if((A = (int *)malloc(*size * sizeof(int))) == NULL)
perror("too few memory");
else {
size_t i;
for(i = 0; i < *size; i++) {
if(fscanf(iFP, "%d\n", &A[i]) < 1) {
perror("cannot read data number");
goto exit_function;
}
}
error_occurred = 0;
}
exit_function:
if(error_occurred)
free(A), A = NULL;
iFP && fclose(iFP);
return A;
}
void PrintArray(int A[], size_t size) { size_t i; for(i = 0; i < size; i++) printf("%d ", A[i]); putchar('\n'); } void InsertionSort(int A[], size_t size) { size_t max, i; while(size--) { for(max = 0, i = 1; i <= size; i++) if(A[i] > A[max]) max = i; swap_int(A[max], A[size]); } } int main(int argc, char* argv[]) { size_t data_num; int *A = GetFromFile("data", &data_num); if(!A) return -1; PrintArray(A, data_num); InsertionSort(A, data_num); PrintArray(A, data_num); free(A); return 0; }
コピペに反応してはいけません
C言語での質問です。 文字列を画面に"aaa\n", "aab\n", "aac\n", ... , "aaz\n", "aba\n", "abb\n", "abc\n",という具合に次々に表示させて 最後に"zzz\n"を表示させたいのですがどうすれば良いでしょうか? できれば今は3桁ですが、これが4桁とか5桁とかになって桁が増えても 簡単に対応できるように汎用性を持たせたいのですが・・・。
>>16 C++Builder
#include <complex>
#include <cmath>
#include <vcl>
main() {
Graphics::TBitmap *bmp = new Graphics::TBitmap ;
bmp->Height = 100 ; bmp->Width = 100 ;
bmp->PixelFormat = pf1bit ;
std::complex<double> c(0.5,0.1) ;
for(int i=0;i<100;i++) for(int j=0;j<100;j++) {
std::complex<double> z((double)i/50,(double)j/50) ;
for(int n=0;n<10;n++) {
z = z*z*z + c ;
if(std::fabs(z.real())>10.0||std::fabs(z.imag())>10.0||abs(z)>10.0) break ;
}
if(std::fabs(z.real())<10.0||std::fabs(z.imag())<10.0)
bmp->Canvas->Pixels[i][j] = clBlack ;
else
bmp->Canvas->Pixels[i][j] = clWhite ;
}
bmp->SaveToFile("julia.bmp") ;
delete bmp ;
}
言葉が足りませんでした。 2次元配列に文字列"aaa", "aab"...を次々と格納させてから 表示させたいのですが、どうすればよいでしょうか?
>>22 こんなんでいかが?
COLS いぢれば桁数が変わりまつ。
#include <stdio.h>
#include <string.h>
#define COLS 2
int main(void)
{
int i;
char buf[COLS + 1];
memset(buf, 'a', COLS);
buf[COLS] = '\0';
for(; ; )
{
i = COLS - 1;
while(++buf[i] > 'z')
{
buf[i] -= ('z' - 'a');
if(--i < 0)
goto exit_loop;
}
puts(buf);
}
exit_loop:
return 0;
}
あ・・・仕様変更でつか・・・。 > 2次元配列に文字列"aaa", "aab"...を次々と格納させてから 桁数によってはとんでもない大きさにならないか? 3 桁でも 26 * 26 * 26 * sizeof(char) = 17576 bytes それでもいいなら書いてみるけど。
>>25 見事です。頭が下がります。
どうもありがとうございました。
>>26 いえ、私もそう思ったので、後は自力で何とかします。
ありがとうございました。
すまん、ここ > buf[i] -= ('z' - 'a'); こうだわ。 buf[i] -= ('z' - 'a' + 1);
つーか書いてもーたけども。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define COLS 2 #define UNIT (COLS + 1) #define MIN_VALUE 'a' #define MAX_VALUE 'z' #define ACCUR (MAX_VALUE - MIN_VALUE + 1) int main(void) { const size_t item_num = (size_t)pow(ACCUR, COLS); size_t pos = 0; int i; char buf[UNIT], (*array)[UNIT] = malloc(item_num * sizeof(char (*)[UNIT])); if(!array) { perror("メモリが足りません"); return -1; memset(buf, 'a', COLS); buf[COLS] = '\0'; for(pos = 0; pos < item_num; pos++) { memcpy(array[pos], buf, UNIT); i = COLS - 1; while(++buf[i] > 'z') { buf[i] -= ACCUR; if(--i < 0) break; } } for(pos = 0; pos < item_num; pos++) puts(array[pos]); free(array); getchar(); return 0; }
あ。 > while(++buf[i] > 'z') { こうだわ。 while(++buf[i] > MAX_VALUE) {
何かバグっとる気がする
課題(C言語) キーボードより入力した整数型データの桁を反転して表示するプログラムを作成せよ。 例)123 → 321 12300 → 321 0 → 0 と表示せよ。 ※ポインタを使用すること
> 12300 → 321 (゚Д゚)ハァ?
#include <stdio.h> void reverse_int(int *i) { int retvalue = *i; *i = 0; while(retvalue) { *i = (*i * 10) + (retvalue % 10); retvalue /= 10; } } int main(void) { int a = 123; int b = 12300; int c = 0; printf("%d, %d, %d\n", a, b, c); reverse_int(&a); reverse_int(&b); reverse_int(&c); printf("%d, %d, %d\n", a, b, c); return 0; } ポインタはちゃんと使いますた
38 :
デフォルトの名無しさん :02/12/14 01:44
>>35 課題で言ってるのはint型の数値を反転表示でなくて
多分こういうことでない?
整数型とは言ってるけどさこういう類の課題は
こっちのことのような気がする
#include <stdio.h>
int main(void)
{
int i, j;
char num[100];
char *pNum;
pNum = num;
/* 数字入力 */
scanf("%s", num);
/* 先頭の0をのぞく(10の位まで) */
for(i=strlen(num)-1; i>0; i--)
if( *(pNum+i) != '0' ) break;
/* 反転表示 */
for(j=i; j>=0; j--)
printf("%c", *(pNum+j));
return 0;
}
「釣れました。」は要らないからね。
「整数型」 という問題文より 「こういう類の課題」 という分類が優先される 理由を知りたい
つーか課題とはいえエラーチェックぐらいちゃんとしる。 普段からそういうクセを付けておかないと、そうやってサボるようになる。 で、ハマる。周りの人が。
エラーチェックのテクニックはまだ習っておりません。
44 :
デフォルトの名無しさん :02/12/14 01:59
>>40 学校で出された問題だから
ただCの基本的な使い方を学ぶのが目的で
C言語とあまり関係のないところで
少し頭をひねるような
課題は出ないと思ったから
するべき事は、センセイがそうと思い込んだ回答をする事ではなく、最適解に極力 近づける努力をする事だ。 つーか、手段と目的の区別がついていないような問題を出すセンセイは逝ってよし。
変に育てられた香具師が現場に入ってくると、どう扱っていいかわかんなくなるよナー。
>>44 >>45 の言う通りセソセイによって異なるだろう。
うちのセソセイは無茶苦茶厳しく、講義で行ったことは最低限であり、
プログラムを書くならちゃんと自分で下調べをしないで行うようなことはありえないと、
初回のレポートでクラスの大半の連中に赤点を与えていた。
:一応そのときの課題と、ぺけの理由:
バブルソート、挿入ソート、マージソート、クイックソートを実装し、
それぞれの実行時間を調べよ。
ぺけの理由は、マルチユーザOS上での時間計測を、時計などで図ったため。
最低でもrusageなどを使わなければならない。
もちろん、そんなことは習っていないし、第一C言語の3回目の講義。
マルチユーザOS? rusage? C言語と関係ないじゃん
>>47 その条件で生き残ったヤシは、相当のヒネクレものデシか?
>>49 きっと要領の良い奴=先輩のを写した奴=なんも考えてない奴だろう。
普通に考えて出来ることじゃない。たとえ出来る力があったとしても。
51 :
デフォルトの名無しさん :02/12/14 03:46
ポインタとゆうものがいまいちよくわかっていないのですが、 これではなぜいけないのか、詳しく説明してもらえませんか? void swap(int x, int y) {int tmp; tmp = x; x = y; y = tmp; } void main() {int a=3, b=5; printf("a=%d, b=%d\n", a, b); swap(a,b); printf("a=%d, b=%d\n", a, b); } 実行結果 a=3, b=5 a=3, b=5
>>51 まずmainの戻り値はintにしろ。
あと{の横で宣言するのはキモイ。
それとポインタが分からなくてもポインタの記号ぐらい使え。
以上。
> これではなぜいけないのか いいわけないだろ。なんも考えてないのがバレバレ。ポインタどころか 自分が何をしたいのかさえ分かっていない。問題丸投げしているだけだろ。
>>52 ワラタ
>>51 変更されたxとyはswap()のローカル変数であり
main()のaとbではないから
>>51 何がいけないのかが、分かりません
そのプログラムを実行した結果は、それで正しいです
もし、違う結果を出したいのなら
望みの結果が何だったのか詳しく説明してもらえませんか?
>>56 わかってると思いますが、
aとbの数字を入れ替えて表示させたかったのですが・・・
59 :
デフォルトの名無しさん :02/12/14 04:22
>>51 何でmain()の局所変数であるaとbを
それを直接参照出来ないswap()で変更出来ると思ったんだ?
もう一度参考書読み直したほうがいい。 塩と小麦粉知らないヤツにスパゲッティの作り方を教えるのは無理ぽ。
>>51 ∧_∧
( ;´∀`) ちんこ立ってきた
人 Y /
( ヽ し
(_)_)
>>61 パスタならコンビニで買ってきて電子レンヂでチンぽ。
66 :
デフォルトの名無しさん :02/12/14 09:31
#include <stdio.h> main() { printf("うんこはうまいです。\n");/*\nがいるのかが気になります。*/ return 0; } こんな感じで初歩中の初歩なんですが、 標準関数のプリントエフなんですけど、文字を一列しか表示しない時でも 復改の「\n」は入れるべきなんでしょうか? よろすくおながいします。
>>66 試しに省いてみ?
そんな簡単なことも試せないんじゃ初歩の初歩から君の才能のなさが伺えるよ。
68 :
デフォルトの名無しさん :02/12/14 11:33
おまえlobbiestか?
70 :
デフォルトの名無しさん :02/12/14 12:02
>>66 好みの問題です。その日の気分で使い分けましょう。
もちろん"\n"を省けは2byte節約できるので極力使わない方が良いです。
>>70 はいはい、特定の環境依存厨は黙ってる(藁
>>73 >わからない宿題若しくは処理があったら私にやらせてくださいm(_ _)m
今までどこいってたんだよ。ちゃんとやれよ
ノ(´∀`)てへへ
Σ(´Д`;)
ん
( ̄ー ̄)
(´Д`;)とりぷ変えます…
>>79 トリップ変更はいいから、依頼された課題、早くやれって。
(゚Д゚#)っせーよハゲオタ。ふぁっくゆー!!
>>80
第二引数に与えられた数値を、第一引数に与えられたオプションにしたがって 変換するというのが作りたかったんですが上手くいきません。 どこがまずいですか? それとも根本的に間違ってますか? #include <stdio.h> int main(char *argv[]) { double a; if (*argv[1] = '-k') a = *argv[2] / 1.61; else if (*argv[1] = '-m') a = *argv[2] / 0.91; else if (*argv[1] = '-c') a = *argv[2] / 2.54; printf("%f", a); return 0; }
>>82 int main(char *argv[]) //とりあえずここ
84 :
デフォルトの名無しさん :02/12/14 22:23
明日までのレポートなのですが、まったくわかりません。。。どんな関数を使えばいいのでしょうか? 勝手ながら明日までなので時間もないんです・・・。すみませんが解いてもらえませんでしょうか。 お願いします。。 ∫(0→2)√xdxを解きなさい。
>>84 関数じゃないよん。積分とはどういうことかがわかってればかなりの近似値が出せる。
>>84 double sum = 0.0;
for(i = 0; i < 2;i++)
sum += sqr(i);
printf("答えは%fです",sum);
87 :
デフォルトの名無しさん :02/12/14 22:38
>85、86 即レスありがとうございます。ほんとたすかります! >85 じつはその説明の時に公欠で授業に出ていなかったためわかりませんでした・・・ >86 プログラムさんきぅです! これは { } の中にいれればokですか?
Δxが凶悪な広さな訳だが。
printf("1.885618083164127\n");
90 :
デフォルトの名無しさん :02/12/14 22:50
>88 ちょっとでもいいんで詳しく説明してもらえませんか? >89 それって86さんのprintfの中見ですか??
>>83 レスどうもです。
どう間違ってるんでしょうか?
95 :
デフォルトの名無しさん :02/12/14 22:55
>92 レスありがとうございます!89さんの1.8856・・ってのはどこから出てきたものですか?
>>94 そりゃ分かってますがな。ちょこっと補足しただけで。。
>>91 教科書読みな。
っていうかさっさと公式使江波良かろう。
>>95 それを知らないと課題はできないのかい?
とりあえずプログラム作ってソース貼ってごらん。
99 :
デフォルトの名無しさん :02/12/14 23:19
#include<stdio.h> #include<math.h> double sqr(double); void main(void); void main(void) { double sum; long i ; sum = 0.0; for(i = 0; i < 2;i++) sum += sqr(i); printf("答えは%fです",sum); } エラー2でした。。。
100 :
デフォルトの名無しさん :02/12/14 23:27
101 :
デフォルトの名無しさん :02/12/14 23:31
>99 レスありがとうございます! 答えが1.000000になりますが・・・
102 :
デフォルトの名無しさん :02/12/14 23:34
for文の条件がおかしいんでないかい?
>>92 違うよ、
1
Σ√x
x=0
だよ。
>>101 > 答えが1.000000になりますが・・・
当然そうなるわな。上記参照。
105 :
デフォルトの名無しさん :02/12/14 23:37
106 :
デフォルトの名無しさん :02/12/14 23:37
#include<stdio.h> #include<math.h> double sqrt(double); void main(void); void main(void) { double sum; long i ; sum = 0.0; for(i = 0; i < 3;i++) sum += sqrt(i); printf("答えは%fです",sum); } ですか?
>>106 だいたい2.41421356ってとこか。
>>106 っていうかまず⊿xが1なのをやめれ。後の話はそれからだ。
109 :
デフォルトの名無しさん :02/12/14 23:49
>>106 for(i=0; i<=2; i++)
にしろ
積分の意味考えればそれだけ与えられれば
すぐわかるだろCで積分するのに
数学で積分習ってないなんてことはないよな
>>109 俺はあのカクカクの図の意味がわかったのは習ってから2年後だったが。
>>84 台形公式
#include <iostream>
#include <cmath>
const double epsilon=1e-6;
const n_max=1000000;
template<class Function>class NIntegrateC{
Function func;
public:
NIntegrateC(Function f):func(f){}
double operator()(double x1, double x2){
double ret=(func(x1)+func(x2))*(x2-x1)/2,prev;
int n=1;
do{
n*=2;prev=ret;ret=0;
for(int i=1;i<n;i+=2)ret+=func(x1+(x2-x1)*i/n);
ret=prev/2+ret*(x2-x1)/n;
}while(std::fabs(ret-prev)>(epsilon)&&n<=n_max);
return ret;
}
};
template<class Function>
NIntegrateC<Function>NIntegrate(Function f){return NIntegrateC<Function>(f);}
double f(double x){return std::sqrt(x);}
main(){std::cout<<NIntegrate(f)(0,2)<<std::endl;}
112 :
デフォルトの名無しさん :02/12/14 23:54
>108 はい! >109 ですね。習いましたよ~
また甘やかしか…。 そんなことしてるから一向に甘ちゃんが減らないんだよ。 来週間違いなくまたアホみたいな質問でスレ埋まるぞ。
>>112 っていうかもう分からないことはないだろ?
>>113 答え教えるだけ。がもっとも甘やかしだとおもうが。
宿題すら満足にできないバカを助けるためのスレだろ?ここは。
それが気に食わんなら、
自分では賢いと思ってる僕に難解な問題を出してください!
スレとかの方が自分に正直でよっぽどいいと思うが。
>>113 んなことは知らん。
つーか、アホみたいな質問で埋まることもない。
丸投げだから。
それぐらい理解れ。
118 :
デフォルトの名無しさん :02/12/15 00:00
>>116 バカという言い方はどうかと・・・
最初は誰でも分からんのだから。
>>117 確かに、書く人間がアホなわけで質問自体はある程度の水準だろうな。
>>113 が一番アホだった、とφ(。_。)カキコカキコ
>>115-
>>117 宿題やらせろスレだったのか。すまん。
勘違いしてた。許してけろ。
よう分からんけど、
>>84 の問題って定積分じゃないの?
>>113 に残された選択肢
・このまま去る
まぁ、大人な対応。自分の考え方が世間一般には認められないことを自覚し、より精進してくれることを祈る。
・論理でねじ伏せようとする
そしてねじ伏せられる。
・人の話に聞く耳を持たず必死に周りの神経を逆なでする。
まぁ、いわゆる煽りって奴だ。
・死ぬ
推奨
124 :
デフォルトの名無しさん :02/12/15 00:03
そうだろ
>>124 だったら、それが何でCやC++と関係あるんだ?
0→2の値や√xの値等を変えても動くようにするなら分かるけど…
それとも、このxがCまたはC++の変数なの?
>>126 C/C++の宿題。ほかに質問は?
結構仕事もできると自負している文系さんですか?
129 :
デフォルトの名無しさん :02/12/15 00:20
>>126 先生!!何を言っているのか分かりません。
>>128 プログラムは趣味だからプログラムで微分積分なんて
やった事がないから分からないけど、定積分を解けと言ったら
そのまま答えが出るんじゃないかと…
132 :
デフォルトの名無しさん :02/12/15 00:34
>>130 解を陽に記述できないような方程式を解きたい時にこそ,
数値計算の出番かと.
>>131 だから、(0→2)の部分やxの値(√)が
変化するのだったら分かるって言ってるのですが…
まぁ、xは難しいと思うけど…
>>133 そらな。でも、それは宿題の範疇を超えている。
俺も公式で展開してxの値だけ変えろよ。と言うのがスマートと思う。
あのしょぼいサンプルがそのまま採用されるとは思ってなかった。
135 :
デフォルトの名無しさん :02/12/15 00:40
>>133 定積分をC言語で解く宿題が出てるんだってさ。
2/3 * √(x^3)
137 :
真面目に質問 :02/12/15 00:47
すいません、いきなり質問します。 sprintfのような書式の変換をおこなう関数で、 「フフフフフフフフフフフフ・・・・・・」という「フ」が連続で出てしまうエラーの経験があるかたいますか? なぜ、フフフフフ・・・となるのか知りたい。
>>135 答えが出るものはプログラムで組む意味がないでしょう
せいぜい、やるとしたら#defineで割り当てるとか…
まぁ、俺なら
>>136 の式で(0→2)を変数に割り当てるけど…
>#defineで割り当てる #defineで定義する
意味がない?意味がないだって? じゃあ、君が生きてることには意味があるのかい?.....フフフw
>>138 まあ、それはこの宿題出した先生に聞いてくれ。
>>137 引数が少なすぎてたまたまそう言う愉快なメモリ空間を読んだだけじゃないのかと。
>>138 意味も何も宿題。解かないと単位が出ない。単位が出ないと留年する。留年すると年間60~200
万円は確実に損をする。死活問題。
>>137 なんで向こうで話進んでるのに新たにこっちに書くんだい?
スレの流れ嫁よ。
145 :
デフォルトの名無しさん :02/12/15 00:53
>>138 やり方の問題ではない。答えがでりゃいいんだよ!
150 :
真面目に質問 :02/12/15 00:56
先ほどは、マルチに書き込んでしまって、すいませんでした。 この掲示板は初めてなもので、・・・。 常識知らずでした。 次からは気をつけます。 すいませんでした。ペコリ。
何故か話が明後日の方向へ進み始めました。
すいません。明後日の方向ってどの方角でしょうか? 気になって眠れません!教えてください!
153 :
デフォルトの名無しさん :02/12/15 00:59
>>153 悪い、誤解してた。
printf("%f\n"0.885618083164127 + 1.0);
ほれ、手段は選ばず答えをはじき出した。
>>84 #include <math.h>
int main()
{
double n, m, dx ;
n = 0 ;
m = 2 ;
dx = ( 2.0 / 3.0 * ( sqrt( m * m * m ) - sqrt ( n * n * n ) ) ) ;
printf ( "%f", dx ) ;
return 0 ;
}
157 :
デフォルトの名無しさん :02/12/15 01:04
モンテカルロ法使って解こうぜ!!!
160 :
デフォルトの名無しさん :02/12/15 01:08
すいません有名なブラクらのアドレス教えて下さい。
>>160 すいません。ブラクラ張りたいアドレス教えてください。
モノによっては考えます。
>>150 ハァ?この掲示板以外ならマルチポストしていいとでも思ってんのか?
165 :
デフォルトの名無しさん :02/12/15 01:25
162>ええとそのアドレスをクリックしたらキャハハッハって叫んで口から血を流した女の人が画面いっぱいに でるやつです。この時間帯友達を脅かしてみたいです。よろしくお願いします。
168 :
デフォルトの名無しさん :02/12/15 01:28
教えて下さい。どこにあるかわかりません。お願いします。
171 :
デフォルトの名無しさん :02/12/15 02:12
そう言えば精神的ブラクラってのも良く分からんな。
そう言えばって言えば何でも許されると思うな。
そう言えばって言えば何でも許されると思うなって言えば何でも許されると思うな。
許されると思うなと言えば許されると思うな。
ちっ、少し遅かったか・・・。
(・∀・)ジサクジエンデシタ
何でも自作自演にすれば許されると思うな。
まだやりますか (;´Д`)
積分なんてわかるか!中卒をなめんな!ヽ(`Д´)ノ
>>82 ネタ臭いのでキャンセルOK?
ここではbisonの質問をしてはいけませんか? bisonを使ったCの宿題が出ているのですが、 先生がろくにbisonについて説明してくれないので、 何が何だかさっぱり分からなくて困っています。
大学のプログラミングの授業をとっているのですが、 「これコピペして、はい、こうなったね。じゃあ、次」 ってなんだよそれって感じです。 VC++のヘッダファイル”stdafx.h”でケプラーの運動方程式を解く プログラムなんですが、お願いできますか?
>>184 ヘッダファイルって
#include <xxx.h>
一つしかバリエーション無いが。
ケプラーの運動方程式って何?
>>185 ごめんなさい、分かりにくかったですね、#include<stdafx.h>のことです。
手順1) f(E) = E-e*sin(E)-M をEで微分してf'(E)を求める。
手順2)導き出したf'(E)をもとに
x1=x0-f(x0)/f'(x0) という式を作る、または
E1=E0-f(E0)/f'(E0) という式を作る
手順3)引数はMとe、戻り値はEの値となるように
newton_raphson(.....)という名前の関数を作る。
Mとeの値を使って、Eの値を求める関数を作る。
こういうヒントはもらってるんですが・・・
>>188 F(E)'は前もって作る。
・・・ってあれ?Eって変数っしょ?それが戻り値って?
190 :
デフォルトの名無しさん :02/12/16 00:27
はじめまして、宿題できないので書き込みます。 まず、a.txtと言うテキストファイルがあります。以下にその内容を書いておきます。 3 1 11 5 6 3 そして、この6つの値を、左からa b cの構造体に代入する。構造体は以下のように宣言。 struct y{ int a,b,c; }; struct y x[2]; どうかわかる人、教えてください。
192 :
デフォルトの名無しさん :02/12/16 00:30
>>188 おまえはまずケプラーの法則を完全に分かっているのか?
じゃないと(略
atdafx.h とケプラーの運動方程式に何の関係があるのかと
194 :
デフォルトの名無しさん :02/12/16 00:37
stdafx.hの中で関数を定義するってことでしょ。
そして、
>>188 の戻り値EはE1の間違いでしょ。
>>188 整理すると
各(e,M)についてf(E)=E-e*sin(E)-M=0
の近似解をニュートン(ラフソン)法で求める
#include<stdafx.h>はこの問題には関係ない
簡単だな。だれかやってやれ
196 :
デフォルトの名無しさん :02/12/16 00:44
197 :
デフォルトの名無しさん :02/12/16 00:48
Eはどうやって求めんのよ。ウヒ。
えっと、ファイルポインタを使って、以下のa.txtの 3 1 11 5 6 3 を、x[0].aに3 x[0].bに1 x[0].cに11 x[1].aに5 x[1].bに6 x[1].cに3 を入れたいのです。 fscanを使ってやる(?)らしいのですが…。 どうかお願いします。
>>199 ダサいので、
int *x[3] = {&dat.a,&dat.b,&dat.c};
fscanとかの方法は…?
203 :
デフォルトの名無しさん :02/12/16 01:38
#include <stdio.h> #include <stdlib.h> struct y{ int a,b,c; }; int main(void){ struct y x[2]; FILE *fp; fp = fopen("a.txt","r"); if(fp==NULL){ printf("fopen failed"); exit(-1); } return 0; } ファイルを呼んだ後どうすんのか判りません。ウヒ
>>203 fscanf() の使い方が分からんと言われると困るが。
誰かわかる人おらんのかー!?
fscanf(fp, "%d%d%d", &x[0].a, &x[0].b, &x[0].c); fscanf(fp, "%d%d%d", &x[1].a, &x[1].b, &x[1].c);
208 :
デフォルトの名無しさん :02/12/16 01:59
>>205 #include <fstream>
struct y{
int a, b, c;
}
int main()
{
ifstream fin("a.txt");
y x[2];
if( fin ){
fin >> x[0].a >> x[0].b >> x[0].c;
fin >> x[1].a >> x[1].b >> x[1].c;
}
return 0;
}
209 :
デフォルトの名無しさん :02/12/16 02:17
できた。ウヒ #include <stdio.h> #include <stdlib.h> struct y{ int a,b,c; }; int main(void){ struct y x[2]; FILE *fp; fp = fopen("test.txt","r"); if(fp==NULL){ printf("fopen failed"); exit(-1); } fscanf(fp, "%d%d%d", &x[0].a, &x[0].b, &x[0].c); fscanf(fp, "%d%d%d", &x[1].a, &x[1].b, &x[1].c); fclose(fp); printf("%d %d %d\n",x[0].a, x[0].b, x[0].c); printf("%d %d %d",x[1].a, x[1].b, x[1].c); return 0; }
210 :
デフォルトの名無しさん :02/12/16 03:00
>208 std::はどこ行った?
下のプログラムを作ったんですが あまりに処理に時間がかかり上手く機能しません。 再帰を上手く使うにはどうしたらよいのでしょうか。 unsigned char minimum(unsigned char GC1, unsigned char GC2, unsigned char GC3){ int i; unsigned char h; if(GC1<GC2){ if(GC1<GC3) h=GC1; else h=GC3; } else{ if(GC2<GC3) h=GC2; else h=GC3; } return h; }
int GC(int i,int j){ if( i == 0 || j == 0) return 0; GCa = GC(i,j-1); GCb = GC(i-1,j); GCc = GC(i-1,j-1); Gx[i][j] = gx[i][j] + minimum(GCa,GCb,GCc); GCz = Gx[i][j]; return GCz; } int main(){ for (i=0; i<biWidth; i++){ for (j=0; j<=i; j++){ GCz = GC(i,j); Gx[i][j] = GCz; printf("Gx[%d][%d] = %d \n",i,j,Gx[i][j]); } } }
>>212 時間はかかってもプログラムが正しく動作してることは確認したの?
biWidthを小さな値にして試すとか。
>>214 さんありがとうございます。
biWidth=10でやってみたら
Gx[i][j] の i,j がすぐ終了するのですが
biWidth=15とかにするともう遅いです。
biWidth=20だとフリーズしたかのよう。
プログラムはとりあえず正しく動作している
と思います。
216 :
デフォルトの名無しさん :02/12/16 12:14
私javaとVBをやっていたものです。現在VC++をやろうと思いまして、 そこで質問したいんですけど、 基本的にVC++のイベントドリブンって、BIGIN_MESSAGE_MAP以下に動作追加して、 そこで追加して呼び出した関数にコード書いていくって手順でよろしいのでしょうか? なんかイベントのところがわかりずらかったので・・・・・・・
この時間人いないですねぇ・・・・・・・・・・・質問する時間間違えたかな? とりあえず夕方見に来ます。
>>215 GC(i,j-1) → GC(i-1,j-1)
GC(i-1,j) → GC(i-1,j-1)
GC(i-1,j-1)
というように複数回評価しているのを
減らしてあげればいい。
評価した値はGxに保存してあるんで、
2度目以降はその値を返すといい。
>>217 質問する場所を間違えてる。
確かVC++の初心者スレがあったと思うので、そっちへ。
>>218 ありがとうございます!
配列使って減らしてみました。
なんとか動きました。どうもです。
223 :
デフォルトの名無しさん :02/12/17 00:40
チョト分からないのですが、 printf("あああああ"); と cout<<"あああああ"<<endl; はどこが違うんですか?
>>223 printfは改行されない。
cout<<endl;は改行される。
改行(それだけじゃないけど)
226 :
デフォルトの名無しさん :02/12/17 02:08
227 :
デフォルトの名無しさん :02/12/17 02:46
>224-226 レスありがとうございます。 という事はprintfに改行コードつければ同じ様に使えるって事ですよね? (発音以外は)あまり大きな違いは無いと。
228 :
デフォルトの名無しさん :02/12/17 03:48
C言語の課題で 「double型は64ビットで表現されており、 有効精度は10進数16桁ほどであるので それ以上正確に計算できない。これを解決 するには(たとえば100桁まで求めるには) どうすればよいか?」 教えてください
229 :
デフォルトの名無しさん :02/12/17 03:50
>>223 cpp厨が喜んで語ってくれそうな質問だな・・・。
232 :
デフォルトの名無しさん :02/12/17 09:00
つかcoutのほうもendlがなけりゃ(略
233 :
bloom :02/12/17 09:19
>>231 たぶんこれでよいです
どうもありがとうございます
235 :
デフォルトの名無しさん :02/12/17 19:51
ほんとにわかりません。お願いします。 問題 正の整数の掛け算を行う関数kakezan1とkakezan2がある。(ただし、結果が16ビット以下の数値を取り扱う)また kakeza1とkakeza2の違いは赤字で書いた一行のみである。 1.片方の関数の結果は間違っている。両者を比較して、その理由を説明しなさい。 2.1の説明を踏まえて間違っている結果を示した関数を修正しなさい。修正できるのはそれぞれの関数で一行のみとし、赤 字のところは変えてはならない。また、1での解答に沿ったものでなければならない。
#include <stdio.h>
long kakezan1(long x, long y, int n){
long a,b,c,d,e,e1,e2;
int n2;
if( (x>>n)!=0 || (y>>n)!=0) {
n<<=1;
}
if(n==2) {
e=x & y;
} else {
n2=n
>>1 ;
a=x >> n2;
b=x- (a<<n2);
c=y >> n2;
d=y- (c<<n2);
e1=kakezan1(a,c,n2);
e2=kakezan1(b,d,n2);
e=(e1<< n)+( ( kakezan1(a+b , c+d,n2) - e1-e2 ) << n2)+ e2;
}
return e;
}
long kakezan2(long x, long y, int n){
long a,b,c,d,e,e1,e2;
int n2;
if(n==2) {
e=x * y;
} else {
n2=n
>>1 ;
a=x >> n2;
b=x- (a<<n2);
c=y >> n2;
d=y- (c<<n2);
e1=kakezan2(a,c,n2);
e2=kakezan2(b,d,n2);
e=(e1<< n)+( ( kakezan2(a+b , c+d,n2) - e1-e2 ) << n2)+ e2;
}
return e;
}
int main() {
int i;
long a,b,c;
scanf("%d %d",&a,&b);
c=kakezan1(a,b,16);
printf("==1== %ld %ld %ld \n",a,b,c);
c=kakezan2(a,b,16);
printf("==2== %ld %ld %ld \n",a,b,c);
return 0;
}
どうか宜しくお願いします
俺の目が悪いからかもしれんがどこが赤字で書かれてるかわからん
long kakezan1(long x, long y, int n)の中は e=x & y; long kakezan2(long x, long y, int n) の中は e=x * y;です。 お願いします。
>240 とりあえずどっちがあってるかの確認(問1)は終わったのか?
242 :
デフォルトの名無しさん :02/12/17 20:59
・・・このコードって誰が作ったんだ?
三項の乗算とは珍しいな。
>241 kakezan2があっています。 e=(e1<< n)+( ( kakezan1(a+b , c+d,n2) - e1-e2 ) << n2)+ e2; 変えればばよいと思うのですがどう変えたらいいか解らないです。 >242 これは、大学の先生が作った問題です。去年の講義の追試の問題です。
てs
>246 ありがとうございます。助かりました。 細かいところまでしないと桁上がりが上手くいかないんですね。
>>247 > 細かいところまでしないと桁上がりが上手くいかないんですね。
???
もっと単純な理由なんだけど。
249 :
デフォルトの名無しさん :02/12/17 22:49
日付(yy/mm/dd)のみ(時間は要らない)を標準関数から取得するにはどうすれば?
>>249 すべての要素をバラバラに取得できるのがあったと思うからそれ使ってsprintfでもすれば?
標準関数って time.h を使っちゃダメってことか?
>>253 あれってオプショナルなの?
stdioとstdlibだけ・・・?
strftime使えばええやん。
まずは、『標準』を定義しなさい。 話はそれからだ。
>>256 標準を知らない奴が標準を定義できるわけありません。
あなたが標準を定義しなさい。
それで3数のミニマム取れる? if(GC1<GC2){ のあとGC2,GC3比較していないけれど 毎回三分岐して行く、mainではn^2で増える。 けったいなプログラムやな。
>>249 time_t t;
struct tm *tmp;
char buf[11];
t=time(NULL);
tmp=localtime(&t);
sprintf(buf,"%d/%d/%d",tmp->tm_year+1900,tmp->tm_mon+1,tmp->tm_mday);
/* strftime(buf,sizeof(buf),"%Y/%m/%d",tmp); */
printf("%s\n",buf+2); /* yy */
N*nN行列式の計算と逆行列の求め方わかる方いませんか? 3*3までのなら作れるんですが、N*Nはアルゴリズムからわかりません。 C++はよくわからないのでC希望です。
行列 p://www.sra.co.jp/people/miyata/algorithm/matutil.txt 逆行列(GaussJordan法) p://www.sra.co.jp/people/miyata/algorithm/gjmatinv.txt 逆行列(上三角行列) p://www.sra.co.jp/people/miyata/algorithm/invr.txt
262 :
デフォルトの名無しさん :02/12/18 02:46
大学の課題ですがほとんど分からず困っています。 以下のCプログラム作成の仕方を教えてください。お願いします。 8*8のチェス盤にクイーンの駒の位置を表す2つの正整数を読み込んで、 クイーンの居る場所は文字Qを、クイーンと同じ行・列・対角線の場所には*を、 その他の場所にはハイフンーを出力。 ただしchar型の1次元配列または2次元配列を用いて、 1行分の文字パターンを1回のprintfで実行できるようにして、 文字を出力する際の変換指定には%Cを用いるようにする。 たとえばx=2、y=3の場合はこのようになります。 --*---*- --*--*-- *-*-*--- -***---- **Q***** -***---- *-*-*--- --*--*--
printf()のところがなかなかまぬけ。 #include <stdio.h> char* data[] = { "*------*------*", "-*-----*-----*-", "--*----*----*--", "---*---*---*---", "----*--*--*----", "-----*-*-*-----", "------***------", "*******Q*******", "------***------", "-----*-*-*-----", "----*--*--*----", "---*---*---*---", "--*----*----*--", "-*-----*-----*-", "*------*------*" }; int main() { int x, y, i; printf("x ?"); scanf("%d", &x); printf("y ?"); scanf("%d", &y); for (i = 0; i < 8; i++) { printf("%c%c%c%c%c%c%c%c\n", (int)data[y + i][x + 7], (int)data[y + i][x + 6], (int)data[y + i][x + 5], (int)data[y + i][x + 4], (int)data[y + i][x + 3], (int)data[y + i][x + 2], (int)data[y + i][x + 1], (int)data[y + i][x + 0]); } return 0; }
あー、そういう手があったかー なんか、目から鱗
>>263 すげえ、初心者(俺)は思いつかないってば。
266 :
デフォルトの名無しさん :02/12/18 04:42
FDを挿した時に「デバイスの状態遷移割込」をCPUに対してIRQの発生として 通知するようなドライバ。
それが何か?
>>263 面白い発想やね
しかも、これなら他の駒の動きにも
簡単に対応出来るし
fwrite() を使えば少しスッキリする予感
ハッシュ って n と違うの?
O(n)ってことですか?MD2もMD4もSHa-1も全部O(n)なのでしょうか?
左右が反転してるのが気持ち悪かったので、ちょっと改良してみた。 #include <stdio.h> #include <string.h> char* data[] = { "*------*------*", "-*-----*-----*-", "--*----*----*--", "---*---*---*---", "----*--*--*----", "-----*-*-*-----", "------***------", "*******Q*******", "------***------", "-----*-*-*-----", "----*--*--*----", "---*---*---*---", "--*----*----*--", "-*-----*-----*-", "*------*------*" }; int main() { int x, y, i; char buff[9]; printf("x ?"); scanf("%d", &x); printf("y ?"); scanf("%d", &y); for (i = 0; i < 8; i++) { strncpy(buff, &data[y+i][7-x], 8); buff[8] = NULL; printf("%s\n", buff); } return 0; }
>>273 あーすいませんです。
ハッシュ=O(n)なら、計算量は関係なく、強度問題だけを考えればいいのかなぁっておもいました。
つーか、問題の条件に 「printfで%cを使う」ってのがあったことにいまさら気づいた。 %cを使うと>263みたいにしかできないか。
>>274 fwrite() を使えとあれほど・・・
つーか、直線関数上にいるんだかから、判定そんなに難しくないじゃん。 int getint(const char *prompt, int min, int max) { char buf[256]; int ret; for(; ; ) { printf("%s を入力してください (%d~%d):", prompt, min, max); if(fgets(buf, sizeof(buf), stdin) && sscanf(buf, "%d", &ret) == 1 && ret >= min && ret <= max) return ret; } } int main(void) { int x, y, a = getint("縦方向の位置", 1, 8) - 1, b = getint("横方向の位置", 1, 8) - 1; printf(" "); for(y = 1; y <= 8; y++) printf("%2d", y); putchar('\n'); for(x = 0; x < 8; x++) { printf("%d ", x + 1); for(y = 0; y < 8; y++) { if(x == a && y == b) printf("Q"); else if(x == a || y == b || x - a == y - b || x + y == a + b) printf("*"); else printf("・"); } putchar('\n'); } return 0; }
>>279 で、最後にprintf("%c\n",' ');か。おめでてぇな。
>>270 MD5でハッシュキーを求めるのに、ファイルサイズに対してどういうオーダーの計算量が
かかるかって意味でいいの?
ハッシュ=O(1) かも
> ただしchar型の1次元配列または2次元配列を用いて、 > 1行分の文字パターンを1回のprintfで実行できるようにして、 > 文字を出力する際の変換指定には%Cを用いるようにする。 クソだなー、この仕様。
>>285 263 でほぼ実現できてるから間違いではない。
でもクソ
287 :
デフォルトの名無しさん :02/12/18 15:44
ありがとうございます。早速やってみます。
>>284 > > 文字を出力する際の変換指定には%Cを用いるようにする。
というか、全角の%は無視するにしても、大文字のCの変換指定なんて見たこ
とないんだが。
つーか、藻前ら精度指定(%.8s)って知りませんか?
いや後半の意味が分からないんだけど、どうするつもりなのかな?
学校で冬休みを使って、C++で何か作れという宿題が出ました。 習い始めて2ヶ月半、まだクラス継承ぐらいまでしかできません。 もしよろしければ何か作る物のアイデアやヒントをいただけないでしょうか?
今時、ディスクトップアクセサリ作るのか。 大変だな。
Hello, World!
すいません。C言語の初心者です。 課題で出されたCがわからなくてこまってます。 課題は2つの行列AとBを加算するプログラム(matadd.c 未完成)をディスクに保存する。 入力用データファイル matadd.dat をディスクに保存する。 ソースプログラムをコンパイルし,実行する。 実行時に次のように入力のリダイレクトを行い,データファイルからデータを読み込ませる。 matadd < matadd.dat 表示された結果とソースプログラム内容を観察し,どのような手順で2次元配列を入力・出力しているか,理解する。 次に,C=A+B を計算し,Cの各要素を行列らしく出力する部分を追加して完成させる。 上と同様に実行して動作確認ができたら,ソースプログラムを提出する。
やっぱりポーカーとか将棋辺りにしようかな 他の人とかぶりそうだけど・・・
リバーシと言え。300ゲト
囲碁のルールがいまいち分からないんですが、 良い解説サイトありませんか?
レスありがとうございます オセロですか。 オセロは動作が簡単そうな気もするのですが(あんまり考えてませんが・・囲碁はむりっぽ ただいまポーカーのアルゴリズムを見つけたので、それを見ております。 引き続きいいのありましたら、よろしくお願いします。
たとえば、ポーカーを作るとして、コンピューターの役を考えなければなりません。 ここで大きな問題が発生しました。 プレーヤーが持ってるカードをCPUが役として出してしまった場合目も当てられない状況に なってしまいます。 まぁ課題なんだからせこい手を使って、26枚ずつ、あらかじめ決められたカードを プレーヤーとCPUがもっていて、CPUの役パターンを作り、プレーヤーはそこから引くという風にしてもいいような気もするのですが・・ みなさんだったらどうするのでしょうか?
>>293 UNO&麻雀(もちろん脱衣)♪
って書こうと思ったけど、そのレベルじゃね…
でもポーカーくらいインチキなしで作ろうや
>>305 ナニヲイッテルンダロウ
一人用のビデオポーカーもどきでいいじゃん。
あほですいません。
>>308 さん
その一人用のビデオポーカーもどきを作ろうとしてるのですが
うまく考えがまとまらないのです・・
struct card{ int number; int mark; }card[52];
311 :
デフォルトの名無しさん :02/12/19 02:02
>>310 numberとかmarkとか必要ないじゃん
struct card{ }card[52];
315 :
デフォルトの名無しさん :02/12/19 02:33
>>314 8文字以上の文字が印字されないことを指定する
宿題のプログラム作りました。 #include<stdio.h> main(void) { int x; x=5;/* xを5 */ if(x >= 0){ if(x % 2 == 0){ printf("even\n"); } else { printf("odd\n"); } 初めて作ったプログラムなのですが、うちのPCには コンパイラがありません。 これで動くか誰かやさしく教えてほすぃ。
>>314 んなもん、見れば分かる
問題は、それが規格として通ってるかどうか
俺の記憶が確かならば、printf系のformatの精度は
実数を表示するため使用するものであって
他の型にも適用出来るとは書いて無かったはず
>>318 レスどうもです。
xが偶数か奇数かを判別するプログラムなんですが、
どこ変えたらよろしいの?
>>319 まず「{」と「}」の数が同じになるようにしませう
321 :
デフォルトの名無しさん :02/12/19 03:12
printf("odd\n"); } }← }←
322 :
ダウソ住民 :02/12/19 03:20
324 :
デフォルトの名無しさん :02/12/19 09:48
何処に質問してイイのかわからない void main() { int i; double radius1 +=0.2; double radius2 +=1.0; for (i=0; i<BUFF-SIZE; i++) { コレ↑ってどういう意味なんですか?
#include <math.h> #define BUFF-SIZE 96 double sinbuff1[BUff-size]; double sinbuff2[BUff-size]; double sinbuff1-2[BUff-size]; void main() { int i; double radius1 +=0.2; double radius2 +=1.0; for (i=0; i<BUFF-SIZE; i++) { radius1 +=0.2; radius2 +=1.0; sinbuff1[i]=sin(rasdius1); sinbuff2[i]=sin(rasdius2); sinbuff1-2[i]=sinbuff[i]*sinbuff2[i]; } } コレ↑の何処が何の役割を果たしているか教えてください
> void main() 出直してきなさい。
>>327 何か一つでも教えてください!
お願いします!!!!
>>328 あんなくだらねえことしか突っ込めない厨は相手にするな
double sinbuff1[96];
にしたいんなら
#define BUFF_SIZE 96
だよ
おそらく板書を手で写したんだろうが
ハイフンかアンダスコアかわからんときは
その板書をしている先生にすかさず質問しろ
自分の板書がどれだけわかりにくいか
先生にフィードバックしてやることはオマエのためだ
330 :
デフォルトの名無しさん :02/12/19 10:44
#include <stdio.h> int function(int a, int b, int c, int d, int e, int f){ return ((a-64) * (b-64) * (c-64) * (d-64) * (e-64) * (f-64) % 47); } main() { FILE *fin, *fout; int line_1[6], line_2[6], x, y, i, *p, *q; fin = fopen("ride.in.txt", "r"); p = line_1; q = line_2; for(i=0; i<6; i++){ *p = fgetc(fin); p++; } x = function(line_1[0], line_1[1], line_1[2], line_1[3], line_1[4], line_1[5]); for(i=0; i<6; i++){ *q = fgetc(fin); q++; } y = function(line_2[0], line_2[1], line_2[2], line_2[3], line_2[4], line_2[5]); fout = fopen("ride.out.txt", "w");
if(x == y){ fprintf(fout, "GO"); }else{ fprintf(fout, "STAY"); } printf("%4d%4d", x, y); fclose(fin); fclose(fout); return 0; } 入力ファイルには大文字の英単語(1~6文字)が2行書かれてあって、A=1,B=2,Z=26……として、 例えば、"上の行"の単語が"GOOD"であれば"上の行"=7*15*15*4とする。もしこのとき"上の行"%47=="下の行"%47ならば 出力ファイルに"GO"、!=ならば"STAY"と入力するようにしようというプログラムですが、 自分は2時間悩んで上記のような結果しか書けませんでした。訂正すべき点を指摘してください。
>>330 fgetcではなくfgetsを使っては?
>>329 それでまともなレスしたつもりなのかと小一時間・・・
> double radius1 +=0.2; > double radius2 +=1.0; これはちょっとなあ・・・。
>>333 相変わらず突っ込めばくだらねえこと
くだらねえと言われると突っ込むこともできなくなる
内容のない香具師だな
#include <stdio.h> int function(int a, int b, int c, int d, int e, int f){ return ((a-64) * (b-64) * (c-64) * (d-64) * (e-64) * (f-64) % 47); } main() { FILE *fin, *fout; int x, y; char line_1[6], line_2[6]; fin = fopen("ride.in.txt", "r"); fout = fopen("ride.out.txt", "w"); fgets(line_1, 8, fin); fgets(line_2, 7, fin); x = function(line_1[0], line_1[1], line_1[2], line_1[3], line_1[4], line_1[5]); y = function(line_2[0], line_2[1], line_2[2], line_2[3], line_2[4], line_2[5]);
337 :
330(続き) :02/12/19 11:40
if(x == y){
fprintf(fout, "GO");
}else{
fprintf(fout, "STAY");
}
fclose(fin);
fclose(fout);
return 0;
}
>>332 の指摘を受けた完成させました。かなりうれしいですが、
ほかにもエレガントな解答があるのでしょうか?
自分のヤツはとても汚いと思いますので。
角度を0度から360度まで10度おきに変えて、正弦関数sin(x)の値を計算するプログラムの作り方を教えてください。 sin関数を使うとき、引数となる角度の単位はラジアンでお願いします。
339 :
デフォルトの名無しさん :02/12/19 12:09
#include <stdio.h> int main(void) { FILE* fp = fopen("console.txt", "r"); if(fp == NULL) return 1; char str1[10], str2[10]; fscanf(fp, "%s", str1); fscanf(fp, "%s", str2); fclose(fp); int count1 = str1[0] - 0x40; int count2 = str2[0] - 0x40; for(int i = 1; str1[i] != 0; i++) count1 = count1 * (str1[i] - 0x40); for(i = 1; str2[i] != 0; i++) count2 = count2 * (str2[i] - 0x40); fp = fopen("console2.txt", "w"); if(fp == NULL) return 1; if((count1 % 47) == (count2 % 47)) fprintf(fp, "%s", "GO"); else fprintf(fp, "%s", "STAY"); fclose(fp); return 0; }
341 :
デフォルトの名無しさん :02/12/19 12:24
>>338 #include <stdio.h>
#include <math.h>
int main(void)
{
for(int i = 0; i <= 360; i+=10)
printf("%.4f\n", sin(3.14159 / 180 * i));
return 0;
}
342 :
デフォルトの名無しさん :02/12/19 12:24
>>339 1. int main(void) と main() の違いは?
2. FILE* fp と FILE *fp の違いは?
3. return 1; とか、 return 0; ってなんかの意味があるんだー。何?
4. >int count1 = str1[0] - 0x40;
掛け算は常に先に優先されて、0*40=0じゃないのか?
342 は誰でつか?
>>343 「初心者」の工房「プロ」グラマでつ。
>>339 のヤツをコンパイルするとエラーが6つも出ました。
ちなみに使っているコンパイラーはBorland
345 :
デフォルトの名無しさん :02/12/19 12:43
Error E2140 ride.c 7: Declaration is not allowed here in function main Error E2140 ride.c 12: Declaration is not allowed here in function main Error E2140 ride.c 13: Declaration is not allowed here in function main Error E2188 ride.c 14: Expression syntax in function main Error E2451 ride.c 14: Undefined symbol 'i' in function main Error E2379 ride.c 14: Statement missing ; in function main *** 6 errors in Compile *** for(int i = 1; str1[i] != 0; i++) を for(i = 1; str1[i] != 0; i++) に直すとエラーは4つになりました。
339 じゃないけど、 > 1. int main(void) と main() の違いは? 型の省略された関数は int 型。 中身の無い仮引数括弧は (void) と一緒。 なので上記 2 つは全く同一。 ただし、ANSI C 準拠とするなら、void は省略できない。 (C++ なら省略可) > 2. FILE* fp と FILE *fp の違いは? 同一。 ちなみに FILE * fp; でも一緒。 まあ、紛らわしいから FILE* fp なんて書き方はしない方がいい。 > 3. return 1; とか、 return 0; ってなんかの意味があるんだー。何? main() 内部での return の引数や、exit() 関数の引数に指定された数値は、 そのプログラムを呼び出したオペレーティングシステムに返す。 バッチファイルやシェルスクリプト等で、その値を受け取って、その値によって その後の動作を変えるという事をするが、そうしていないのなら無意味と言える。 > 4. >int count1 = str1[0] - 0x40; > 掛け算は常に先に優先されて、0*40=0じゃないのか? 0x40 は数値の 16 進表記であって掛け算ではないのをご存知無い?
>>345 > ride.c
おいおい。
339 のコードは C じゃなくて C++ だよ。
> まあ、紛らわしいから FILE* fp なんて書き方はしない方がいい。 なんで?
349 :
デフォルトの名無しさん :02/12/19 13:11
FILE* fp1, fp2, fp3,・・・
おおかた参考書に FILE *fp って書いてあったのをそのまま使ってんだろ
348 はともかく、350 は相当恥ずかしいな
printf() の %C 指定って、ワイド文字の出力じゃなかったか?
つーか、こんなん初めて知ったんだけど。 include <stdio.h> int main(void) { int i = 0; printf("12345%n\n", &i); printf("%d\n", i); return 0; }
MS 拡張のようだった
>>355 SUSv2にもあるが、C99にはない。obsoleteかな?
>>354 printf("0123456789abcdef%n\n",&i);
で、iに%nまでの文字数が入るのか。
白中田。
359 :
デフォルトの名無しさん :02/12/19 22:43
ポインタ n:整数ポインタ:そこまでに出力されたバイト数を(入力引数が指す位置に)格納します。
> データはキーボードから入力し その入力のフォーマットがわからんと、どうにも回答しようが無い。
>>359 簡単な答えはすぐ下にあるようだが、そこからどうしろと?
Borland TURBO C++ Version3.1 から引用
360 は何を訴えたい?
%nの仕様
はなからそう書いとけ
#include <stdio.h> void input(int x,int y); int sum1(int x,int y); int sum2(int x,int y); void output(int x,int y); int main(int argc, char* argv[]) { int a,b,n; printf("何行何列かを入力してください:\n"); scanf("%d,%d",&a,&b); input (a,b); sum1(a,b); sum2(a,b); output(a,b); return 0; } void input(int x,int y) { int i,j,table[10][10]; for( i = 0; i < x-1; i++ ) { for( j = 0; j < y-1; j++ ) { /* i, j 要素の入力 */ printf( "table[%d][%d] = ", i, j ); scanf( "%d", &table[i][j] ); } } }
int sum1(int x,int y) { int i,j,sum=0,table[10][10]; for( i = 0; i < x; i++ ) { sum = 0; for( j = 0; j < y-1; j++ ) { sum += table[i][j]; } table[i][y-1] = sum; /* 計算結果 */ } return sum; } int sum2(int x,int y) { int i,j,sum=0,table[10][10]; for( j = 0; j <= y; j++ ) { sum = 0; for( i = 0; i < x-1; i++ ) { sum += table[i][j]; } table[x-1][j] = sum; /* 計算結果 */ } return sum; }
void output(int x,int y) { int i,j,table[10][10]; for( i = 0; i < x; i++ ) { for( j = 0; j < y; j++ ) { /* i, j 要素の表示 */ printf( "%d", table[i][j] ); if( j == y-1 ) { printf( "\n" ); } else { printf( "\t" ); } } } } とりあえず自分で作ってみたやつです。うまくいきませんけど。
双方向リンクドリストでつまづきました。 void main(void) input関数呼ぶ。p->next==NULLまでwhileしてoutput関数呼ぶ。 struct eLIST *input(struct eLIST **pstart) mainから呼ばれる。sscanfで標準入力からa.exe < listとして読みこむ。appListからの返り値pを返す。appListにstruct gakusei gを渡す。 struct eLIST *appList(struct eLIST **pstart, void * data) insListにdataとか渡す。insListの返り値を返す。 struct eLIST *insList(struct eLIST **pstart, struct eLIST *after, void * data) dataをnewObjに渡す。newObjからの返り値でポインタ書き換え。追加されたオブジェクトのアドレスを返す。 struct eLIST *newObj(void data) メモリ確保してオブジェクト生成。返り値はオブジェクトのアドレス。 void output(struct gakusei *p) p->data(void *data)ポインタが指してるstruct gakusei型のデータを表示したい。
~続き
というプログラムなのですが、なぜか4文字以上の文字が出てこないです。
こんな感じ↓
>D:\My Documents\syuku\c>a.exe<list
>input() naibu hiroyuki
>input() naibu monar
>input() naibu gikoneko
>input() naibu sii
>input() naibu morara-
>input() naibu zonu
>Name:hiro
>Name:mona
>Name:giko
>Name:sii
>Name:mora
>Name:zonuQラ
printfじゃなくてputcharで改行までwhileやって表示しても変わりませんでした。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433 の44番にソースを張りました。
よろしくお願いします。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct matrix { int x, y; int *table; }; void GetInt(const char *prompt, int *i) { char buf[256]; for(; ; ) { printf("%s = ", prompt); if(!fgets(buf, sizeof(buf), stdin)) continue; if(sscanf(buf, "%d", i) == 1) return; } } int GetSize(struct matrix *m) { GetInt("表の行数", &m->x); GetInt("表の列数", &m->y); m->table = malloc(sizeof(int) * m->x * m->y); if(!m->table) return -1; return 0; }
void GetMatrix(struct matrix *m) { int x, y; for(y = 0; y < m->y; y++) { for(x = 0; x < m->x; x++) { char prompt[256]; sprintf(prompt, "table[%2d][%2d]", x, y); GetInt(prompt, &m->table[y * m->x + x]); } } } void ShowMatrix(struct matrix *m) { int x, y, line_sum, total = 0; printf(" "); for(x = 0; x < m->x; x++) printf("%4d", x); printf(" sum\n"); for(y = 0; y < m->y; y++) { printf("%4d", y); line_sum = 0; for(x = 0; x < m->x; x++) { line_sum += m->table[y * m->x + x]; printf("%4d", m->table[y * m->x + x]); } printf("%4d\n", line_sum); }
printf(" sum"); for(x = 0; x < m->x; x++) { line_sum = 0; for(y = 0; y < m->y; y++) line_sum += m->table[y * m->x + x]; printf("%4d", line_sum); total += line_sum; } printf("%4d\n", total); } int main(int argc, char* argv[]) { struct matrix m; if(GetSize(&m)) return -1; GetMatrix(&m); ShowMatrix(&m); getchar(); return 0; }
あ、 free() してねーや。
>>372-375 どうもありがとうございました。
何の問題もなく動きましたがなにかあるんでしょうか?
377 :
デフォルトの名無しさん :02/12/20 00:16
Cの宿題です。 構造体を使ってスケジュール管理ソフトを作らなあかんのですけど 助けてください
> 何の問題もなく動きましたがなにかあるんでしょうか? free() してない、の事? このプログラムみたいにすぐ終了してしまうようなプログラムでは気にする必要無い。 常駐して動き続けるような場合は、free() しないと malloc() で確保されたメモリ をずっと放さないので、消費メモリが無駄に増える。 なので、基本的には不必要なメモリは free() で解放する。
ほぼ全部わかりません 今日始めて習ったばっかりなんです
381 :
デフォルトの名無しさん :02/12/20 00:20
初日にいきなり構造体教えるか?
今日が初日なわきャーないと思う。
いや、構造体をです。うちの高校では流れが毎年決まってて 4月からif→for→switch→while→ポインタ→構造体→(再来週)バブルソート と続くそうです。
再来週じゃなくて再来月でした
>>384 お前の学校では年末の冬休み中にも授業をやるのか?
>>377 「スケジュール管理ソフト」の仕様を説明して
>>387 課題の文章を引用すると
・50件までの予定を書き込める機能
・1年分のカレンダーを表示する機能
{実行時にその日の日付を入力させ、その数値を元に365(366)日分を計算し出力)
・スケジュールを上書き、削除する機能
最低限、上記三つの機能を持ったスケジューラを作成する事
グラフィック関数を使用するとコンパイル時にホストがフリーズするので
絶対に使用しないこと。
という課題です。えらいアバウトな感じですが原文です
UNIX上で動かします
っていうか、グラフィック関数使うとコンパイル時にフリーズって
意味わかんないです
> グラフィック関数を使用するとコンパイル時にホストがフリーズするので 何じゃそりゃ
で、377 は 「自分が何をわかっていないのか」 を洗う事すら放棄して、完全に 人任せにするつもりなのだな?
>>389 スケジューラって、プログラムのスケジューラじゃなくて
予定を書き込めるカレンダーの事?
>>388 ありがとうございます。勉強になります。
393 が何を嘲笑ってるのかいまいちわからないのだが
397 :
デフォルトの名無しさん :02/12/20 01:56
0から10までの整数を複数個入力し、 各数値の頻度を求めて表示するプログラムを作成しなさい。 よろしくおねがいします。
>>397 #include <stdio.h>
int main(void)
{
char buf[256];
int i, table[11] = { 0 }, total_cnt = 0;
puts("0 ~ 10 の数値を複数個入力してください。(-1 で中断)");
for(; ; )
{
if(!fgets(buf, sizeof(buf), stdin))
break;
if(sscanf(buf, "%d", &i) == 1)
{
if(i == -1)
break;
if(i >= 0 && i <= 10)
{
total_cnt++;
table[i]++;
continue;
}
}
puts("エラー");
}
for(i = 0; i <= 10; i++)
printf("%2d: %3.1f%%\n", i, table[i] * 100.0 / total_cnt);
getchar();
return 0;
}
>>397 int count[11];
main(){
int c;
while((c=getchar()) != EOF) if(c<=10)count[c]++;
for(c=0;c<=10;c++) printf("%d ", count[c]);
puts("");
}
入力はバイナリの整数0-10だが
> 入力はバイナリの整数0-10だが ワラタ 398 も詰めれば 6 行で逝けるやろ
402 :
デフォルトの名無しさん :02/12/20 03:03
標準入力からテキストファイルを読み込んで 最後の行から逆順に出力するプログラムを作りたいのですが どうもうまくいきません誰か助けてください #include <stdio.h> #include <stdlib.h> main() { char c,*c1[200],str[200]; int n,l,i; n = 0; l = 0; while ((c=getchar())!=EOF) { if (c=='\n') { n++; c1[n] = (char *)malloc(l); c1[n] = str; l = 0; } else { l++; str[l] = c; } } for (;n>0;n--) { printf("%s\n",c1[n]); free(c1[n]); } }
>>402 > n++;
> c1[n] = (char *)malloc(l);
> c1[n] = str;
せっかく代入したものを上書きしてどうする。
あと'\0'で終端してないしその分も確保してない。
> l++;
> str[l] = c;
Cではインデックスは0から。上のn++も同じ。
>>403 レスありがとうございます。
せっかく自分のソース貼り付けて指摘してもらったのですが
どうやって実現したらいいのかどうしてもわかりません
具体的にどう修正すればいいか教えてもらえるとありがたいのですが…
それとも根本的に間違ってますか?
>>402 突っ込み所が多すぎて何と言えば良いのか分からんので
取り敢えず、やりたいと思われるコードを…
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *c1[200],str[200];
int n, l, i, c;
n=0;
l=0;
while((c=getchar())!=EOF){
if(c=='\n'){
c1[n]=(char *)malloc(l+1);
for(i=0;i<l;i++) *(c1[n]+i)=str[i];
*(c1[n]+i)='\0';
l=0;
n++;
}else{
str[l]=c;
l++;
}
}
while(n--){
printf("%s\n",c1[n]) ;
free(c1[n]) ;
}
return 0;
}
>>405 ありがとうございます
勉強不足ですね
自分のソースと見比べて精進したいと思います
本当にありがとうございました!
>>402 EOFの直前が'\n'じゃないと、全部表示されないけど
直すのは簡単だから、その部分は自分で直してね
>EOFの直前が'\n'じゃないと、全部表示されないけど 意味が分からないかも知れないので訂正 EOFの直前が'\n'で終わってないと その行(EOF直前の最後の行)は(最初の行として)表示されないけど
>>408 とりあえず一回目のwhileの後に
c1[n]=(char *)malloc(l+1);
for(i=0;i<l;i++) *(c1[n]+i)=str[i];
*(c1[n]+i)='\0';
l=0;
n++;
をもう一回加えましたが
もっとスマートなソースが書けそうなんで
もうちょっとがんばってみます
かさねてありがとうございました。
>>409 それを、もう一回加えるのなら
if(l){}の中に入れた方が良い(実際にはない空行を無くすため)
あと、微妙に他の行と仕様が変わってしまうが(1バイト分)こんな手も…
if(l) {str[l]='\0';printf("%s\n",str);}
それとスマートなソースを書きたいのなら 1回目のwhileの中を他の関数(fgets()等)を使い もう一度、練り直した方が良いと思う
>>411 がんばってみます。
ありがとうございました
class CLASS_A{ public: int memberA }; class CLASS_B{ public: int memberB }; class CLASS_C{ public: CLASS_A instanceA; CLASS_B instanceB; }; instanceB から instanceA の memberA を参照したいです。 どうしたらいいでしょう?
>>413 どこまで改変して良いのかわからんが…
CLASS_BにCLASS_C*のメンバを追加(pointerC)
CLASS_CはinstanceBに自分自身を渡し、instanceBからは、
pointerC->instanceA.memberA
415 :
デフォルトの名無しさん :02/12/20 18:29
教えて下さい。 下記のソースなんですが、Main.cppでpBB = new BB( );を行うと リンカーエラーがでてしまいます。 因みに AAをexternしてMain.cppから呼ぶのはOKでした。何が原因か教えて下さい。 Test.cpp BB *pBB; Test.h class AA { int a; }; class BB : public AA { int b; }; extern BB *pBB; Main.cpp #include "Test.h" void main( void ) { pBB = new BB( ); }
まだかな?
I hate neta.
418 :
デフォルトの名無しさん :02/12/20 18:48
いえ・・
>>415 は真剣に聞いてるんですが、教えて下さい。
>>414 教えて君で申し訳ないのですが、そうすると
CLASS_B のメンバに CLASS_C のポインタを
CLASS_C のメンバに CLASS_B のインスタンスを
それぞれ入れることになるんですよね。
そういう交差したケースって、どうやったら実装できるのでしょうか。
420 :
デフォルトの名無しさん :02/12/20 19:08
415ですが、やっとわかりましたぁ~ お前らカス共に教えられなくて自力で解決して嬉しいです。
421 :
デフォルトの名無しさん :02/12/20 19:12
>>420 プッ・・・
カスに教えを請うなんて・・・
お前ってもしかして・・・
Cで作ったプログラムをgccでコンパイルしたら↓と出てきたんですが どういうエラーなのでしょうか? わかる人いたら教えてくださいm(_ _)m In function `enum yn dpssum(int *, int, int)': `k' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) `p' undeclared (first use this function)
>>423 関数 dpssum 内で、未宣言の k、p という識別子を使用している。
426 :
(・∀・) :02/12/21 01:51
↓この宿題は漏れが解く
| |がんがれ ↓
429 :
デフォルトの名無しさん :02/12/21 03:58
C言語で 「西暦と月を入力すれば、その月のカレンダーを表示するプログラミング」 を教えてください。 自分では全くわかりませんでした。 どうか、よろしく!!
430 :
デフォルトの名無しさん :02/12/21 04:00
432 :
デフォルトの名無しさん :02/12/21 04:02
>>430 全くわかりません。C言語習い初めて3ヶ月くらいなので。
でも、calという関数を使うのはなんとなくわかりました。
433 :
デフォルトの名無しさん :02/12/21 04:06
>>432 全く分からないんじゃ何も教えようがないだろ。
(つか3ヶ月習って全く分からないって。。。ネタダタ-のか?)
やらせろスレか、正直すまんかった。
436 :
デフォルトの名無しさん :02/12/21 04:16
>>433 パンキョーでやってるだけなので。当方文系学生。
437 :
デフォルトの名無しさん :02/12/21 04:17
家でCを勉強したいのですが、何が必要ですか? まじなんでよろしくっ
>>437 ・エロ本。
・保健体育の教科書
・エロビデオ
この最強3点セットで今日からあなたもCの達人に。
439 :
デフォルトの名無しさん :02/12/21 04:22
はぁ
>>437 最低限必要なものはコンパイラとテキストエディタ。
コンパイラは「Cは俺に聞け」スレの>2参照。
>>438 それではCの知識は付いても達人には成れない。
>>437 「はじめてのC」という教本も忘れずにな(ワラ
442 :
デフォルトの名無しさん :02/12/21 04:38
コンパイラってのがよくわかりません。
double heikin(int n,double height[]) { int i; double ave=0.0; for(i=0;i<n;i++){ ave+=height[i]; } ave/=n; return(ave); } こういう関数を作ったら Error: expected data def of 'heikin', not func def Internal error: func 254 こういうエラーがでます。原因がわかりません。 教えてください。
>>443 よくわからないエラーだが、関数のプロトタイプ宣言をしてもダメ?
#include <stdio.h> #include <math.h> を宣言しています。全プログラムを載せた方がいいでしょうか? 長くなりますが
>>445 載せてみたら?お互い何かの勉強になるかもしれない。
今2chは連続書き込み制限をしているようなので、串を変えながら
書き込むとよい。
447 :
デフォルトの名無しさん :02/12/21 04:56
>>445 heikin関数のプロトタイプのことを逝っているんだろ。
C++で呼び出しを行わなければエラーにはならないと思うけど。
#include <stdio.h> #include <math.h> inpdata(int n,double height[]); double heikin(int n,double height[]); double hyoujun(int n,double height[],double ave); void maxmin(int n,double height[],double *max,double *min); main() { int n; double height[50],ave,sd,max,min; inpdata(n,height); ave=heikin(n,height); sd=hyoujun(n,height,ave); maxmin(n,height,&max,&min); printf("平均値=%3.1lf\n",ave); printf("標準偏差=%3.1lf\n",sd); printf("最大値=%3.1lf\n",max); printf("最小値=%3.1lf\n",min); return(0); }
inpdata(int n,double height[]) { int i; for(i=0;i<n;i++){ printf("NO.%d=",i+1); scanf("%lf",&height[i]); } double heikin(int n,double height[]) { int i; double a=0.0; for(i=0;i<n;i++){ a+=height[i]; } a/=n; return(a); }
double hyoujun(int n,double height[],double ave) { int i; double sd,hensa; for(i=0;i<n;i++){ sd+=pow(height[i]-ave,2); } hensa=sqrt(sd/n); return(hensa); } void maxmin(int n,double height[],double *max,double *min) { int i; double min=height[0],max=height[0]; for(i=0;i<n;i++){ if(*max<height[i]) *max=height[i]; if(*min>height[i]) *min=height[i]; } }
451 :
デフォルトの名無しさん :02/12/21 04:59
>>448 この問題とは関係ないが、printfには%lfはないはず。
改行多くて見づらくてすみません。 以上の448-450のプログラムです。 原因がどうしてもつかめません。 お願いします。
453 :
デフォルトの名無しさん :02/12/21 05:01
>>449 inpdataでかっこの対応がおかしい
printfでは%fで十分ってことですね。 アドバイスありがとうございます。
>>445 プロトタイプの宣言と言うのは関数を呼び出す前に必要な宣言
double heikin(int, double []); /* この行の事 */
int main(void){
/* 適当 */
heikin(i,d);
/* 適当 */
}
double heikin(int n,double height[]) {
/* 適当 */
}
>>449 すいません。どうおかしいかわかりません。
できれば教えてもらいたいです。
>>455 つくってみます。
あ、かっこって()じゃないぞ。{}これ。
>>456 どうって、{が閉じられていないじゃない。
閉じられていないからコンパイラはheikin関数のところもinpdata関数の一部と見てしまうというだけ。
>>457 >>458 一個 } が抜けてました。
そして450のdouble min=height[0],max=height[0];
を*min=height[0]; *max=height[0];にしたらエラーが無くなりました。
}が原因だったようです。
453さん 455さんどうもありがとうございます。
そして455さんすみません。僕初心者な者でまだ何がなんだかわからないことが多くて
こういうことになってしまいました。
>>456 void maxmin(int n,double height[],double *max,double *min)
{
int i;
double min=height[0],max=height[0];
for(i=0;i<n;i++){
/* 以下略 */
は
void maxmin(int n,double height[],double *max,double *min)
{
int i;
*min=height[0],*max=height[0];
for(i=1;i<n;i++){
/* 以下略 */
462 :
デフォルトの名無しさん :02/12/21 05:37
あるグループにいる人がそのグループにいる他の人(1人とは限らない)に プレゼントを買って渡します。その結果、自分が何円儲けたか(損したか)を 出すプログラムです。計算は言わなくても分かると思いますが、こうです。 (もらったプレゼントに使ったお金の合計) - (自分がプレゼントを買うのに使ったお金の合計) = $(儲けた、あるいは損した) 入力ファイルからグループの情報を読み取り、 出力ファイルに計算結果を書き込むわけですが、 入力ファイルと出力ファイルのフォーマットを次のレスにします。
入力ファイルのフォーマットです。 1行目:グループにいる人数(2~10) 2行目~(グループの人数+1)行目:グループにいる人の名前(14英字まで)、 1人につき1行(グループの人数+2)行目~終わり:グループの中の1人につき1グループ、 よって(グループの人数)個のグループからなる。1グループ内のフォーマット: 1行目には名前(誰があげたか)、2行目には使ったお金(0~2000)と プレゼントをあげた人数。(空白で区切られる)3行目からはプレゼントを あげた人の名前を1人につき1行並べる(誰にあげたか)。
入力ファイルのサンプルです。 1: 5 2: dave 3: laura 4: owen 5: vick 6: amr 7: dave 8: 200 3 9: laura 10: owen 11: vick 12: owen 13: 500 1 14: dave 15: amr 16: 150 2 17: vick 18: owen 19: laura 20: 0 2 21: amr 22: vick 23: vick 24: 0 0
出力ファイルのフォーマットです。 出力ファイルは(グループにいる人数)行から成ります。 各行はグループにいる人の名前とその人がどのくらいのお金を儲けたかという値から成ります。(空白で区切る) 出力ファイルの例です。(上の入力ファイルの場合) 1: dave 302 2: laura 66 3: owen -359 4: vick 141 5: amr -150
>もらったプレゼントに使ったお金の合計 って、手形でもプレゼントされたのかと思ってみたり
>>466 プレゼントについては直接関係ないから手形でもいいけど。
むしろ手形と考えたほうが分かりやすいかも。
誰かこのプログラム解ける人いませんかぁ~?
468 :
デフォルトの名無しさん :02/12/21 09:17
じゃあ、図書券でやってみよう。
470 :
デフォルトの名無しさん :02/12/21 10:15
ボブサップ
>>468 どこらへんがどうわからんのかを言ってくれないと
こちらも説明できん。
>>468 サンプルに基づいて説明しようと思う。
それで分かってくれればいいんだが。だれか手強頼む!
1: 5 /* グループにいるヤツの人数(この場合は5人) */
2: dave /* グループにいるヤツの1人目 */
3: laura /* 2人目 */
4: owen /* 3人目 */
5: vick /* 4人目 */
6: amr /* 5人目 */
7: dave /* プレゼントをあげようとしているヤツ(1番目) */
8: 200 3 /* いくら$使ったか、何人にあげるか */
9: laura /* 誰にあげるか(1人目) */
10: owen /* 誰にあげるか(2人目) */
11: vick /* 誰にあげるか(3人目) */
12: owen /* プレゼントをあげようとしているヤツ(2番目) */
13: 500 1 /* いくら$使ったか、何人にあげるか */
14: dave /* 誰にあげるか(1人目) */
15: amr /* プレゼントをあげようとしているヤツ(3番目) */
16: 150 2 /* いくら$使ったか、何人にあげるか */
17: vick /* 誰にあげるか(1人目) */
18: owen /* 誰にあげるか(2人目) */
19: laura /* プレゼントをあげようとしているヤツ(4番目) */
20: 0 2 /* いくら$使ったか、何人にあげるか */
21: amr /* 誰にあげるか(1人目) */
22: vick /* 誰にあげるか(2人目) */
23: vick /* プレゼントをあげようとしているヤツ(5番目) */
24: 0 0 /* いくら$使ったか、何人にあげるか */
>>462 データの20行目が「0 2」なのは、スマイルを二人にあげた、ってこと? (w
// 問題文中にあった仕様は C流のコメント /* */ で囲んだ。
// いろいろ手抜きなので必要な変更や追加はご随意に
// エラーチェック省略(入力の順序・内容は仕様通りと仮定している、など)
// 入力は標準入力,(
>>464 の書式から、行番号(とコロン)を除いた形を期待している)
// 書式(変数の宣言)は C++ as better C
長すぎって怒られたので次レスで。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef
struct _balance_t {
char* name; // 名前
//
>>463 の解答としては name[15] にしてコードを変えてもいいんだろう
int balance; // 収支 /*自分が何円儲けたか(損したか)*/
} btag;
int members = 0; // 登場人物の数 // グローバルなのはちょっとカコワルイが許せ
btag *table = NULL; // 人数の収支計算表(を作る場所)
// これも
>>463 の解答なら table[10] で間に合うことは間に合う
int name2index(char* who) { // ただのリニアサーチでテーブル内の人を探す
for (int j = 0; j < members; ++j) {
if (strcmp(table[j].name, who) == 0)
return j;
}
return -1; // んな奴いねーよ
}
// 続く
>>473 >データの20行目が「0 2」なのは、スマイルを二人にあげた、ってこと? (w
その通り。このプログラムは皮肉も含むのだそうだ。
>長すぎって怒られたので次レスで。
誰に??
int main(int argc, char* argv[]) { /* 1行目:グループにいる人数 */ char buf[1000]; gets(buf); members = atoi(buf); table = (btag*)calloc(members, sizeof(btag)); // table[各要素].balance が零に初期化されるべきことに注意。 // ここでは calloc がゼロに初期化するので、それ以外の初期化はしない /* 2行目~:グループにいる人の名前 */ for (int m = 0; m < members; ++m) { gets(buf); table[m].name = strdup(buf); } while (gets(buf)) { /* 1行目には名前(誰があげたか)*/ int idx = name2index(buf); // テーブル上での添え字を求めておく if (idx < 0) { printf("ハァ? %s なんてシラネ。\n", buf); continue; // ちょっとはエラーチェックもしておこう } // 続く
/* 2行目には使ったお金とプレゼントをあげた人数。*/ gets(buf); int price, count; sscanf(buf, "%d %d", &price, &count); printf("%sは、$%dのプレゼントを %d個あげた。\n", table[idx].name, price, count); /* 自分がプレゼントを買うのに使ったお金の合計 */ table[idx].balance -= price * count; // 支出額が確定するので、おもむろに引く for (int to = 0; to < count; ++to) { gets(buf); /* 誰にあげたか */ int toIdx = name2index(buf); table[toIdx].balance += price; // プレゼント1個分の収入 // もらった分の「合計」は、このループを何回か通って // データをすべて読んだら確定する printf("...%sにあげた。\n", table[toIdx].name); } } // すまん、結構長かった。まだ続く
// ここに来たら(データを全部読んだら)収支計算は終わっている。 /* その結果、自分が何円儲けたか(損したか)を出す */ printf("\n*** 収支報告 ***\n"); for (int p = 0; p < members; ++p) { printf("%-14s %5d\n", table[p].name, table[p].balance); /* 名前(14英字まで)*/ // ...って書いてあったんで %-14s にしてみた(マイナスは左に揃えるため) } return 0; } // 以上
>>475 投稿内容があまり長いと、(2ちゃんねるの)掲示板プログラムにおこられるのさ。
長いプログラム用の貼り付け場所がどっかでガイドされてたはずなんだが、
見つけられなかったので分割して貼っちまいました。
おっとごめん、仕様を読み間違えていたかも。 > 2行目には使ったお金(0~2000)とプレゼントをあげた人数 ってのは、予算総額が書いてあって、それを「あげた人数」に等分したってことか... 上記のプログラムだと、「単価と個数」と解釈して書いちゃったので あとで変更点を書きますですよ。
>>473 とりあえずここまでやって頂いてご苦労さん。
>予算総額が書いてあって、それを「あげた人数」に等分したってことか
その通り。説明不足でスマソ。
1つ気になるけど、なぜファイルを扱わないのだろうか?
なんか偉そうだよな。
>>462 > なぜファイルを扱わないのだろうか
あとで書けばいいから。(俺にとって)ファイルをいじるのは問題の本質ではないので、
エラーチェックと同様後回しにしちゃうんだ。
このまま本気で(実用プログラムとして)書き進む場合は
ファイル名を指定してもしなくてもいいように書くよ。
変更点は…とりあえず、
>>477 の真ん中へん
table[idx].balance -= price * count; // 支出額が確定するので...
を
table[idx].balance -= price; // 支出額が確定するので、おもむろに引く
if (count > 0)
price /= count;// 単価に変換する。ただし小数点以下切り捨て
にする。
切り捨てした分の誤差が出て、会計報告としては失格なので
データ形式を変えるなどの工夫はやってください。(逃げる(w)
(float balance; にして
float unitPrice = 0.0;
if (count > 0)
unitPrice = (float)price / count;// 単価に変換する
// ...
table[toIdx].balance += unitPrice; // プレゼント1個分の収入
にするとか。そん時ゃ最後のprintf() も %d → %f などに。)
「ファイルを扱わない」ってのがもしも 「手でデータを打ち込んで試すんかいな?」って意味だったらいやなので念のため補足。 このままでリダイレクトで「ファイルから読んで」「ファイルに書く」ってことはできるよ。
>>473 ありがとうございました。あとは自分で完成させます。
>>481 ご苦労さんって目下の者に対して言う言葉だって知ってる?
社会に出てから上司に向かって「ご苦労」なんて絶対言わないように。首飛ぶよ。
487 :
デフォルトの名無しさん :02/12/21 15:37
お願いします。 6x+3y+4z-61=0の条件の下でのx^2+y^2+z^2の最小値 を求めるプログラムを教えてください。
日本は言葉に拘りすぎだな。 アメリカマンセ。
>>488 郷に入らば郷に従えというやつよ。
俺も自分の部下に「ご苦労」なんて言われたらむかつくな。
490 :
デフォルトの名無しさん :02/12/21 16:00
>>487 min x^2+y^2+z^2=r^2(とおかせてね)
subject to f(x,y,z)=6x+3y+4z-61=0
f(x,y,z)=0は平面の式になってますよね。
んで、原点からその平面までの距離rの2乗を求めよ、って問題ですね。
答えは
r = |0+0+0-61|/√(6^2+3^2+4^2) = 61/√61
∴ r^2 = 61
だと思う。
Cソースはしばし待て。
491 :
デフォルトの名無しさん :02/12/21 16:05
ご苦労様ならいいんでないかい
>>487 #include<stdio.h>
main()
{
double a=6.0, b=3.0, c=4.0, d=-61.0, r2;
r2 = d*d/(a*a+b*b+c*c);
printf("%f\n", r2);
}
>ご苦労さんって目下の者に対して言う言葉 別にそうとは限らん。あんたがしばしばさように使うというだけだろ
494 :
デフォルトの名無しさん :02/12/21 16:16
>>490 ありがとうございます!!!
感謝です!!
ちょっとわからないことがあったので、お願いします。 >fprintf(out, "%s %d\n", table[p].name, table[p].balance); こうすると、%sの後に勝手に改行が入るようになるのは何故? >table[idx].balance >table[toIdx].balance ここのidxとtoIdxとは何を表すのですか?
>>493 そうだそうだ。別に目上の者に使ったって良いじゃないか。
俺はよく人にドアを開けてもらったときや物を取ってもらったときに
感謝の気持ちを表すために「うむ、ご苦労。」と言っているぞ。
ちゃんと「お疲れ様です」と言え。ボケどもが。
おはようございますで通せ
俺、管理職相当のポジションだけどよく「ご苦労様でした」って言われるよ。
相手に悪気がないのはわかってるけどあまりいい気はしないなw
>>488 英語でも Thank you. の他に Appreciate you. とかあるよ。
漏れは
>>495 じゃないが一言。
このスレは学生さんばかりなのかい?
上司に「ご苦労さん」なんて言えるわけ無いだろ。会社に行けば嫌でも分かるよ。
失敗しでかす前にこのスレでちゃんと社会勉強できてよかったな。
敬語講座は別んとこ逝け
いちいち言葉尻とらえて感情的になる奴は厨房
敬語使えんヤツは厨房。 スレ違いを延々続けるヤツは厨房。
言葉の大切さが分かってない奴は厨房。
自分の発した言葉に責任をもてない奴が増えてきてるな。
>>507 同意。
スレ違い発言なので漏れも厨房。終了。
おまいらくだらない議論をしているところを見ると ソシュール言語学を知らんな? 常のことだがここも厨房(含厨房社会人)が多いな
>>497 > 感謝の気持ちを表すために「うむ、ご苦労。」と言っているぞ。
へへー、御殿様。m(__)m
匿名で粋がるのは厨房。
おまいソシュール言いたいだけなんちゃうかと。
513 :
デフォルトの名無しさん :02/12/21 19:23
>>509 知っているだけじゃ話にならんが・・・
あんた日常的に使ってるの?
ソシューレ!
516 :
デフォルトの名無しさん :02/12/21 19:30
>自分の発した言葉に責任をもてない奴が増えてきてるな。 2ちゃんねるの馬鹿は特にそうですね。
./⌒ ヽ ( ヽ ヽ ノ ヽ ゞ、 丶 ヽ ノ \ _ _, ─' ─ ─ ,、 _ |\_ ノ\ ─=・=― ─=・=― /⌒\ 丶 / / ヽ-、___ ,-r' ヽ. │ \ 人 |/⌒ヽ | ! ヽ | ..| / \ / | | ! ! . ! | ( \ ヽ / / | ! ! . ! ..| ( | / ) | ! ! ...| ヽ \ ヾ 丿(( ̄)/ 'i `'ー--‐‐'´ ノ \ ヾ丿 ヽソ `''ヽ ヽ. ─'' ヽ ノ _ __/ ヽ __ノ:: 人__ |:::: 丶ー ̄ :: ::::::::::::::::: ̄ノ ̄ー-- ,,.__ \:::::::: ::::::::: ヾ ソ 丶 ヽ ヽ:::: ヽ/ :| \_| ::::::::: : | | :: ミ: :: ::...........:::::| . .|:::::: . ミ:::: ::::::::i :::::::::::::::| .|:::::: ヾ:::: ::::::::::::| :::::::::::| | ::::::: ミ: :::::::::::| :::::::::::| |:::::: ノ ヾ :::::::::| :::::::::::|
すまん。言い方が悪かった。 ようするに、ソシュール言語学を念頭において、 話をしているかということを俺は言いたい。
519 :
デフォルトの名無しさん :02/12/21 19:36
>>516 君もレスしているから、馬鹿の仲間入り!!
>>516 2ちゃんねるはそういう所だという噂が流布されてるですよ
シニフィアンとシニフィエの結合が一意であると考えるから このような水掛け論になるのだ とか言ってみる
522 :
デフォルトの名無しさん :02/12/21 20:18
馬鹿上等ヽ(´ー`)ノ
延 々 と ご 苦 労 ! !
名無し@沢村 の発言 > 基本的に本は読まないポリシーだが、 > ちなみにそれはどこの出版社から出ているのですか?著者は誰ですか?いくらですか? プログラマに向いてない今すぐやめろ。
>>525 言語仕様書を理解・暗記していると考えてみるテスト
当然RFC丸暗記
527 :
しろーと ぷろぐらまー :02/12/21 23:25
10進数の404を2進数に変換し(110010100)、9 ビットを右から7 ビット(0010100)を残します。これを無条件で、上位3 ビットを011 としてこれを10進数に変換するプログラムを作ってください。 お願いします m(__)m
>>527 質問の意味がよくわからないのだけど…こんなんでいいのかな?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(int argc, char * argv[]) {
int i, n = 404;
char * str;
str = malloc(10);
for (i = 0; i < 9; i ++) {
if (n & (int) pow(2, i)) {
* (str + 8 - i) = '1';
} else {
* (str + 8 - i) = '0';
}
}
* (str + 9) = 'エ0';
printf("%s\n", str);
str += 2;
printf("%s\n", str);
strncpy(str, "011", 3);
printf("%s\n", str);
n = 0;
for (i = 0; i < 7; i ++) if (* (str + 6 - i) == '1') n += (int) pow(2, i);
printf("%d\n", n);
free(str -= 2);
return 0;
}
訂正: * (str + 9) = 'エ0'; → * (str + 9) = '\0';
#include <stdio.h> int main() { int n = 404 ; int ans = ( 404 & 0x7F ); ans = ( ans | 0x30 ); printf( "%d\n" , ans ); return 0 ; } /* 上位3bitっていうのを、7bitの中の上位3bitと判断しました 8bit中なら 0x30の代わりに0x60を使ってください */
>>527 void Test3Func(UINT& ref){
_asm{
mov eax,ref
mov ebx,[eax]
or ebx,48
and ebx,63
mov [eax],ebx
}
}
>>496 お、入出力をファイルを開くように書き換えたようだね。
じゃあきっと gets() を fgets() に置き換えたでしょう。
gets()は入力の改行を読み捨てるが、fgets() だと改行はデータの一部になるよ。
だからきっと table[p].name の末尾に改行がついているよ。
末尾の改行を潰すには、例えば次のように書く。
char* p = table[p].name;
p[ strlen(p) ] = '\0'; // 改行かどうか調べずに、とにかく末尾を潰しちゃってる
idx は、(大き目のループの中で)あげた人の(calloc() とその下のループで作ったデータの
配列上の)位置、toIdx はもらった人(プレゼントのあて先の人)の位置。
C だと、tabl;e["dave"] のように名前(文字列)を添え字に使ってデータを読み書きすることは
できないので、ちょっと遠回りしているのだ。
下4bitに 48加えるのか? 下7bitに384加えるのか?
>>533 下7bitに384加えるのか?
(・ω・ )モニュ?
俺カーヨ
ans = ( ans | 0x30 ); はansと0x30の論理和
つまり
| 01
0 01
1 11
だから
0010110
論理和 0110000
で
0110110
になるんさね
ずれた・・・
鬱だ・・・
ついでに補足
>>528 さんは2進数に変換するのもプロセスの一部として捉えてらっしゃるみたいで
漏れは手抜き思考だから2進数に変えるのは考え方として捉えたのね
だから下位7bitを取り出すのに論理積を使って、
011を付加するのに論理和を使ってるの
>>530 >int n = 404 ;
>int ans = ( 404 & 0x7F );
nは何に使うのかと小一時間…(略)
ほんと。問題が意味不明だよなぁ。。 ふと思いついた解釈。 110010100 0010100 - 9 ビットを右から7 ビット残す 0110010100 - 上位3 ビットを011とする …一緒やん(w それじゃあんまりなんで、 /* 上位3bitっていうのを、7bitの中の上位3bitと判断しました */ #include <stdio.h> char* f(char *s) { int n = 0; while (*s) n = n * 10 + *s++ - '0'; n = n & 15 | 48; do { *--s = n % 10 + '0'; } while (n /= 10); return s; } main() { char s[] = "404"; puts(f(s)); return 0; }
>>536 鬱だ・・・
思わずfushianasan入れたくなるぐらい鬱だ・・・
>>535 >2進数に変換するのもプロセスの一部として捉えて
はい、そのとおりです。
「10進数の404を2進数に変換し…これを10進数に変換するプログラム」
となっているので「ちゃんと2進数にしましたよ」と主張するために
ところどころで printf() してます。
でもなんか論点ズレてる気が…。
実は
>>527 さんが10進数と2進数を異なるデータ型と勘違いしてたりするとイヤソな感じですw
541 :
しろーと ぷろぐらまー :02/12/22 02:36
すいません、上位3ビットというのは(0010100)→(0110100)ということです。
>>541 で、結局どれがあなたの求めるものに近い?
2進数に変換云々てのはただの考え方にすぎないの?
>>527 まだ居たのか…
はっきり言って意味が分からんのだが
>10進数の404
って言うのは、
char s[]="404";
なのか
int n=404;
の意味であるのか
>2進数に変換し
って言うのは
char s[]="110010100";
なのか
int n=0b110010100; /* 普通のCには無いが2進表現の定数 */
の意味であるのか
>10進数に変換する
の意味は…以下略…をはっきりせい
(やっと本人降臨か)
545 :
しろーと ぷろぐらまー :02/12/22 02:48
はじめの10進数はintです。結果の10進数もintです。途中経過はintでもchar s[]でもどちらでも良いんでお願いします。説明が下手ですいません。
>>545 >途中経過はintでもchar s[]でもどちらでも良いんで
それだと意味が分からんが・・・
表示する必要はないという解釈でよろしいですね?
結局ただのビット演算かヽ(;;´ー`)ノオレバカミタイー
>>545 int n=404;
n=(n&127)|48;/*変換終了*/
549 :
しろーと ぷろぐらまー :02/12/22 02:54
表示する必要はないんですが、プログラムを見たときに2進数で考えてるってのがわかるようにしたいのですが・・・。
>>548 527 しろーと ぷろぐらまー 02/12/21 23:25
548 デフォルトの名無しさん sage 02/12/22 02:53
3時間半かかって結論がそれかよw
鬱だ…(0110100)だったのね… int n=404; n=(n&63)|48;/*変換終了*/
552 :
デフォルトの名無しさん :02/12/22 02:56
>>549 >プログラムを見たときに2進数で考えてるってのがわかるように
大丈夫。
>>548 ので充分。
>>549 コメントにかいとけば?
int n=404;
/* 0x0000007Fと論理積を取り下位7ビットを取り出す*/
n &= 127;
/* 0x0000003Fと論理和を取る*/
n |= 48;
>>552 別にいらないと思うけど。それが何か?
括弧付けてる方がいい。
>>556 n=(a+b)-c;
あなたはこんな風にかいているの?
nは404限定なの?だったら case や if にしちまえば良いような気が。
>>557 あのねえ、、極論ぶちまけるんじゃないよ。
四則演算は義務教育で優先順位習うだろ。
>>557 あとn=(a+b)-c; は n=a+b-cと書くが、
n=someA+someB-otherCだったら
n=(someA+someB)-otherC と書くよ。
AとBの結びつきが強いことを明示的に示す場合ね。
ソースを読みやすく書くのは当たり前だろ?
562 :
デフォルトの名無しさん :02/12/22 03:23
宿題です。 絶対に破られないシリアルの作り方、教えてください。
>>562 すげぇ宿題だな。
無限の時間と無限の空間があればいつかは破られる気がする。
正直俺にはさっぱり分からん。
解答は
・不可能である
じゃダメ?
>>562 製造番号を破る?認証を(破壊的でない手段で)破るね
言いたいことは分からんでもないがもう少し具体的に
どのような性質のものか書いて
そのままだと個別の製造番号にユニーク(かつランダム)な
パスコードを付加する原始的でコストの大きい方法とかになるから
「絶対」ってのが凄いな 有限のビット長を鍵にしてる限り総当りで必ず解かれないか?
所詮0と1の羅列だしな。。。
567 :
しろーと ぷろぐらまー :02/12/22 03:46
実は課題を解くために、一つの例を作りたかったんです。 その例として404をあげました。でもわかりづらかったようなので、 出された課題について説明します。まず、いくつかの10進数(3桁)の整数を入力し、 縦に並べて表示させます。その整数をそれぞれ2進数(9桁)にします。 その2進数の下7桁を取ります。さらにこの7桁の2進数の上3桁を強制的に011にします。 できた7桁の2進数を10進数に変換して、 最初に縦に表示した10進数の横に対応させて表示させます。 私ははじめ、itoa関数を使ってこのプログラムを作ろうとしたんですが、 うまくいきませんでした。 なんとかほとんど素人の私にもわかるようなプログラムを作ってもらえないでしょうか。 お願いします。 以上のようなプログラムを作成したいのです。
569 :
しろーと ぷろぐらまー :02/12/22 03:49
>>567 >>527 の続きです。404の例は、
10進数(整数)の404を2進数(整数or文字)に変換し(110010100)、この9桁の右から7 桁(0010100)を残します。これの上位3 桁を011 として(0010100)→(0110100)これを10進数(整数)に変換します。
>>569 もう何と説明すれば良いのか分からんが
>10進数(整数)の404を2進数(整数or文字)に変換し(110010100)、
>この9桁の右から7 桁(0010100)を残します。
と言うのは、10進でも2進でも値は同じなので2進の下位7桁を残すには
n=n&127;/* 127は2進表現で…001111111 */
これの上位3桁を011とする為には
n=n&63;/* 63は2進表現で…000111111 */
n=n|48:/* 48は2進表現で…000110000 */
で↑の3つの式を合わせると
n=(n&63)|48;/* (n&127)&63==n&63 */
もしかして
>>569 は入力された値を
どうやって整数に変換するのかが分からなかったりして…
>>569 #include <stdio.h>
int main( void )
{
int data[ 256 ];
int rslt[ 256 ];
int cnt = 0 ;
int i ;
while( 1 )
{
scanf( "%d" , &data[ cnt ] );
if( data[ cnt ] >= 1000 )
break ;
cnt ++ ;
}
cnt -- ;
for( i = 0 ; i < cnt ; i ++ )
{
rslt[ i ] = ( data[ i ] & 0x7f ) | 0x30 ;
printf( "%d\t%d\n" , data[ i ] , rslt[ i ] );
}
return 0 ;
}
みんなー、ちゃんと でインデントしてくれよー
577 :
デフォルトの名無しさん :02/12/22 05:07
データをファイルに書き込むときに、 fprintf(out, "%s %d\n", str, number); とすると、%sの後に勝手に改行(\n)が入ってくるのは何故? fprintf(out, "%s %d\n", str, number); ↓↓↓↓ str number となって出てくるのを、 str number にするにはどうすればいいんでしょうか?
>>577 strの終端文字の前に改行が入ってるから
次のコードをfprintf()の前に書いて改行を消せばOK
i=strlen(str);
if(str[i]=='\n')str[i]='\0';
winなら
i=strlen(str);
if(i>1&&str[i]=='\n'&&str[i-1]=='\r')str[i-1]='\0';
579 :
デフォルトの名無しさん :02/12/22 06:41
あなたは合計X円をY人に等分しようとしています。 Y等分されたお金は整数じゃなければなりません。 XがYで割りけれなければ、XをYで割った余りはあなたのお金として残ります。 という、アルゴリズムが分かる方いませんでしょうか? C/C++でお願います。
自分で解けました。
( ゚Д゚)ポカーン とりあえずおめで㌧
582 :
デフォルトの名無しさん :02/12/22 08:10
'char' から 'const char *' に変換するにはどうやったらいいのでしょうか?教えてください。
char c = 'A'; char s[2] = { c, '\0' }; const char *cs = s;
584 :
デフォルトの名無しさん :02/12/22 08:19
ありがとー!!さんきゅーです
585 :
bloom :02/12/22 08:44
ここって、厨房ばっかりでほんっと つかえない
590 :
デフォルトの名無しさん :02/12/22 13:11
宿題です。 ヒット&ブローを "効率よく" 解くプログラムを 教えてください。
591 :
デフォルトの名無しさん :02/12/22 14:37
>>567 課題の意味がわからず、とりあえずテキトウに作成・・・
#include <stdio.h>
void printbit(int bit){
for(int i = 8; i >= 0; i--)
printf("%d", (bit >> i) & 1);
putchar('\n');
}
int main(void){
int data;
printf("3桁の数字を入力:");
scanf("%d", &data);
int data_1 = data % 10;
int data_2 = (data % 100) / 10;
int data_3 = data / 100;
puts("--------計算前--------");
printf("3桁目:%3d:%3d:", data_3, data_3*100);
printbit(data_3*100);
printf("2桁目:%3d:%3d:", data_2, data_2*10);
printbit(data_2*10);
printf("1桁目:%3d:%3d:", data_1, data_1);
printbit(data_1);
puts("--------計算後--------");
printf("3桁目:%3d:%3d:", data_3, (data_3 * 100 & 127 | 48) & 63);
printbit((data_3 * 100 & 127 | 48) & 63);
printf("2桁目:%3d:%3d:", data_2, (data_2 * 10 & 127 | 48) & 63);
printbit((data_2 * 10 & 127 | 48) & 63);
printf("1桁目:%3d:%3d:", data_1, (data_1 & 127 | 48) & 63);
printbit((data_1 & 127 | 48) & 63);
return 0;
}
>>589 ゴメン、その通りだ
最初はmalloc使ってたんだけど、配列で書き直した
そのときの名残だと
>>590 "効率よく"ってなに?
短い時間で解けること?
メモリ消費量の少なさ?
行数の短さ?
それともひねったところで可読性をよくして再利用可能にする?
また、その基準は?
オーダはどのくらい?
> メモリ消費量の少なさ? > 行数の短さ? > それともひねったところで可読性をよくして再利用可能にする? この辺だったら、何も考えずに総当りだな(w
595 :
デフォルトの名無しさん :02/12/22 15:25
2つの整数(a, b)が与えられて、その2つの整数の間にある素数でかつ回文 (逆さに読んでも同じ)となっている数のリストを作るプログラムをお願いします。 例:5 500 ↓↓ 5 7 11 101 131 151 181 191 313 353 373 383 ただし、(5 <= a < b <= 100,000,000)とする。 a, bも素数&&回文ならばそのリストに入る。
597 :
デフォルトの名無しさん :02/12/22 15:58
初めて投稿させて頂きます。厨な質問で恐縮ですが、以下のエラーの意味がわかりません Server.cc:108: declaration of `void Server::ReadyData(const OReadyEvent&)' outside of class is not definition どうか宜しくお願いします。
>>597 Server.ccの108行目には何が書いてあるの?
599 :
デフォルトの名無しさん :02/12/22 16:19
>>598 わざわざレスして頂きありがとうございます。108行目はこのようになっております。
Server::ReadyData(const OReadyEvent& event);
ヘッダの方で宣言はしているのですが…
>>597 うにゅ
和訳するとさ、クラスの外部の定義は無効だ、ってことでしょ?
ヘッダの中も見てさ、関数の型宣言と引数がServer.ccの108行目と一致してるか確認
つかさ、これ型名抜けてるけどいいの?
>>595 の出した問題と
>>596 の持ってきたのは内容が微妙に違うんだけど
どっちが当ってんの?
>>595 の仕様でコード書いてしまったけど.....
603 :
デフォルトの名無しさん :02/12/22 16:35
>>600 レスありがとうございます。確認したところヘッダと198行目の内容は一致しておりました。
型名抜けてるとはどういう意味でしょうか?浅学の為申し訳ございません
>うにゅ キモ
>>603 申し訳ないと思ったらもうちょっと勉強してください。
せめて、質疑に支障のない程度の知識は…
>>593 "効率よく" とは、勿論、正解を求めるまでに
トライする回数が(平均で)少ない事です。
>>603 つーかあれだよ
なんでクラス外部で
Server::ReadyData(const OReadyEvent& event);
かいてるんだよっつー
これじゃプロトタイプ宣言じゃねーか
実体なら
Server::ReadyData(const OReadyEvent& event)
{
/* 処理 */
}
>>609 こういうことなのだろうか?
Server::ReadyData(const OReadyEvent& event);←
{
/* 処理 */
}
>>602 返事遅れてすみませんでした。
書いて頂いたプログラムを載せて頂けますか?
>>607 それはプログラムと関係ない
・・・事もないが、どちらかというと関係は薄い
Hit&Blowの攻略法とかをぐぐった方が"効率よく"答えにたどり着けると思う
>>610 俺はそう思ったんだが
ヘッダからのコピーの時にミスったとか
>>611 宿題のソース載せる掲示板ってどこにあったけ?
ここに載せるのは(別の話題が始まってるので)申し分けないので、捜してきてくらはい。
>>609 >>610 =613
ご親切にありがとうございます!ヘッダからコピペしてたもので気づきませんでした。
しかし今度は以下のエラーが出ました…
EchoServer.cc: In member function `void EchoServer::ReadyData(const
OReadyEvent&)':
自分でも厨であることは自覚しておりますので、これから勉強を重ねエラーを直したい
と思っております…
>>612 質問しといて
こんな事言うのもなんですが、
どうしてプログラムと「関係が薄い」んですか?
>>617 実装以前のアルゴリズムの話だからとかじゃないの?
どっちにしろ、自分で考えた形跡の全くない奴がごちゃごちゃ抜かす権利はない。
へこへこしながら神が答え書いてくれるの待ってろ。
>>616 申し訳ございません。間違えました。
後のエラーは中身が間違ってるという事なので、見直してみます。
621 :
デフォルトの名無しさん :02/12/22 17:26
ax+by+cz=0 a'x+b'y+c'z=d x^2+y^2+z^2=d' このような連立方程式(2次が入ってる)をc言語で解く場合 どうすればよいでしょうか?
パソコンは何でもできる箱でしょうか
>>618 それが世に言う「コーダとSEの違い」って奴ですか?
とりあえず「神」とやらが出現するのを
首を長くして待っています。
>>621 ' ←の記号の意味は?
微分?
>>622 全然C/C++じゃないけど
何も出来ない魔法の箱
>>623 >「コーダとSEの違い」
違う
ヘボコードで良かったら書いてやる
しばらく待ってろ
>>624 a'の意味はaと区別するためだけにつけたものです。
任意の値です。
>>623 眠い
取りあえず寝る
ろくにコーディングできる体力も残ってないので、
とりあえず考え方だけ書く
i回目の試行のHit+Blowをn(i)として
試行回数
Σn(i)
i=1
が4になるように求めてから組み合わせ問題
>>627 ax + by + cz = 0
dx + ey + fz = g
x^2 + y^2 + z^2 = h
って事か。
とすると
ax+by+cz=0
-(a/d)(dx+ey+fz=g)
で
(b-ae/d)y+(c-af/d)z=-ag/d
y=(-ag/d -(c-af/d)z)/(b-ae/d)
疲れた。
まあこの調子で式変形すれ。
632 :
デフォルトの名無しさん :02/12/22 21:06
>>627 >>629 とはちょっと違う攻め方かもしれないけど,
3式を上から1, 2, 3式と呼ぶことにして,
1式, 2式はともに平面の方程式, で, しかも平面1は原点を含む.
3式は原点を中心とする球の方程式.
1式と2式を連立すると, 直線の方程式が出る筈(平面1と平面2が平行で交わらないとかいう場合は除いて).
1式と3式を連立すると, 原点を中心とする円の式になる.
つまりこの問題は, 平面1上に落とし込むことで, 円と直線の交点を求める問題に帰着するです.
ここまで私がやらせてもらいました. ありがとん.
633 :
デフォルトの名無しさん :02/12/22 21:57
引数の文字で1番目の’/’を”年”に、2番目の’/’を”月”、最後に”日”を付けたいんですが、 例2002/12/22 →2002年12月22日 結果をpsResultにセットしたいんですがうまくいきません。 御教授おねがいします。 #include <stdio.h> #include <string.h> int ReptString2(char *psString,char *psResult){ int count=0; char nen[]="年"; char tuki[]="月"; char niti[]="日";
634 :
デフォルトの名無しさん :02/12/22 21:59
while(*psString){ if(*psString=='/'){ switch(count){ case 0: strncpy(psResult,nen,2); psResult++; count=1; break; case 1: strncpy(psResult,tuki,2); psResult++; count=2; break; default: *psResult=*psString; psResult++; psString++; break; } }else{ *psResult=*psString; psString++; psResult++; } } strncpy(psResult,niti,2); psResult++; *psResult='\0'; return(count); }
ここまでやったんですが、”年、月、日”をpsResultにうまくセットできません。 御教授お願いします。
>>634 年、日は2バイトだから++じゃ足りないのでは?
Result+=2にしてもだめでした
>>638 後、終端のNULLの処理が全くなされていない。
*psResult='\0'; ではだめなんでしょうか?
641 :
デフォルトの名無しさん :02/12/22 22:30
>>633 case 0・1の中にpsString++がない。
case0・1とnitiをstrncpyした後の
psResult++をpsResult+=2に変更。
psString++;は if文の外に出さなきゃダメだろ… スラッシュだった場合どういう処理をされるか考えてみな。
#include <stdio.h> #include <string.h> int ReptString2(char *psString,char *psResult){ int count=0; char nen[]="年"; char tuki[]="月"; char niti[]="日"; while(*psString){ if(*psString=='/'){ switch(count){ case 0: strncpy(psResult,nen,2); psResult+=2; psString++; count=1; break; case 1: strncpy(psResult,tuki,2); psResult+=2; psString++; count=2; break; default: *psResult=*psString; psResult++; psString++; break; } }else{ *psResult=*psString; psString++; psResult++; } } strncpy(psResult,niti,2); psResult+=2; *psResult='\0'; return(count); }
>>633 すまん。言い方を変える・・・
case0とcase1の中にpsString++を加える。
case0とcase1の中のpsResult++と、
nitiをstrncpyした後のpsResult++を、
psResult+=2に変更する。
その他は変更しなくて良い。
ここまで改良したんですが、うまくいきません。 御教授おねがいします。 #include <stdio.h> #include <string.h> int ReptString2(char *psString,char *psResult){ int count=0; char nen[]="年"; char tuki[]="月"; char niti[]="日"; while(*psString){ if(*psString=='/'){
646 :
デフォルトの名無しさん :02/12/22 22:40
switch(count){ case 0: strncpy(psResult,nen,2); psResult+=2; psString++; count=1; break; case 1: strncpy(psResult,tuki,2); psResult+=2; psString++; count=2; break; default: *psResult=*psString; psResult++; psString++; break; } }else{ *psResult=*psString; psString++; psResult++; } } strncpy(psResult,niti,2); psResult+=2; *psResult='\0'; return(count); } int main(){ char *psString,*psResult; int i; scanf("%s",psString); i=ReptString2(psString,psResult); printf("%s\n",psResult); printf("%d\n",i); return 0; }
>>644 やってみたんですが、だめです。
ぱそがフリーズします。
648 :
デフォルトの名無しさん :02/12/22 22:43
>>645 日付を格納する領域を確保しないと・・・
Resultで領域確保にはならないんでしょうか?
650 :
デフォルトの名無しさん :02/12/22 22:46
>>645 int main()
{
char psString[256], psResult[256];
以下変更無し
}
>>645 アホか。
psStringをmallocでメモリ確保するなり配列として宣言するなりしないとエラー起こすのは当然だ。
652 :
デフォルトの名無しさん :02/12/22 22:46
>>633 int ReptString2( char *psString, char *psResult)
{
int y, m, d;
sscanf( psString, "%d/%d/%d", &y, &m, &d);
sprintf( psResult, "%d年%d月%d日", y, m, d);
return 0;
}
これじゃあかんの?エラー時の戻り値とかは考えてないけど.
おぉー 解決しました。 みなさんありがとうございます。m(_ _)m 一番の元凶は int main() { char psString[256], psResult[256]; 以下変更無し } ↑これでした。 どうもお騒がせしました!!!
654 :
デフォルトの名無しさん :02/12/22 23:07
さっきのものですが、続けて質問があります psStringをyyyy/mm/ddの形にしたいです。 ただし、psStringは数字のみです。 例20021222 → 2002/12/22 御教授お願いします。 int RepYearMonthDay(char *psString,char *psResult){ int i; int flag=0; int count=0; while(*psString != '\0'){ if(*psString < '0' || *psString > '9'){ flag=-1; break; } psString++; count++; } if(count != 8) flag=-1;
655 :
デフォルトの名無しさん :02/12/22 23:08
if(count==8 && (flag != -1)){ flag=1; for(i=0;i<4;i++){ *psResult=*psString; psString++; psResult++; } *psResult='/'; psResult++; for(i=4;i<6;i++){ *psResult=*psString; psString++; psResult++; } *psResult='/'; psResult++; for(i=6;i<8;i++){ *psResult=*psString; psString++; psResult++; } *psResult='\0';
656 :
デフォルトの名無しさん :02/12/22 23:08
}else{ while(*psString == '\0'){ *psResult=*psString; psString++; psResult++; } } return(flag); }
657 :
デフォルトの名無しさん :02/12/22 23:09
ここまで分かったんですが、うまくいきません。 よろしくおねがいします
どう上手くいかないのか説明できませんか。
659 :
デフォルトの名無しさん :02/12/22 23:14
上の関数をこれで表示させてみたんですが、うまく表示できないです。 メモリがおかしくなってるのかもしれません。 int main(){ char psString[256],psResult[256]; int i; scanf("%s",psString); i=RepYearMonthDay(psString,psResult); printf("%s\n",psResult); printf("%d\n",i); return 0; }
最初のwhileでpsStringの値を変えちゃダメだろ。 char *tmp = psString; とかやって、tmpを使うべき。
ループなどの前後で値がどうなっているべきかチェックするようにしましょう。
>>654 sscanf(str, "%4d%2d%2d", &y, &m, &d);
sprintf(dest, "%d/%d/%d", y, m, d);
こんな感じでどうよ。
エラーチェックとかはそっちでつけてね
663 :
デフォルトの名無しさん :02/12/22 23:26
#include <stdio.h> #include <string.h> int RepYearMonthDay(char *psString,char *psResult){ int i; int flag=0; int count=0; char *tmp = psString; while(*tmp != '\0'){ if(*tmp < '0' || *tmp > '9'){ flag=-1; break;
664 :
デフォルトの名無しさん :02/12/22 23:26
} tmp++; count++; } if(count != 8) flag=-1; if(count==8 && (flag != -1)){ flag=1; for(i=0;i<4;i++){ *psResult=*psString; psString++; psResult++; } *psResult='/'; psResult++; for(i=4;i<6;i++){ *psResult=*psString; psString++; psResult++; }
665 :
デフォルトの名無しさん :02/12/22 23:27
*psResult='/'; psResult++; for(i=6;i<8;i++){ *psResult=*psString; psString++; psResult++; } *psResult='\0'; }else{ while(*psString){ *psResult=*psString; psString++; psResult++; } } return(flag); } int main(){ char psString[256],psResult[256]; int i; scanf("%s",psString); i=RepYearMonthDay(psString,psResult); printf("%s\n",psResult); printf("%d\n",i); return 0; }
666 :
デフォルトの名無しさん :02/12/22 23:29
上のように変更したところ 20021222を2002/12/22 とうまく置換できるんですが、 20021222yyyのように数字8文字でない場合は 20021222yyyとそのまま表示したいです。 その後半部分がうまくいきません。 psResultに変な値がまぎれてしまってるみたいです。 御教授おねがいします。
だから 変 な 値 っ て な ん だ よ わざとややこしくしてないか?
668 :
デフォルトの名無しさん :02/12/22 23:34
>>667 つーか、コードを解析すればある程度わかるような・・・
670 :
デフォルトの名無しさん :02/12/22 23:36
変な値とか言い出すとね・・ たとえば41923375が4192/33/75になっていいのかな?とか psStringがNULL終端されていなかったらどうするとか
671 :
デフォルトの名無しさん :02/12/22 23:37
>
>>666 の要望は結構本格的じゃねーか?
入力された文字列がYYYYMMDDかどうかを判定しろ, と.
閏年は考慮するのか?
672 :
デフォルトの名無しさん :02/12/22 23:39
本格的………
673 :
デフォルトの名無しさん :02/12/22 23:39
例を出すと 2222と入力すると 2222フフフフフフフフフフフフフフフフフ2222 とあいだに半角の”フ”が入ります。 これがなぜなのかわかりません。 よろしくおねがいします
674 :
デフォルトの名無しさん :02/12/22 23:40
>>666 関数の最初にstrlenか何かで、字数を取得して
判定するっていうのは?
675 :
デフォルトの名無しさん :02/12/22 23:41
ま た フ か
追加しますと2222などと数字8文字でない場合は 2222とそのまま表示したいです。
とりあえず出来てるんなら、コード晒したほうが速いよ。
#include <stdio.h> #include <string.h> int RepYearMonthDay(char *psString,char *psResult){ int i; int flag=0; int count=0; char *tmp = psString; while(*tmp != '\0'){ if(*tmp < '0' || *tmp > '9'){ flag=-1; break; } tmp++; count++; } if(count != 8) flag=-1;
680 :
デフォルトの名無しさん :02/12/22 23:51
>>674 >665のレスの、
}else{
while(*psString){
*psResult=*psString;
psString++;
psResult++;
}
}
を、
}else{
while(*psString){
*psResult=*psString;
psString++;
psResult++;
}
*psResult = '\0'
}
に変更。(*psResult = '\0'を付け加える)
if(count==8 && (flag != -1)){ flag=1; for(i=0;i<4;i++){ *psResult=*psString; psString++; psResult++; } *psResult='/'; psResult++; for(i=4;i<6;i++){ *psResult=*psString; psString++; psResult++; } *psResult='/'; psResult++; for(i=6;i<8;i++){
*psResult=*psString; psString++; psResult++; } *psResult='\0'; }else{ while(*psString){ *psResult=*psString; psString++; psResult++; } } return(flag); } int main(){ char psString[256],psResult[256]; int i; scanf("%s",psString); i=RepYearMonthDay(psString,psResult); printf("%s\n",psResult); printf("%d\n",i); return 0; }
コードです。
>>678 さん かなりおもしろいです(笑
インデント用の半角スペースは って書こうよ~ VC++は範囲選択→Alt+F8で整形されるからいいけど…
685 :
デフォルトの名無しさん :02/12/22 23:56
>>674 674さんが載せたプログラムの間にレスが載ったので分かりにくいが、
680の方法を試してくれ。
>>680 さん ありがとうございます
解決しました。
なるほど、終端NULLがぬけてました。
またまたお騒がせして申し訳ないです。
皆さんありがとうございました。
687 :
668・680 :02/12/22 23:58
>>684 うちのブラウザは →(スペース)変換してくれないからダメ。
689 :
デフォルトの名無しさん :02/12/23 00:08
みなさん すべて終わりました。 長々とありがとうございました
690 :
デフォルトの名無しさん :02/12/23 00:09
#include<stdio.h> #include<stdlib.h> int main(){ char psString[256],psResult[256]; long i ; int y, m, d; scanf("%s",psString); i = atol(psString); if( strlen(psString)==8 && i>=10000000L ){ y = i/10000; d = i % 100; m = (i % 10000)/100; printf("%d/%.2d/%.2d\n", y, m, d); }else{ printf("%s\n", psString); } } /*たったこれだけで収まるわけだが...*/
691 :
デフォルトの名無しさん :02/12/23 00:11
vc++6.0で行列の計算のプログラムを書きました。 /****************matrix.h*********************/ #ifndef GUARD_matrix_h #define GUARD_matrix_h #include <vector> using std::vector; #include <iostream> using std::cout; using std::endl; class Matrix{ Matrix(); public: typedef vector<double> d_vec; vector<d_vec> components; int row_size; int file_size; Matrix(int, int); friend const Matrix operator + (const Matrix&, const Matrix&); friend const Matrix operator - (const Matrix&, const Matrix&); friend const Matrix operator * (const Matrix&, double); friend const Matrix operator * (double, const Matrix&); friend const Matrix operator * (const Matrix&, const Matrix&); }; #endif /****************EOF*********************/ 続く
#include <iostream> using std::cout; using std::endl; #include <vector> using std::vector; #include <cstdlib> #include "matrix.h" Matrix::Matrix(int a, int b) { if(a < 1 || b < 1) { cout << "行列のサイズは自然数で入力して下さい" << endl; exit(1); } else { vector<double> width; for(int i = 0; i < a; ++i) { width.push_back(0); } for(int j = 0; j < a; ++j) { components.push_back(width); for(int k = 0; k < b; ++k) { components[j].push_back(0); }}}}} 続く
書くの忘れましたが、694の頭からmatrix.cppです。 const Matrix operator + (const Matrix & a, const Matrix& b) { int rs = a.row_size; int fs = a.file_size; if(rs == b.row_size && fs == b.file_size) { Matrix ret(rs, fs); for(int i = 0; i < rs; ++i) { for(int j = 0; j < fs; ++j) { ret.components[i][j] = a.components[i][j] + b.components[i][j]; } } return ret; } else { cout << "2項演算子+の両オペランドのサイズが違います。" << endl; exit(1); } }続く
operator - は + と同じなので割愛します。 const Matrix operator * (const Matrix& a, double b) { int rs = a.row_size; int fs = a.file_size; Matrix ret(rs, fs); for(int i = 0; i < rs; ++i) { for(int j = 0; j < fs; ++j) { ret.components[i][j] = a.components[i][j] * b; } } return ret; } const Matrix operator * (double a, const Matrix& b) { int rs = b.row_size; int fs = b.file_size; Matrix ret(rs, fs); for(int i = 0; i < rs; ++i) { for(int j = 0; j < fs; ++j) { ret.components[i][j] = a * b.components[i][j]; } } return ret; }//続く
const Matrix operator * (const Matrix& a, const Matrix& b) { int afs = a.file_size; if(afs != b.row_size) { cout << "二項演算子*の左オペランドの列数と右オペランドの行数が違います。" << endl; exit(1); } else { int ars = a.row_size; int bfs = b.file_size; Matrix ret(ars, bfs); for(int i = 0; i < ars; ++i) { for(int j = 0; j < bfs; ++j) { double sum = 0; for(int k = 0; k < afs; ++k) { sum += a.components[i][k] * b.components[k][j]; } ret.components[i][j] = sum; } } return ret; } }//続く
//test program int main() { int m = 5; int n = 8; Matrix mt(m, n); for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) mt.components[i][j] = (i + 1) * 10 + j + 1; Matrix mt1(mt);//コピーコンストラクタのテスト Matrix mt2(m, n); mt2 = mt;//代入演算子のテスト //mt1 = mt * 2;//他の演算子もうまくいきません for(int ii = 0; ii < m; ++ii) { cout << endl; for(int jj = 0; jj < n; ++jj) { cout << mt1.components[ii][jj] << " "; } } return 0; } /**********************EOF(matrix.cpp)***********************/ で、オーバーロードした演算子を試すと、コンストラクタの エラーが発生します。私のコードを手直しもしくはほぼ同じ インターフェイスを持つ行列演算のコードを書いて頂けない でしょうか?質問すれではないので恐縮ですが、もしよろしければ 私のコードについて何かアドバイスなど頂けたらと思います。
>>699 std::exitをexitに置換したら動きました。ありがとうございました!
701 :
デフォルトの名無しさん :02/12/23 18:25
↓の様な内容のテキストファイルのデータを deita.txt 1(Tab間隔)2 300 0 0 2 3 0 0.001 0 3 4 0 0.001 0 4 5 0 0.001 0 5 6 0 0.001 0 6 7 0 0.001 0 1 0 0 0 0 2 0 0 0 0.0000005 3 0 0 0 0.000001 4 0 0 0 0.000001 5 0 0 0 0.000001 6 0 0 0 0.000001 7 0 300 0 0.000001 取り込んで 番号付けて並べ替えるプログラムを作りたいんですが 一番右の番号順に データを並べ替えるにはどうしたらいいでしょうか?
#include<stdio.h> #defineN20 voidamatprt(int a[][N],int m,int n,int k,char tag[]) {inti,j,l; if(k==0) l=0;else l=1; printf("\n %s\n ",tag); for(j=0;j<n;j++) printf("%4d",j);printf("\n"); for(i=l;i<=m;i++) { printf("%3d",i); for(j=0;j<n;j++) printf("%4d",a[i][j]); printf("\n"); } if(k<0) { i=0; printf("%3d",i); for(j=0;j<n;j++) printf("%4d",a[i][j]); printf("\n"); } } voidbubble(int p[],int n) {inti,j,k,m; m=n-1; for(i=0;i<m;i++) for(j=m;j>i;j--) if(p[i]>p[j]) { k=p[i];p[i]=p[j];p[j]=k;
} } voidmain() {inti,j,k,n,nn; static intp[N],itoj[N][2],a[N][N]; static doubler[N],el[N],c[N]; charfname[]="deita.txt"; FILE*fp; if((fp=fopen(fname,"r"))==0) { printf("\n Input file %s not found.",fname); return; } n=0; fscanf(fp,"%d",&i); do { itoj[n][0]=i; fscanf(fp,"%d",&i); itoj[n][1]=i; fscanf(fp,"%le",&r[n]); fscanf(fp,"%le",&el[n]); fscanf(fp,"%le",&c[n]); n++; fscanf(fp,"%d",&i); } while(feof(fp)==0); fclose(fp);
printf("\n Input data.\n"); for(i=0;i<n;i++) { printf("%5d",i); for(j=0;j<2;j++) printf("%5d",itoj[i][j]); printf("%15.5le",r[i]); printf("%15.5le",el[i]); printf("%15.5le\n",c[i]); } k=0; for(i=0;i<n;i++) if(c[i]!=0.0) { p[i]=k;k++; } for(i=0;i<n;i++) if(c[i]==0.0) { p[i]=k;k++; } printf("\n Input data.\n"); for(i=0;i<n;i++) { printf("%5d",i); for(j=0;j<2;j++) printf("%5d",itoj[i][j]); printf("%15.5le",r[i]); printf("%15.5le",el[i]); printf("%15.5le",c[i]);printf("%5d",p[i]); printf("\n"); }
bubble(p,n); printf("\n Input data.\n"); for(i=0;i<n;i++) { printf("%5d",i); for(j=0;j<2;j++) printf("%5d",itoj[i][j]); printf("%15.5le",r[i]); printf("%15.5le",el[i]); printf("%15.5le",c[i]);printf("%5d",p[i]); printf("\n"); } }
706 :
デフォルトの名無しさん :02/12/23 18:33
void main => int main
double x,y,z; y=((a*f/d-i)*z-a*g/d)/(b-a*e/d); x=((d*f/e-i)*z-g*d/e)/(a-b*d/e); z=(h*h-x*x-y*y); このように式変形しました。 このまま記述したら当然1式目のzに値が入ってないので エラーが出るけど、どう記述したらいいんでしょう? 1,2式を3式に代入して、zに関する2次方程式を作るまで 手計算でやらんとだめですか?
710 :
デフォルトの名無しさん :02/12/23 19:56
>>701 こんなんでました。
#include <stdio.h>
typedef struct{
int index, number1, number2;
double number3, number4;
}Data;
int main(void){
FILE* fp = fopen("deita.txt", "r");
int count = 0;
Data data[256];
while(fscanf(fp, "%d %d %d %lf %lf",&data[count].index,
&data[count].number1,&data[count].number2,
&data[count].number3,&data[count].number4) != EOF)
count++;
fclose(fp);
for(int i = 0; i < count; i++)
for(int j = i+1; j < count; j++)
if(data[j].index < data[i].index){
Data temp = data[i];
data[i] = data[j];
data[j] = temp;
}
for(i = 0; i < count; i++)
printf("%3d %3d %3d %f %.7f\n", data[i].index,
data[i].number1, data[i].number2,
data[i].number3, data[i].number4);
return 0;
}
711 :
デフォルトの名無しさん :02/12/23 21:30
生鮮食品等製品寿命の短い製品の仕入れ量 Q:仕入れ量 D:需要量 Q>Dならば、売れ残りが発生し、廃棄 Q<Dならば、品切れが発生し、信用失墜 Q=Dならば、利益のみ 最適な仕入れ量は?
>>711 そりゃ最適な仕入れ量はDに決まってるじゃねーか
>>707 相変わらず沢村並みに内容がないな
氏ねbogus
715 :
クラッシュしてしまいます :02/12/23 22:55
void alphhist(FILE *fin){ int i, c; int alph[52]; for (i = 0; i < 52; i++)alph[i] = 0; while ((c = fgetc(fin)) != EOF){ if (c >= 'A' && c <= 'Z') ++alph[c - 'A']; else if (c >= 'a' && c <= 'z') ++alph[c - 'a' + 26];} for (c = 'A'; c <= 'Z'; c++){ fprintf(stdout, "%s: ", c); for (i = 0; i < alph[c - 'A']; i++)fputc('*', stdout); fputc('\n', stdout);} for (c = 'a'; c <= 'z'; c++){fprintf(stdout, "%s: ", c); for (i = 0; i <= alph[c - 'a' + 26]; i++)fputc('*', stdout); fputc('\n', stdout);}}
あー回答者は別に良いにしても、 質問者はせめてインデントぐらいつけようよ、とか思った
>>716 ここに質問に来る香具師にインデントのタグ使えって?
そいつはチンパンジーに因数分解しろってのに近いぜ
719 :
デフォルトの名無しさん :02/12/23 23:38
>>715 718さんが指摘した部分と、
下から2行目の、
for(i = 0; i <= alph[c-'a'+26]; i++)を
for(i = 0; i < alph[c-'a'+26]; i++)に変更(条件の部分)
>>717 インデントのタグって何だ?お前チンパンジーか?
721 :
デフォルトの名無しさん :02/12/24 01:05
かなり初心者です。以下のソースにある。 c = getchar();についてなのですが、 なぜこれは必要なんですか。 一様、c = getchar(); がないと永久に 入力された文字が出るのはわかります。 しかし、それはなぜですか? #include <stdio.h> main() { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); } } よろしくお願いします。
二つ目のc = getchar();についてです。
>>721 それが無かったら同じ文字しか表示されないから
K&Rの2-8の問題、 「整数xの値を右にnビット回転する関数rightrot(x,n)を書け」 という問題が分かりません。 int rightrot (int x , int n) { return (x >> n) + ( (x & ~(~0 << n) ) << ? ) } この「?」に部分に何を書けばいいかが… どうかご教授願います。
sizeof(int) * 8 - n かな?
sizeof(int)*CHAR_BIT - n
>>725 ,726
出来ました。ありがとうございます。
>>724 K&Rとかやる気だったら、ちゃんとなぜそうなったのかの意味も考えた方がいいよ
>>699 重ねてお礼を申し上げます。
読み返すと、とても勉強になります。
730 :
デフォルトの名無しさん :02/12/24 12:12
以下の関数は,無向グラフで最短経路を求めるためのものである. (枝長も与えられるとする) main関数その他必要な修正を加えて,1番の節点から他の節点 への最短経路をわかり易く表示させるようにし,プログラムの 動きを解説せよ.グラフは隣接行列表現とする. という問題です。よろしくお願いします。
/*プログラム*/ #include <stdio.h> #include <stdlib.h> #define MAXVSIZE 256 #define INTDIGIT 4 #define ON 1 #define OFF 0 typedef char *String ; int Unseen = -10000 ; int Graph[ MAXVSIZE ][ MAXVSIZE ] ; int Dis[ MAXVSIZE ], Dad[ MAXVSIZE ] ; int NodeLabel[ MAXVSIZE ] ; int NodeNum ;
/**************************************/ FILE *file_Access(char *fname,char *mode) { FILE *f; if ((f = fopen(fname,mode)) == NULL) { fprintf(stderr,"can't open file "); fprintf(stderr,fname); fprintf(stderr,"\n"); exit(0); } return f; }
/* **************************** */ /* Get Matrix (グラフの隣接行列表現)*/ /* **************************** */ int GetMatrix(String MatFileName) { FILE *MatFile ; int i ; int ColumnLine[ MAXVSIZE ] ; int RowNum, ColNum, LabelNum ; int ElementSeparate( FILE *, int *) ; MatFile = file_Access( MatFileName,"r") ; LabelNum = ElementSeparate( MatFile, NodeLabel) ; ColNum = 1 ; while( ( RowNum = ElementSeparate( MatFile, ColumnLine ) ) > 0 ) { if( LabelNum != RowNum ) { fprintf(stderr,"Fail to read the Matrix in Column %d LabelNum %d != DocNum %d \n", ColNum, LabelNum, RowNum) ; exit(-1) ; } for( i = 1 ; i < RowNum ; i++ ) { Graph[ ColNum ][i]= ColumnLine[i] ; } ColNum++ ; } fclose( MatFile ) ; NodeNum = LabelNum ; }
int ElementSeparate( FILE *InFile, int *List ) { char Store ,c; char IntString[INTDIGIT] ; int LabelNum ,i,j; LabelNum = 1 ; Store = OFF ; j = 0 ; c = fgetc( InFile ) ; if ( c == EOF ) return 0 ; do { if ( !Store && !(isdigit(c)) ) continue ; else if ( Store && !(isdigit(c)) ) { Store = OFF ; IntString[j] = '\0' ; List[LabelNum] = atoi( IntString ) ; if(ON) printf(" List[%d] %d", LabelNum, List[LabelNum] ) ; LabelNum++ ; } else if (Store) { IntString[j++] = c ; } else { Store = ON ;j = 0 ; IntString[j++] = c ; } } while( ( c = fgetc( InFile ) ) != '\n') ; if(ON) printf("\n" ); return LabelNum ; }
void search() { int k, t, min = 0 ; for( k = 1 ; k < NodeNum; k++) { Dis[k] = Unseen ; Dad[k] = 0 ; if(ON) printf("Dis[%d] %d\n", k, Dis[k] ) ; } Dis[0] = Unseen - 1 ; for ( k = 1 ; k != 0 ; k = min, min = 0 ) { Dis[k] = -(Dis[k]) ; if ( Dis[k] == -Unseen ) Dis[k] = 0 ; if(ON) printf("min %d Dis[%d] %d\n", min, k, Dis[k] ) ; for ( t = 1; t < NodeNum ; t ++ ) { if ( Dis[t] < 0 ) { if(ON) printf(" Dis[%d] %d", t, Dis[t] ) ; if ( Graph[k][t] && ( Dis[t] < -( Dis[k] + Graph[k][t]) ) ) { Dis[t] = -( Dis[k] + Graph[k][t]) ; Dad[t] = k ; } if ( Dis[t] > Dis[min] ) min = t ; } } } }
/****************************************/ プログラムには,次のような行列表現したグラフを入力として与える. 例えば,節点数は13で,1番の節点と7番の節点の枝長は6である. 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 0 0 0 2 6 0 0 0 0 0 0 1 0 1 2 4 0 0 0 0 0 0 0 0 0 1 0 0 4 0 0 0 0 0 0 0 0 0 2 0 0 2 1 0 0 0 0 0 0 0 0 4 4 2 0 2 1 0 0 0 0 4 0 2 0 0 1 2 0 0 0 0 0 0 2 0 6 0 0 0 1 0 0 3 0 1 0 5 0 0 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 3 2 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 4 2 5 0 0 3 0 0 1 0 0 0 0 0 0 0 0 0 2 0 1 0
>>720 もちろん分かっていて炒っているんだと思うけど、 のことと思われ。
タグじゃないけどw
質問者は、インデントのためのハンカクスペースは と書いてね。
このようにインデントされる。
タグじゃないやん。
ファイル・オープン処理の戻り値を書き間違えていました(恐縮
>>718 ,
>>719 ありがとうございました。
740 :
デフォルトの名無しさん :02/12/24 17:21
740 はフクロウです。
ん?
745 :
デフォルトの名無しさん :02/12/26 23:24
000-0000なら0000000、0000000なら0000000とそのままpsResultに代入する関数を つくってるんですが、うまくいきません。ちなみに、数字以外の場合はpsResultは空に します。とりあえず、作ったのを載せておきます。御教授おねがいします。 #include <stdio.h> int CheckYubin(char *psPosNum,char *psResult){ char *tmpNum; int i=0; int Hint=0; //ハイフンのチェック int flag=0; int count=0; while(*tmpNum != '\0'){ if(count == 3 && *tmpNum == '-'){ Hint=1; } if(*tmpNum < '0' || *tmpNum > '9'){ flag=-1; break; } tmpNum++; count++; } if(count == 7){ //すべて数字の場合 flag=0; } if(count == 8 && Hint == 1){ //ハイフンが入っている場合 flag=1; }
746 :
デフォルトの名無しさん :02/12/26 23:25
if(flag == -1){ *psResult='\0'; } if(flag == 0){ for(i=0;i<7;i++){ *psResult=*psPosNum; psPosNum++; psResult++; } *psResult='\0'; } if(flag == 1){ for(i=0;i<3;i++){ *psResult=*psPosNum; psPosNum++; psResult++; } psPosNum++; for(i=4;i<8;i++){ *psResult=*psPosNum; psPosNum++; psResult++; } *psResult='\0'; } switch(flag){ case 0: case 1: return 0; case -1: return (-1); } }
747 :
デフォルトの名無しさん :02/12/26 23:26
int main(){ char psPosNum[80],psResult[80]; int i; scanf("%s",&psPosNum); i=CheckYubin(psPosNum,psResult); printf("%s\n",psResult); printf("%d\n",i); return 0; }
char *tmpNum の初期化忘れてないかい?
>>745 747のscanf("%s", &psPosNum);っておかしくないかい?
わかりました。 749さんの指摘のとおりでした。 お騒がせしました!!! みなさんありがとうございました
&psPosNum は char *[80] 型だが、scanf("%s", psPosNum); とした時の psPosNum と同じアドレスになるので問題が露見しない。 いいのか悪いのか。
754 :
デフォルトの名無しさん :02/12/28 15:30
お世話になります。 年明けにテストがあるのですが、その問題というのは先生があらかじめ示した 問題とヒントとなる元ソースが与えられていて、テストには先生自身が完成させたプログラムが 穴埋めで出てきて、その穴を回答するという方式のようなのです。 そこで、みなさんに先生がヒントのソースと先生自身が出したヒントを元に、 どのようなプログラムを組んで、どこらへんを穴埋めにするか想像して いただけないでしょうか? 先生になったような気持ちでお願いします。 ※授業進度は初歩程度で、文系のプログラミング科目なので、 難易度はかなり易しめなのだと思います。 問題 ここに試験の結果がある、この試験で70点であれば、全体の順位としては 何位となりますか? ヒントとヒントのソースは以下です・・・
755 :
デフォルトの名無しさん :02/12/28 15:32
ヒントとヒントのソースは以下です・・・ #include <stdio.h> main() { int a[8]; int x; int i; int flag; int b[0]; a[0]=50; a[1]=70; a[2]=45; a[3]=55; a[4]=85; a[5]=90; a[6]=50; a[7]=70; flag=1; while (flag==1){ flag=0;
756 :
デフォルトの名無しさん :02/12/28 15:32
for(i=0; i<7;=i+1){ if(a[i]<a[i+1]){ x=a[i]; a[i]=a[i+1]; a[i+1]=x; flag=1; } } 1.b[0]...b[7]に1から8を代入する(たとえばfor文でつくる 2.a[1]...a[7]を順にたどりながら(たとえばfor文でつくる もし、今の得点と直前の得点が等しければ(例えばifで作る 今の得点の順位を、直前の得点と同じ順位にする。 「もし・・・」の場合の処理終わり 2のa[1]...a[7]をたどる処理終わり
757 :
名無し@沢村 :02/12/28 17:41
皆々様方~、教えてくだされ~♪ 私はCのprintf関数みたいに書式付き文字列を引数とする関数をつくりたくて、 printf関数を検索し、書式付き文字列の引数の部分にconst char *format [, argument] ...と書いてあったので、 const char *format [, argument] ...をそのままコピペして引数としたのですが、コンパイルしてみるとエラーを起こしました。 皆々様方~、どうしてエラーを起こしたのでしょうか? printfでは引数がconst char *format [, argument] ...となっているので、const char *format [, argument] ...は引数にできるはずですが…? 皆々様方~、教えてくだされ~♪
そもそもなんでそんなの作りたいんだYo! printf使えば充分だろ。
いい加減沢村の発言はツールで透明あぼーんして みんなスルーしる
762 :
デフォルトの名無しさん :02/12/29 19:43
微分をするプログラムを教えて下さい
cout<<"びぶん!(・∀・)"<<endl;
764 :
デフォルトの名無しさん :02/12/29 20:37
>>762 情報不足。
ぜひ私にやらせてほしいので、詳しく説明してくれ。
C++での宿題なのですが double型の変数dと文字列保存用のポインタp、基数radixを引数に餅 dの内容をradix進文字列に直し、常にsを返す関数 char* double_to_ascii(double d, int radix, char *s); を作成せよ。 なんですがよろしくおながいします(;´Д`) sprintfとかstringstream系を使わないで実装しなきゃだめって言われます田… 鬱です
766 :
デフォルトの名無しさん :02/12/29 22:00
#include<stdio.h> /*数値Nを入力し1からNまでの総和を求めるプログラムただし計算には関数を使う*/ void wa(int x,int y,int *w) { for(x=1;x<=y;x++){ *w=+x; } } void main(void) { int a=1,b,d; printf("N="); scanf("%d",&b); printf("1から%dまでの総和\n",b); wa(a,b,&d); printf("%d \n",d); } こういうプログラムの課題が出たんですが動かないんです. おそらくfor文でプログラムをまわすときに変数の中身まで0に してしまっているのではないかと考えています。 足した数を入れる変数をつくってみたのですが上手くいきません もしかして私の考え方自体が間違っているのですか? 誰か教えてください.
>>765 WindowsでPlatform SDK入れてればMicrosoft SDK\src\crt\xtoa.cにまんまのがあるな。整数だが。
・d % radixを文字列に追加、d /= radix;してループ。
・最後に文字列の中身を逆順に。
というようなことをやっているようだ。
>>766 > int a=1,b,d;
int a=1, b, d = 0;
>>766 ガウスのアルゴリズム知ってるかい?
for使うより早いと思うんだが…
(n+1)*n/2って奴
ピップエレキバン
質問です。 当方WindowsXPなんですが、エスケープシーケンスを利用して 画面消去などの操作を行いたいんですが…どうもXPや2000では エスケープシーケンスが扱えないみたいなんです。 何か良い代替法はありませんか? お願いします。
>>772 VCヘルプでここを調べてみそ
[目次]-[Windows開発]-[Windows開発]-[Windowsベースサービス]-[ファイルおよび入出力]-[SDKドキュメント]-[ファイル入出力]-[コンソール]
Microsoft Visual C++のMSDNライブラリで一通り調べてみましたが、それらしい 項目は見当たらず、解決法が分かりません。 今はCode WarriorというC言語の開発ソフトを使ってます。 画面消去、文字色変更すら出来ず苦しい状態です。 今もこんな方法で画面を消去させてたり(正確には違う)・・・ int cls(){//画面消去のため int i; for(i=0;i<=30;i++)printf("\n"); return 0; }
>>772 device=c:\windows\system32\ansi.sys
>>775 それは既にやりましたが、どうもNTとは違ってXPでは出来ないみたいです。
>>774 Windows専用でいいならConsole用のAPIがあるが
>>778 何が 「手詰まり」 なのか教えてくれんか?
ドキュメントが見つからないのか?
それとも、見つかったが扱い切れないのか?
扱いきれない、というのが正解でしょうか。
WindowsのAPIを利用してやる方法は確かにありますが、上記の理由で
敬遠しているので他に手段も無く手詰まり、と。
>>778 の後いろいろとプログラミングの本と他の有志の方からアドバイスを
貰いました。DOS窓の画面の座標を記録し、そこを黒で塗りつぶすという
案が使えそうなのでそれで頑張ろうかと思います。
となると、今度はコンソールを左上に持って来ないといけないですね。
…うーん。
2000/XPのコマンドラインは既にコマンド回りがDOS互換というだけな気がするが。
cmd.exe ではなく command.com
K&Rの3-1の問題が分りません。 /* x 検索する数 v[] 検索対象の配列 n 配列の上限 */ int binsearch1 (int x, int v[], int n) { int low, high, mid; low = 0; high = n - 1; while (low <= high) { mid = (low + high) / 2; if (x < v[mid])←1 high = mid - 1; else if (x > v[mid])←2 low = mid + 1; else return mid; } return -1; } この二分検索のループ内の2つのテストを外部でのテストを多くしてでも一回に減らし、実行時間を比較せよ という課題ですが、検索などをしても上のほぼ同じコードしか出てきません。 そもそも二回のテストが矢印をした部分ではないとかそんな事はありませんよね?
>>783 これは?
int binsearch1 (int x, int v[], int n) {
int low, high, mid;
low = 0;
high = n - 1;
����
while (low <= high) {
mid = (low + high) / 2;
if (x < v[mid])
high = mid - 1;
else
low = mid + 1;
}
if (x == v[mid])
return mid;
else
return -1;
}
>>783 訂正。
int binsearch1 (int x, int v[], int n) {
int low, high, mid;
low = 0;
high = n - 1;
����
while (low <= high) {
mid = (low + high) / 2;
if (x < v[mid])
high = mid - 1;
else
low = mid + 1;
}
if (x == v[mid])
return mid;
else if (x == v[--mid])
return mid;
else
return -1;
}
>>784-785 どうもありがとうございました。
こちら(ループ外で判断)の方が遅いという認識でよいのでしょうか?
>>767 サソ
PlatformSDKってなんでしょうか・・・
来年の1月1日が宿題提出日なのです…
∧_∧ うわぁぁーん
( ´Д` )っ
( つ /
( | (⌒)`) 誰かソースくれよぉ
(´ ´し'⌒^ミ `)`)
比較2箇所 ・whileを含め3ヶ所で比較 比較1箇所 ・whileを含め2ヶ所で比較 要素数 n 山の高さ h = log n 検索で一致を見つける確率 p 一致があった場合でもループが最後まで回るため、 確率 p で h^2/n 回の余分な比較が発生する。 したがって ph^2/n となって、これと比較回数の改善数を比較し ・・・ 面倒だ、自分で計算しる!
791 :
デフォルトの名無しさん :02/12/31 20:31
C++でCSV(カンマ区切り)ファイルを読み込む方法を教えてください。 例えば、test.csvに、 1,2,3,4 6,7,8,9 とかなっている感じです。
>>791 ifstrem in = ifstream("filename");
in.read(...);
793 :
デフォルトの名無しさん :02/12/31 21:25
>>792 次のようにしていいってこと?
#include <fstream>
int main(){
int A[4],B[4];
ifstream in("test.csv");
in.read(A,4);
in.read(B,4);
return 0;
}
794 :
デフォルトの名無しさん :02/12/31 21:41
>>793 はアボーンでした。
getline()を使って、実装を考えなくちゃいけないかな。。。
>>789 double ってのがきつそうだな。
激しく環境依存になりそうな予感・・・
本当にできるのか?
796 :
篭城学生 :02/12/31 22:13
∧_∧ ああぁ、年が明けちゃう… ( ´Д` )っ 馬鹿なのでソース丸々おながいしまーす ( つ / ( | (⌒)`) (´ ´し'⌒^ミ `)`)
何の話しだ年明けで忙しいんだ。
こういうヤシは単位落とした方が後々良いと思うよ。
間違えた「年越しで忙しいんだ。」
>>798 たしかに。
宿題出さなくて単位を落とすのであれば、
まあ、落とすべくして落とす単位だ罠。
ま、やっぱアフォ2ちゃんねらは誰もできないか 予想どおり強がってる能無しばっか(´,_ゝ`)プッ
>>801 なんで友達に聞くと言う選択肢をとらないのかききたいYO!
まぁ、そういきがるなよ
>>801 出来ないんだからさ。
805 :
デフォルトの名無しさん :02/12/31 22:35
806 :
デフォルトの名無しさん :02/12/31 22:37
>>803 ほら、類はなんたらってやつ、あれだよ。
809 :
デフォルトの名無しさん :02/12/31 22:45
何桁まで表示すんだ.
Hello, Wild!
Hell, War!
まあ、無能ども落ち着け。 あと1時間じゃないか。
>>篭城たん 何進数までサポートするの?
>>786-787 こんな感じでテストしたのですが、駄目でしょうか?
/*
binsearch1 K&Rに書いてあったもの
binsearch2 教えていただいたもの
*/
int main () {
int main () {
int v[20]={0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95};
int i , time;
time = timeGetTime();
for (i = 0 ; i < 10000000 ; ++i)
binsearch1 (v[i % 20] , v , 20);
printf ("①%5dms\n" , timeGetTime() - time);
time = timeGetTime();
for (i = 0 ; i < 10000000 ; ++i)
binsearch2 (v[i % 20] , v , 20);
printf ("②%5dms\n" , timeGetTime() - time);
return 0;
}
816 :
デフォルトの名無しさん :03/01/01 14:28
A HAPPY NEW YEAR!
817 :
デフォルトの名無しさん :03/01/01 14:30
And You?
しぼーん
819 :
デフォルトの名無しさん :03/01/01 16:31
入力した潤年が何回目なのかを表示するプログラムをお願いします.
そんなの潤年の条件調べたらすぐだろー。
解決しました.
>>818 あけおめ。
宿題はちゃんと提出できたか?
824 :
デフォルトの名無しさん :03/01/01 18:41
あと三時間分くらいの地域で2002年が残っているのかな?
夜空を見ろよ 何万年前の星が残ってるぞ
いや、地球上の、日付変更線のすぐ東側。 二時間くらいだな、多分。
夢がないヤシめ
>>815 これでbinsearch1:約0.7秒、binsearch2:約1秒という結果が出たのですが。
>>828 ごめんなさい、
>>788 の私の発言はたぶん間違いです。
うちでは試してないけど
>>790 のレスが正解と思います。
binsearch1 だと時間がかかることもあれば短時間ですむこともあります。
binsearch2 だと常に一定の時間がかかります。
後者では「比較が一つ減ったので短時間ですむ」と勘違いしてました。
平均するとbinsearch2の方が早いという事で良いんですね?
>>830 どうだろ。期待値を考えないと一概には答えられないかも。
今から計算してみます。
>>830 投了!
配列の要素数 n が pow(2, x - 1) < n < pow(2, x + 1) の場合
binsearch2 のループ回数は x + 1 回、比較回数は 2 * (x + 1) - 1 回。
binsearch1 で y 回目にループを抜ける確率 p(y) は pow(2, y - 2)/n < p <= pow(2, y - 1)/n
一回のループで 2 回または 3 回比較が行われるので比較回数の期待値 E は
for (i = 1, E = 0; i <= x + 1; i ++) E += (2.5 * (x + 1) - 1) * p(i);
ここで n = pow(2, x) と近似すると 3 < x < 5 辺りで binsearch1 と binsearch2 の比較回数の大小が入れ替わります。
で、この考え方が正しいとすれば配列の要素数が多くなれば binsearch2 の方が平均的には速いと言えそうですが…。
>>814 のテストを v[] の要素数を色々変えて試してみると良いと思います。
僕が調べても要素数が多いほどbinsearch2が優位に立つみたいでした。 要素数が少ないとあまり時間がかからないので差を考える必要が少なくなるから特別な場合でない限り binsearch2を使った方が良いというのは素人考えかな…
834 :
名無し@沢村 :03/01/02 09:30
ヌヒ等よ、香具師という言葉だが、もともとは奴(=ヤツ)という意味だったのよ。 それがヤツがヤシに変化し、ヤシ=香具師になったものよ。 覚えておけ。
Timpolate == 遅漏
>>754-756 数日助け船を待ったのですが・・・。
スレを移動した方がいいのでしょうか?
>>834 日本語は正しく使いましょう。
電波さんだけがわかる言葉なんて意味がありません。
>>837 つまりソートして何番目かを調べるプログラムを理解してればいいのかな?
>>837 #include <stdio.h>
int main(int argc, char * argv[]) {
int x, i, flag, b[8];
int a[8] = {50, 70, 45, 55, 85, 90, 50, 70};
flag = 1;
while (flag == 1) {
flag = 0;
for (i = 0; i < 7;i ++) {
if (a[i] < a[i + 1]) {
x = a[i];
a[i] = a[i + 1];
a[i + 1] = x;
flag = 1;
}
}
}
/* つづく */
/* つづき */ for (i = 0; i < 8; i ++) b[i] = i + 1; for (i = 1; i < 8; i ++) { if (a[i] == a[i - 1]) { b[i] = b[i - 1]; } } for (i = 0; i < 8; i ++) { if (a[i] == 70) { printf("%d\n", b[i]); break; } } return 0; } ・for 文の i の意味を理解する。 ・a[] と b[] の使われている目的を理解する。 こんなところでどうでしょ。
842 :
デフォルトの名無しさん :03/01/02 16:17
C言語なんですが、 A[100] の配列からランダムに選ばれた80個の要素には1を割り振り 残りの20個には0を割り振るようなコードを 書きたいのですが、どうすればよいですか?
>>842 それは密かに乱数のアルゴリズムを聞いているんでせうか。
>>842 すごく頭の悪い方法かもしれないけど…。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[]) {
int i, j, A[100];
srand(0);
for (i = 0; i < 100; i ++) A[i] = 0;
for (i = 0; i < 80;) {
j = rand() % 100;
if (A[j] == 0) {
A[j] = 1;
i ++;
}
}
for (i = 0; i < 100; i ++) {
printf("%d ", A[i]);
if ((i % 20) == 19) printf("\n");
}
return 0;
}
845 :
デフォルトの名無しさん :03/01/02 18:37
「問」 ここに1~Nまでの整数をランダムに発生して利用したい。 条件は以下 ・完全な乱数を発生する方法。 ・時間とかシステムによらない乱数。 ・同じ条件で再現性がない乱数を取得できること。 提案、ネットワークを利用してURLの 一行の文字列(改行までの)から乱数を得る方法等。 だと、速度が遅い。
848 :
デフォルトの名無しさん :03/01/02 18:52
double型の変数をint型にタイプキャストするとき、 小数点が切り捨てられるのですが、 そこを、四捨五入にするような方法はありますか?
>>848 #incude <stdio.h>
main(){
double d1=0.5l,d2=0.49l;
int i1, i2;
i1 = d1 + 0.5l ;
i2 = d2 + 0.5l ;
printf("%d %d",i1,i2);
return 0;
}
852 :
デフォルトの名無しさん :03/01/02 18:57
「疑問」 円周率(π)を求める計算で有名な東大の金子教授ですが、 なぜそれが正しい解答だと言えるんでしょうか?
凡人では理解できないような高騰数学をmasterしているからです。 フェルマーの定理も解いたそうです。
854 :
デフォルトの名無しさん :03/01/02 19:12
「問2」 Borlandのフリーコンパイラ(BCC55)で画面描画を 「Jpg」形式のファイルで保存する方法。 「問3」 Borlandのフリーコンパイラ(BCC55)で「BMP」形式のファイルを 「Jpg」形式のファイルに保存する方法。及びその逆(「jpg」→「Bmp」)
fopen("*.jpg",fin); fclose("*.bmp",fin);
ヘッダーが変わらない?
>>845 rand()ですら完全な乱数ではない
トランジスタのベースをオープンにした基板でも作るか?
いや,それでも完全な乱数とは言えないかも
「完全な乱数」を数学的に定義してごらん
そんな問題を出した先生に反論できそう
もしかして,それが正解なのかも知れない
858 :
デフォルトの名無しさん :03/01/02 20:36
round関数を使用しようとしたら、 $ cc -lm simulation.c /tmp/ccqjEObs.o: In function `main': /tmp/ccqjEObs.o(.text+0x30c): undefined reference to `round' というエラーがでます。 どうしてでしょうか?
859 :
754-756 :03/01/02 21:21
839さん、ありがとうございました。 ばっちし参考になります。 自分でも数パターン考えてみます。 レベルが低いので、問題はもっと稚拙な プログラムになる可能性もあるのですが・・・。 わざわざ、あまり美しくないプログラムを聞く っていうのもなんですが・・・^^;
がんばってね。
861 :
デフォルトの名無しさん :03/01/02 21:26
858もお願いします。 Cではround関数をサポートしてないのでしょうか? それとも、コンパイラが悪いのでしょうか?
>>861 私の手持ちのリファレンスには載ってません。
他の方法を考えた方が良いと思います。
863 :
デフォルトの名無しさん :03/01/02 22:00
>>862 他の方法なにかないですか?四捨五入の。
えっと、
>>850 で答えが出てると思うけど。
0.5 足して int にキャストすればいいんじゃないかな。
おっ、これはすごい、単純だけどエレガントですね。
数値計算の授業でこの正解を教えてもらった時はショックだった。 ひたすらに回り道してたから……
乱数だったら、MT 使うか、 環境依存だが /dev/random 系のエントロピーものを使うか、 が妥当なレベルではある。
868 :
デフォルトの名無しさん :03/01/03 06:16
今、C言語を使ったコンソールアプリを作っています。 そこで質問なんですが、 2003/01/02 入力:_ 2003/01/02 のように表示し、入力をアンダーバーのところで待つ といったことはできるんでしょうか? 2003/01/02 入力:_ のような形ならもちろんできるんですが、入力を文字列の途中で行いたいです。 御教授よろしくお願いします。
意味がよくわからないけど、 printf("入力:\n"); scanf( を printf("入力:"); scanf(
870 :
デフォルトの名無しさん :03/01/03 06:29
871 :
デフォルトの名無しさん :03/01/03 06:30
いや、文字列の途中に入力するカーソルを持ってきたいということです。 これはどうすればいいんでしょうか?
>>872 ありがとうございます!!早速やってみます。
WinSDKを使わずに、完全にC言語のみではできないんでしょうか?
あぼーん
877 :
デフォルトの名無しさん :03/01/03 15:49
3次元配列を引数、戻り値として与える関数を作ろうと したのですが、 simulation2.c:158: arithmetic on pointer to an incomplete type というエラーがでます。 簡単化したソースは main() { int rt[MAX_NODE][MAX_RES][MAX_NODE]; rt_initialize(rt); } void rt_initialize(int rt[][][MAX_NODE]) { int i,j,k; for ( i=0; i < MAX_NODE; i++){ for(j=0; j < MAX_RES; j++){ for(k=0;k < MAX_NODE; k++){ rt[i][j][k] = 0; } } } } というものです、どうすればいいでしょうか? よろしくお願いします。
C/C++は組み込み型配列宣言で[][]はだめ 空でイイのはもっとも変数名に近い左の1つだけなはず //int rt[][MAX_RES][MAX_NODE] //int (*rt)[MAX_RES][MAX_NODE] void rt_initialize(int rt[MAX_NODE][MAX_RES][MAX_NODE]) { int i,j,k; for ( i=0; i < MAX_NODE; i++){ for(j=0; j < MAX_RES; j++) for(k=0;k < MAX_NODE; k++) rt[i][j][k] = 0; }
{ 消し忘れ
880 :
デフォルトの名無しさん :03/01/03 16:23
>>878 そうだったんですか。
一つ学びました。有難うございます。
881 :
デフォルトの名無しさん :03/01/03 17:01
以外と配列まわりのアドレスって難しいよな。 俺なんか2次元配列引数に渡すだけで大パニックだす。
前回お世話になった754です。もう1問あるのでお願いします。 年明けにテストがあるのですが、問題とヒントとなる元ソースが与えられていて、 テストには完成したプログラムが、穴埋めで出てきて回答するという方式のようなのです。 そこで、みなさんに先生が、ヒントのソースと先生自身が出したヒントを元に、 どのようなプログラムを組んで、どこを穴埋めにするか想像していただけないでしょうか? 先生になったような気持ちでお願いします。 ※授業進度は初歩程度で、文系のプログラミング科目なので、 難易度はかなり易しめです。 問題 次表のような試験の結果がある。この試験で学籍番号の生徒は、何位になりますか? 学籍番号 0 1 2 3 4 5 6 7 得点 50 70 45 55 85 90 50 70 ヒントの元ソースは以下です・・・
#include <stdio.h> main() { int a[8];/*得点を記録する変数*/ int i,j; int x;/*人数を記録する変数*/ int b[8];/*順位を記録する配列*/ a[0]=50; a[1]=70; a[2]=45; a[3]=55; a[4]=85; a[5]=90; a[6]=50; a[7]=70; /**** 一人の生徒の順位だけ求める場合 ****/ /** まずはこれをつくる **/ /* 例えば0番の生徒の順位を求める*/ /* B1.人数は1からはじめる(最後に1足す分を最初に済ませる)*/ /* B2.全員の得点をひとつずつ順番に取り出しながら */ for(i=0; i<8; i=i+1){ printf("%d番の生徒 得点%d\n",i,a[i]); /* B3.もし、a[0]より取り出した得点(例えばa[i])が大きければ */ if(a[0]<a[i]){
/* B4.人数に1を加える */ }/* B3.の終わり */ }/* B2.の終わり*/ /* B4.人数の値が0番の生徒の順位 */ /**** 一人の生徒の順位だけ求める場合 終わり ****/ /**** 全員の順位を求める場合 ****/ /* 0番から7番まで、生徒を順番に呼び出しながら、B1.~B4.を繰り返す */ /**** 全員の順位を求める場合 終わり ****/ 長くて読みづらく申し訳ありません。 お願いします
文系なんだから全部暗記しろ
いやその、私の力量不足でプログラムとして表現出来ないところを なんとか教えていただきたいのですが・・・。もちろん、回答を元にして、 もう一度自分で理解してみようとするつもりですが・・・。 必要があれば暗記もしますし・・ 処理の内容としては、 ・生徒Aの得点とほかの生徒の得点を順番に比較 ・Aより高い得点をとっている生徒数Xを求める ・Aと全生徒との得点比較終了時に、Xに1を加えるとAの順位になる ・これを全ての生徒について実行すると全員の順位がきまる ぐらいでいいと思うんですが・・・
フーン・・・(#・∀・)カエレ!!
888 :
デフォルトの名無しさん :03/01/04 01:27
初めてカキコします. C言語についての質問ではないと思うのですが質問します. 1フレーム640×480画像(RGB各値)をキャプチャできるものを プログラムしたのですが, これをmpegで保存したいんです. フレームは何枚もキャプチャできます. どのライブラリをどのように使用していけばいいのでしょうか? 一応宿題といえば宿題なんで。。。 教えてください。
889 :
デフォルトの名無しさん :03/01/04 02:03
> そこで、みなさんに先生が、ヒントのソースと先生自身が出したヒントを元に、 >どのようなプログラムを組んで、どこを穴埋めにするか想像していただけないでしょうか? > 先生になったような気持ちでお願いします。 ワラタ
>>882 >先生になったような気持ちでお願いします。
その先生は多分根性が曲がっていると思うので、ヒントのソースを変更する可能性があるっす。
んで、取り合えず組んでみたものの、デバックしてないのであとはよろしく。
穴埋めに関しては、
>>885 と同意見
#include <stdio.h>
int ban[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
int ten[8] = { 50, 70, 45, 55, 85, 90, 50, 70 };
int i, j, zyu[8];
void mainloop( void )
{
for( i=0; i < 8; i++ ){
for( zyu[i]=1, j=0; j < 8; j++ ){
if( ten[i] < ten[j] )
zyu[i] += 1;
}
}
}
int main( void )
{
mainloop( );
fprintf( stderr, "番号:" ); scanf( "%d", &i );
fprintf( stderr, "[%d]番目\n全員の順位\n", zyu[i] );
for( i=0; i < 8; i++ )
fprintf( stderr, "[%d]番目,,,学生番号[%d],,,点数[%d]\n", zyu[i], ban[i], ten[i] );
return (0);
}
私信なのか、これは。
>>890 なぜstderr?
ban[i]はiでいいような気も
893 :
デフォルトの名無しさん :03/01/04 13:55
入力年月が正しいかどうかのチェックをしたいです。 入力形式がYYYYMMで、190001から999912の間だとOKなんですが、 if(strcmp(sItemYear,"190001") < 0 || strcmp(sItemYear,"999912") > 0) ではチェックできないんでしょうか? ちなみに、sItemYearは年月が入っています。 よろしくお願いします。
>893 190013というのが不正であることを考慮する必要がある(13月は存在しない)
895 :
デフォルトの名無しさん :03/01/04 17:06
2次元の配列に数値を文字列で入力し、それを 数値型に変換して出力したいのですがうまいきません。 何がいけないのか教えてください。 #include<stdio.h> #include<stdlib.h> main() { char a[10][5]; int j; printf("数値を5個入力して下さい。\n"); for(j=0;j<5;j++) scanf("%s",a); printf("今、入力した数値は\n"); for(j=0;j<5;j++) printf("%d\n",atoi(a[j])); }
#include<stdio.h> #include<stdlib.h> main() { char a[5][10]; int j; printf("数値を5個入力して下さい。\n"); for(j=0;j<5;j++) scanf("%s",a[j]); printf("今、入力した数値は\n"); for(j=0;j<5;j++) printf("%d\n",atoi(a[j])); }
897 :
デフォルトの名無しさん :03/01/04 17:17
>>895 「うまいこといかない」ではなく、どんな風になってしまうのか
きちんと書きましょう。それがデバッグへの第一歩。
まずは、入力された内容が何処に格納されるのかチェックだ。
898 :
デフォルトの名無しさん :03/01/04 17:40
aではなく、a[j]でしたね。 ありがとうございました。
890さんどうもっす。 自分なりにも試行錯誤してみます。
900 :
デフォルトの名無しさん :03/01/05 00:16
先程質問に答えていただきありがとうございます。 また、疑問がでたので質問させて欲しいのですが 2次元の配列に数値を文字列で入力して、それを 数値型に変換したものをそのまま利用するには どうすればいいでしょうか。変換した数値をクイック・ソート したいのですが・・・。 お願いします。
int cmp(const void *p, const void *q) { return *(int *)p - *(int *)q; } int main(void) { char a[5][10]; int j, i[5]; printf("数値を5個入力して下さい。\n"); for (j = 0; j < 5; j++) scanf("%s", a[j]); printf("今、入力した数値は\n"); for (j = 0; j < 5; j++) printf("%d\n", i[j] = atoi(a[j])); qsort(i, 5, sizeof(int), cmp); printf("ソートした数値は\n"); for (j = 0; j < 5; j++) printf("%d\n", i[j]); return 0; }
>>901 ありがとうございます。
勉強になります。
1.) 実数を4個読み込み、その中の最大値を出力するプログラム(mymay.c)を作れ。 2.) 2つの正整数を読み込み、それらの最大公約数と最小公倍数を求めるプログラム(gcdlcm.c)を作れ。 3.) 高所から物体を離して自由落下させたとき、初速度を0とすると時刻t、時刻tのときの速度v、t秒間の垂直方向の距離(変化)yとした時の、 各時間における速度と変位を計算し、時刻t、速度v、変位yを画面に表示するプログラムを作成せよ。 このとき時刻tは0.0から1.0まで変化するものとし、0.1刻みで計算して表示せよ。 ・v=gt ・y=gt*gt/2 ・g=9.8[m/s*s] 4.) n(n≦100)人の学生の英語・国語・数学の試験の点数を読み込み、各人の3科目の合計点と平均点及び各科目の平均点を計算して出力するプログラム(exam.c)を作りなさい。 ただし、プログラムをテストする時は学生数を5人としてよい。 5.) f(x)=sin(x)をマクローリン展開すると f(x)= ∞ Σ *(-1)^k-1*{(x^2k-1)/(2k-1)!} k=1 となる。これを利用してsin(x)の値を多項式近似する関数double mysin(double x)を定義し、この関数を利用して、読み込んだxのsin(x)を計算して出力するプログラム(sin.c)を作りなさい。 このプログラムを実行して、xがπ/12・π/6・π/4・π/3・5π/12の時のsin(x)の値を出力しなさい。
903がどこの宿題か気になる
903のどこがムズ過ぎなのか気になる
5が難しいというならまだ分かるけど、1-4が解けないのは授業聞いてないからだろうな(´ー`)y-~~
いやいや、5もほとんど答え出とるやんけ
本当だな。あとはコードに落としこむだけだ。
丸投げが悪いとは言わんが一言何か申し添えるべきじゃないか?
へー。こんなんが難しいんだ。中学生からやり直してね。
拡張子が.cだと#include<graph.h>はできないのでしょうか。 長方形を表示させたいのですが、うまくいかなくて困っています。 Visual C++を使用しています、アドバイスをいただいてもよろしいでしょうか?
>>911 VC++ は知らないのだけど graph.h が C++ で書かれているならだめだろう。
>>911 graph.hはどこにあるのかと、小一時間(ry
エラーメッセージ賭け
>>912 有難うございます。
だとしますとC言語では図形描画は不可能ですか…?
最終的な目標は前にprintfで表示した数字を消したいのです。
長方形で塗り潰そうと思ったのですが…他にいい案が思いつきません。
まだまだCへの理解が未熟で申し訳ないのですが、他の良い方法を教えていただきたいです。
よろしくお願いします。
>>915 >C言語では図形描画は不可能ですか…?
環境依存。できなくはない。
とりあえず拡張子を .cpp にしてコンパイルしてみたら?
>>916 cppにするなとのお達しでして…すみません(´Д`;)
>最終的な目標は前にprintfで表示した数字を消したいのです。 >長方形で塗り潰そうと思ったのですが…他にいい案が思いつきません。 (;⌒ー⌒) オイオイ
'\b' をたくさん出して消すのはダメか?
>>915 >printfで表示した数字を消したい
無理。待人来らず。早々に諦めて吉。
ほんと未熟でスミマセン… もっと具体的な最終目標は5×5の配列に1~50の数字をランダムに配置したものを、 ビンゴのように1つずつ消していきたいのです。 エスケープシーケンスで部分的に消すことは可能ですか?
>>921 前の行に遡るのは不可能だよ。
一手ずつ5×5の数字だかマスだかを再表示するしかないよ。
コンソールのバッファなんか気にしなくてもいいんじゃないかな。
ソースの書き方教えてください。 unsigned int aaa; ← 0xFFDDEECCの4byte Data 下記のように1byte Dataにしたいのですが どのようにやればうまくいきますか? unsigned char a1; ← 0xFF unsigned char a2; ← 0xDD unsigned char a3; ← 0xEE unsigned char a4; ← 0xCC また逆に詰め込みたい場合はどうするのが良いのでしょう。
>>922 そうでつか…ありがとうございます。
再表示は考えましたが…ビンゴゲームの為消していく順番もランダムなので、
相当というか無駄に物凄く長いソースになりそうなのです…
ぐぐったり参考書を漁ってビンゴゲームのサンプルソースを探してみたのですが
参考にできるものがなかなか見つかりません…
出題者は構造体を使えばできると言っていたのですが、なかなか難しいので困っています…
>>923 a1 = (aaa & 0xff000000) >> 24;
>>925 サンクス( ..)φメモメモ
a2.a3.a4の取り出し方も教えてm(__ )m
逆にa1.a2.a3.a4をaaaに詰め込む方法もお願いします。
927 :
デフォルトの名無しさん :03/01/06 02:36
整数値を文字型に変換することはできるのでしょうか? よろしければ、方法をお願いします。
>>926 少しは頭を使え…
a2 = (aaa & 0x00ff0000) >> 16;
>>927 sprintf
>>928 さん ありがとうございました。
ほんとに助かりました。m(_ _)m
931 :
デフォルトの名無しさん :03/01/06 10:51
Cの配列の要素って int型では、どのくらい収納できるの? 2次元配列で6万×6万でできなかったです。 (サイズでかすぎと警告がでた)
>>931 規格では上限はない
翻訳環境と実行環境がそれぞれ持つ処理系限界の悪い方に束縛されることになる
6万×6万っていくつになるか知ってる?
6万x6万が何メガバイトでお前のPCの搭載メモリが何メガバイトか逝ってみろ。
>>931 例えばsizeof(int)==4の処理系でint a[60000][60000];を使おうとすると
4x60000x60000で14,400,000,000bytesのメモリが必要だが
おまえさんのマシンはメモリをどのくらい積んでいるんだ?
あるいは買い揃える場合の予算はどのくらいだ?
>>926 aaa = ((unsigned int)a1 << 24) | ((unsigned int)a2 << 16) | ((unsigned int)a3 << 8) | a4;
>>931 それテストしてるだけ?それとも実際に必要なの?
実際に必要なら疎な配列作るか
struct{
int x, y;
struct{
} yourdata;
}
な配列を作れ。
unionで間に合ったりしてな(藁
次の2つのファイルをくっつけて下の1つのファイルにするコードはどうすれば良いですか? ファイル名=SEC01.E (1) I turn off the alarm clock. (2) I wake up. (3) I stretch. ファイル名=SEC01.F (1) 目覚まし時計を止める (2) 目がさめる (3) のびをする まとめたファイル=SEC01.G I turn off the alarm clock. 目覚まし時計を止める I wake up. 目がさめる I stretch. のびをする まとめたファイルでは、(1)などの数字は除きます。また1つのフォルダにこのような2つのファイルの組が20組ある(SEC01.E~SEC20.E)のを全部同じ操作するにはどういうコードにすれば良いですか? おながいします。
>941 どちらでもかまわないです。
>>942 C++版
#include <fstream>
#include <string>
#include <cstdio>
int main()
{
for (int i = 1; i <= 20; i++) {
char sece[20], secf[20], secg[20];
std::string buf1, buf2;
std::sprintf(sece, "SEC%02d.E", i);
std::sprintf(secf, "SEC%02d.F", i);
std::sprintf(secg, "SEC%02d.G", i);
std::ifstream ifs1(sece);
std::ifstream ifs2(secf);
std::ofstream ofs(secg);
while (std::getline(ifs1, buf1)) {
if (!std::getline(ifs2, buf2)) break;
ofs << buf1.substr(4) << '\n' << buf2.substr(4) << '\n';
}
}
}
もっとC++版 #include <sstream> #include <iomanip> #include <fstream> #include <string> #include <cstdio> int main() { for (int i = 1; i <= 20; i++) { std::ostringstream sece, secf, secg; std::string buf1, buf2; sece << "SEC" << std::setw(2) << std::setfill('0') << i << ".E"; secf << "SEC" << std::setw(2) << std::setfill('0') << i << ".F"; secg << "SEC" << std::setw(2) << std::setfill('0') << i << ".G"; std::ifstream ifs1(sece.str().c_str()); std::ifstream ifs2(secf.str().c_str()); std::ofstream ofs(secg.str().c_str()); while (std::getline(ifs1, buf1)) { if (!std::getline(ifs2, buf2)) break; ofs << buf1.substr(4) << '\n' << buf2.substr(4) << '\n'; } } }
>>944 では#include <cstdio>は不要ですから取って下さい。
どうもっす。 考えて見ます。
1!~100!までを正確に表示する方法を教えて下さい。
このスレのどっかにlongint以上を表現する方法あったからそれに階乗のアルゴリズムぶち込むだけでいいだろ。
949 :
デフォルトの名無しさん :03/01/06 18:12
c言語でコンピュータで扱えないほど大きな数のかけ算のプログラムを作らなければなりません。 かける数を文字列として受け取ります。 つぎに何桁に区切って他のint型の配列に入れたいのですが、char型をint型にうまくできません。 どのようにしたらいいのでしょうか?
>コンピュータで扱えないほど とりわけPGは言葉の正確さを大事にせい i=a[i]-'0';
>950 ありがとうございます。 >とりわけPGは言葉の正確さを大事にせい すいません。32ビットより大きい整数で。 次からはちゃんと書きます。
メディアプレーヤーで、unyounyo.mp3ファイルをおよそ10分置きに再生する。 そんなプログラムはC/C++で書けないでしょうか?
Sleep&&(ShellExecute||CreateProcess)
>>951 i=0;
i=i*10+a[0]-'0';
i=i*10+a[1]-'0';
i=i*10+a[2]-'0';
i=i*10+a[3]-'0';
>>924 配列で保持しておいて消していくところを0にして
0のところをスペースにすれば良いだけでは?
対して処理もいらないと思う。
#define FILENAME xxx.x main(){ FILE *fp if((fp=fopen(FILENAME,"r"))==NULL){ printf("cannot open FILENAME,"); exit(1); } fclose(fp) } ファイルが開けなかった時に cannot open FILENAMEと出てしまいます。 cannot open xxx.xと表示させるにはどうしたらよいでしょうか。
printfの%s
二次元配列に2桁の数値を文字型で5個入力して、 数値以外を入力した時に、エラー表示を繰り返させたいのですが どのようにすればいいでしょうか。お願いします。
#include <stdio.h> #include <stdlib.h> #define NUM_COLUMNS 2 #define INPUT_NUM 5 int main() { char num_buf[INPUT_NUM][NUM_COLUMNS + 1]; // 二次元配列 char buf[256]; int i, dummy; printf("に %d 桁の数値を %d 個入力してください。\n", NUM_COLUMNS, INPUT_NUM); for(i = 0; i < INPUT_NUM; i++) // 5 回入力 { if(fgets(buf, sizeof(buf), stdin) == NULL) exit(-1); if(sscanf(buf, "%d", &dummy) == 1 && dummy >= 0 && dummy <= 99) { sprintf(num_buf[i], "%02d", dummy); continue; } for(; ; ) priintf("エラー\n"); // エラー表示を繰り返す } return 0; }
> for(; ; ) > priintf("エラー\n"); // エラー表示を繰り返す 素敵だ
無限ループは(;´Д`)
数値入力 10 数値入力 10 数値入力 10 という風にで入力する度に改行するのではなく、 数値入力 10 数値入力 10 数値入力 10 という風に入力を行いたいのですが どのようにすればいいでしょうか?
厨ですみませんお尋ねします 5×5の配列を与えて1~100までの数を乱数で与え、 しかも全ての数値が異なる値にするにはどうすればよいでしょうか? 乱数で与えるところまではわかるのですが 同じ値の数値があるかどうかのチェックの仕方がわかりません・・・
/* 1 ~ 100 を先にシャッフルし、その先頭要素を切り出す方法 */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define swap_int(i, j) do { int tmp = i; i = j; j = tmp; } while(0) int main() { int base_table[100], rand_table[5][5]; int i, j, r; srand(time(NULL)); for(i = 0; i < 100; i++) base_table[i] = i + 1; for(i = 0; i < 99; i++) { r = (int)(rand() / (double)RAND_MAX * (99 - i) ); swap_int(base_table[99 - i], base_table[r]); } for(i = 0; i < 5; i++) for(j = 0; j < 5; j++) rand_table[i][j] = base_table[i * 5 + j]; for(i = 0; i < 5; i++) { for(j = 0; j < 5; j++) printf("%4d", rand_table[i][j]); putchar('\n'); } getchar(); return 0; }
/* 個別に乱数を求め、後で重複チェックして振り直す方法 */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int rand_table[5][5]; int i, j, r, i_sub, j_sub; srand(time(NULL)); for(i = 0; i < 5; i++) for(j = 0; j < 5; j++) { try_rnd: r = (int)(rand() / (double)RAND_MAX * (99 - i) ) + 1; for(i_sub = 0; i_sub < i - 1; i_sub++) for(j_sub = 0; j_sub < 5; j_sub++) if(rand_table[i_sub][j_sub] == r) goto try_rnd; for(j_sub = 0; j_sub < j - 1; j_sub++) if(rand_table[i][j_sub] == r) goto try_rnd; rand_table[i][j] = r; } for(i = 0; i < 5; i++) { for(j = 0; j < 5; j++) printf("%4d", rand_table[i][j]); putchar('\n'); } getchar(); return 0; }
966 にはバグがありそうだ
1~25の乱数を一度ずつだけ返す関数。これでも使え。 #define N 25 int one_times_rand(void) { static int first = 1, size = N; static pool[N]; int i, j, t; if (first) { for (i = 0; i < N; i++) pool[i] = i + 1; first = 0; } j = rand() % size--; t = pool[size]; pool[size] = pool[j]; pool[j] = t; return pool[size]; }
しまった static pool[N] → static int pool[N] まあどっちでも動くが、念のため。
しまった static pool[N] → static int pool[N] まあどっちでも動くが念のため。
971 :
デフォルトの名無しさん :03/01/07 22:28
BM法完全版のプログラムを教えてほしいのですが。
初めて書き込みます。VisualC++のことで聞きたいんですが。
VisualC++ のスレがあったはずだが、何でここに来る?
>>975 あなたが何も考えていない事はわかった。
1!~100!まで表示するのは、<もしよければC言語なら私に聞いてください 48 >に書いちゃった。 マルチポスト?するとこういうことに……
皆様(965さん、966さん、968=969=970さん)色々とヒントをありがとうございました なんとなく雰囲気はつかめました。 後は実際に自分で書いてみることにします。頑張ります。 ちなみに私は失礼ですが972さんではないです。念のため。
979 :
デフォルトの名無しさん :03/01/08 00:11
引数に与えられる文字列を、数字なら'9'に、大文字なら'A'に、小文字なら'a'に、 その他なら'.'に変更する関数をポインタを用いて作りなさい。 このとき、その関数が正しく実行されるかどうかを確認するための プログラムの全体を提出しなさい。 ポインタがまだ理解できてないので分からないです。よろしくお願いします。
void f(char *s) { while ( *s ) { if ( isdigit(*s) ) *s++ = '9'; else if ( isupper(*s) ) *s++ = 'A'; else if ( islower(*s) ) *s++ = 'a'; else *s++ = '.'; } }
void func1(char *str) { while (*str) { if (isdigit(*str)) { *str = '9'; } else if (isupper(*str)) { *str = 'A'; } else if (iflower(*str)) { *str = 'a'; } else { *str = '.'; } str++; } } 「ポインタを用いる」というのがどんなものを想定しているのかはわからないけど、 こんな感じでいいんじゃないかな。 あと、「プログラム全体」というのは、main関数のことだろうけど、 それくらいは自分で書いてね。
iflower -> islower タイプミスがあったよ。ごめん。
main関数のところすらうまくできません。こんな感じです。 int main() { int a,i; char *b; scanf("%d",&a); for(i=0;i<a;i++) { gets(b); f(b); printf("%s",&f); } return 0; }
>>983 char *b;
を
char b[265];
くらいにしとき。
まだできない・・・。 printfのところがおかしいと思うんだけど。
&f → b
やっとできました。 どうもありがとうございました。
988 :
デフォルトの名無しさん :03/01/08 06:01
学校の宿題で全然わからず困っております。問題は以下の通りです。 [問題]CPUのシミュレータ CPUの動作を模擬するプログラムを書いてみよう。 CPUは、命令をメモリから取り出し、その命令に基づいた動作をする。 動作は例えばメモリからデータを読み出してCPU内のレジスタにコピーしたり、加減乗除演算をしたりする。 この一連の動きを真似るプログラムを書く。 CPUは、8ビット演算、メモリ容量は32ワード、入出力は2進数で表示。 動作の検証には、簡単なプログラムをメモリ上に用意し、 それを1ステップごとに実行した結果を表示する。 命令部分はswitch文を使うのはわかるのですが、 2進数による入出力というのができず、全体的にどのようにすれば良いかもわかりません。 どうかお願いします。
オリジナルアセンブラを作れって事かなぁ…。
>>988 CASL/COMETエミュレータでも提出しとけ。
991 :
デフォルトの名無しさん :03/01/08 09:50
整数をm個入力してソートし、その後(2分)検索をn回行うプログラムを作りなさい。
>>991 man qsort
man binsearch
994 :
C++厨 ◆vKuy6bx7T2 :03/01/08 11:06
次スレ逝きますよ?
995
..
998
999
1000get
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。