1 :
C++厨 ◆vKuy6bx7T2 :
03/01/08 11:19
迷惑です。
3 :
C++厨 ◆vKuy6bx7T2 :03/01/08 11:26
>>2 うっさいわ!
>>3-999 俺が留守の時はどなたか俺を騙って慎ましやかに進行おながいしますm(_ _)m
糞スレワッショイ!!
とりあえず、質問すると思うので保守~。
ていうか前スレにポインタくらい貼っとけ。 更に言えば、前スレは2代目じゃねえ。
>>6 c++厨のくせにポインタを知らなかったんだよ
>>1 は。
こんなリスト構造作ったら赤点どころかハングアップもしかねん。
8 :
デフォルトの名無しさん :03/01/08 14:53
保守。
9 :
デフォルトの名無しさん :03/01/08 15:11
どうしてうんこは臭いんですか?
臭いと思うから臭いのであって それはあなたの思い込み
>>10 そんな事ないと思うぞ。運子は確かに臭いです。食えません。
すべて思い込みです 食えると思えば食える 食う人もいるのですから
>>12 ウンコって食うと苦い味がするそうですが、本当ですか!?
苦い中にほのかな甘さを覚える人もいます ぜひお試しください
>>14 食糞健康法って奴ですね。
失敗すると即死するという諸刃の剣らしいですから、注意して
試してみます。
でも、できれば自分の糞でなくて彼女の糞、それも下痢弁を
食べてみたいです。
16 :
デフォルトの名無しさん :03/01/08 15:48
なんだかうんこたべてみたくなっちゃったみたい
17 :
デフォルトの名無しさん :03/01/08 15:51
988 :デフォルトの名無しさん :03/01/08 06:01 学校の宿題で全然わからず困っております。問題は以下の通りです。 [問題]CPUのシミュレータ CPUの動作を模擬するプログラムを書いてみよう。 CPUは、命令をメモリから取り出し、その命令に基づいた動作をする。 動作は例えばメモリからデータを読み出してCPU内のレジスタにコピーしたり、加減乗除演算をしたりする。 この一連の動きを真似るプログラムを書く。 CPUは、8ビット演算、メモリ容量は32ワード、入出力は2進数で表示。 動作の検証には、簡単なプログラムをメモリ上に用意し、 それを1ステップごとに実行した結果を表示する。 命令部分はswitch文を使うのはわかるのですが、 2進数による入出力というのができず、全体的にどのようにすれば良いかもわかりません。 どうかお願いします。
>>17 マルチ氏ね
CASL/COMETでも出しとけ
19 :
C++厨 ◆vKuy6bx7T2 :03/01/08 16:21
>>6 スレが立った時間見ろや
3代目な気分もするが気にすんな
>>17 引き篭もりなんでわからん
>>18 サソに従うよろしい。
せめてスレタイに何代目か書いてくれよー。
まあ黙ってうんこ食え
22 :
C++厨 ◆vKuy6bx7T2 :03/01/08 17:03
いちお ! の数でを表そうとしたんだが… わかりにくかった、すまん。
厨がスレ立てんな
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
荒れているところ恐縮ですが質問をしてよろしいでしょうか? int型i×jの配列(2次元)においてある条件に達した成分だけを 消す(表示しない)方法を教えてください。
>>25 用件がよくわからんが、printf() とかに if でもつけたらどうだ?
中傷・犯罪予告するなら今のウチという事ですか・・・・・・・・。
誰か、出るっ、出ますうっ のテンプレでセンスのいいやつ考えて。
角度を0度から360度まで10度おきに変えて、正弦関数sin(x)の値を計算するプログラムの作り方を教えてください。 sin関数を使うとき、引数となる角度の単位はラジアンでお願いします。
#include <stdio.h> #include <math.h> #define PI 3.1415926535 #define rad (dig/360)*2*PI int main() { int dig; double res; for(dig = 0; dig <= 360; dig+=10) { res = sin(rad); } } はい。計算するプログラム。 表示とかしてないけど。
>>31 ありがとうございました。これをもとにがんばらせていただきます。
糞スレワッショイ!!
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
char *str; ・ ・ char型のポインタを宣言したあとに、標準入力からポインタに文字列を格納したいのですが・・・。 scanf("%s",str); だと格納できないと聞きました。(入門書に書いてあった。) なにか、この状況でポインタに文字列を格納する方法はないのでしょうか? 誰かご教授おねがいします。(゜゜)(。。)ペコリ
36 :
名無し募集中。。。 :03/01/09 19:33
>>35 ポインターに文字列を入れようとしてる時点で君は終わっている・・・
>>35 char ch[80];
char *str = ch;
scanf("%s", str);
>>35 初めましてこんにちわ。C++厨です。
Cは忘れましたが適当に
char *str = (char*)malloc(sizeof(char)*256);
scanf("%s", str);
どうでしょうか。
free(str); も忘れないでね、書いてないけど。
エラー対策も忘れんなよ。
41 :
デフォルトの名無しさん :03/01/09 19:57
C言語なのですが・・・・ S<=(P-R)*t/(1-pow(1+t,-n)) という演算をやろうとすると 0で割っています、と言われます。 何故でしょうか? 尚、S,R,P,nはintで、tはdoubleです。
42 :
デフォルトの名無しさん :03/01/09 20:21
ふつうにnが0なのでは? でもぜんぜん書き込めないね
>42 いえ、n=1で始めています。
じゃあ桁あふれで0になるのでないの?
つか double z; z=1-pow(1+t,-n); if(!z) return; S<=(P-R)*t/z; でにげ
>44 この場合、桁あふれを起こさないようにするには Sをdoubleにしておけばいいのでしょうか?
>45 すみません、私の勉強不足で if(!z) return; の意味が分かりません。 理解できたら使ってみます・・・
if(z==0) return; を分かりにくくして「俺C言語得意だぜ」と自己満足する書き方。
以下に記すPerlのサブルーチンayayaに、 a0YaAya56m1a23yaiay5Aka4ya0Ay1AiaY2ata00yata4Yay このような文字列を引数として渡すとその戻り値は何になるか。 $pass = &ayaya('a0YaAya56m1a23yaiay5Aka4ya0Ay1AiaY2ata00yata4Yay'); sub ayaya{ $string = @_[0]; $string =~ s/\d+//g; $string =~ s/aya//ig; return $string; }
>48 自己満足はともかく、勉強になります・・・ おかげさまで解決しました。 下らない質問に付き合っていただき、有難うございました。
S<=(P-R)*t/(1-pow(1+t,-n)) S<=(P-R)*t/(1.0-pow(1.0+t,-n)); ではだめすか?
Visual C++6.0を注文したらVisual C++.netが届いた今日 これでC言語ってコンパイルできるの?
コピペ爆撃はpc3全板の全スレなんだろうか。 スレが読み辛い…。
54 :
超初心者(1/2) :03/01/09 23:07
次のプログラムで全ての辺の数字の和が同じになるようにしたいんです。 これだとうまくいくんですが、私がやりたいのは #define N 9で指定している部分を自分で入力したいというものなんですが 何度やってもうまく行きません…。 助言をお願いいたします。
55 :
超初心者(2/2) :03/01/09 23:08
#include <stdio.h> #define N 9 void main(void) {int hojin[N+1][N+1],i,j,k; if (N%2==0) {printf("エラー!奇数にしてよ\n");} else{ j=(N+1)/2; i=0; for(k=1; k<=N*N; k++) { if(k%N==1) i++; else{ i--; j++; } if(i==0) i=N; if(j>N) j=1; hojin[i][j]=k; } printf("魔方陣(一辺%d)\n",N); for(i=1; i<=N; i++) { for(j=1;j<=N; j++) printf("%4d",hojin[i][j]); printf("\n"); } } }
int hojin[N+1][N+1], ここを動的確保しないとだめ
#include <stdio.h> #include <malloc.h> void main(void){ int n,i,j,k; int *hojin; printf("入力しやがれ:"); scanf("%d", &n); hojin=(int*)malloc(sizeof(int)*(n+1)*(n+1)); if(hojin==NULL) return; if (n%2==0) printf("エラー!奇数にしてよ\n"); else{ j=(n+1)/2; i=0; for(k=1; k<=n*n; k++){ if(k%n==1) i++; else i--; j++; if(i==0) i=n; if(j>n) j=1; *(hojin+i*n+j)=k; } printf("魔方陣(一辺%d)\n",n); for(i=1; i<=n; i++){ for(j=1;j<=n; j++) printf("%4d",(int)*(hojin+i*n+j)); printf("\n"); }} free(hojin); } // こんなかんじ?
二次元配列でつかいたいならこういうのもあり でも確保と開放がちょっとめんどう int **hojin; hojin=(int**)malloc(sizeof(int*)*(N+1)); for(i=0;i<N+1;i++) hojin[i]=(int*)malloc(sizeof(int)*(N+1)); for(i=0;i<N+1;i++) free(hojin[i]); free(hojin);
んじゃ、今俺の手元に届いた、この訴状の中の 原告の主張「内容証明が届いた時点で、名誉毀損を知りえたから、 削除する義務があるはず」というのは、 訴状が届いた時点で削除すれば問題なってことかな。
んじゃ、今俺の手元に届いた、この訴状の中の 原告の主張「内容証明が届いた時点で、名誉毀損を知りえたから、 削除する義務があるはず」というのは、 訴状が届いた時点で削除すれば問題なってことかな。
>>62 違います(w
もう、だめぽ。
君は頭の作りを変えないと理解できないようだ。
訴状でも名誉毀損だと確定してるはずが無いだろう。
だから「認識しえた」といってるんだよ。
その説明は
>>50 あたりだな。
それで規制厳しくして金集めたいのかもね。 書いた奴を特定して差し出せばいいのにね。ネットカフェなら ネットカフェにも問題がある。 このままでは他にも訴えられるだろ。
これ教えて下さい。 5つの数値を入力した時に、その平均、最大値、最小値を求める プログラムを作れ.(実数も計算できるようにする) なお,配列,繰り返し文(3種類のうちどれか) を使用して作成せよ.
猪木!ボンバイエ!(ファイッ!ファイッ!×2)
66 :
& ◆FqjYALgRwE :03/01/10 11:33
猪木!ボンバイエ!(ファイッ!ファイッ!×2)? 猪木でもタツナミでもだれでもいいから、教えてクレイ。
おまえコピペでスレ潰ししたいだけちゃうかと小一時間(略
>>64 えーっと…それくらいが自分でできるようにならなきゃ
Cやる意味ないよ。
Winnyをブラウザで見られるようなCGIをだれか作ってよ。 ていうか仕様さえ教えてくれれば作るからさぁ。。
氏ね犯罪者
いつものやつでしょ、
タイプミス スマソ
名前(アルファベット)五人分入力 ↓ 辞書式に並び替える ↓ "meido.doc"ファイルに書き込む というプログラムを教えてください。 まじ困ってます、お願いします。
system("sort <con >meido.doc");
>>74 できればもうちょい詳しく全体を・・
全くの初心者なもんで。
C++スレだのtemplateスレに書き込むってことはこういうのを期待しているんだと仮定。 int main() { std::multiset<std::string> names; const std::multiset<std::string>::size_type max_num = 5; std::string buf; char c; std::cout << "input names." << std::endl; while(std::cin.get(c)) { if (c == '\n') { if (!buf.empty()) { names.insert(buf); buf.erase(); if (names.size() >= max_num) break; } } else buf += c; } std::cout << std::endl << "output." << std::endl; std::copy(names.begin(), names.end(), std::ostream_iterator<std::string>(std::cout, "\n")); return 0; }
リダイレクトまで書いてやらんと
ファイルに吐くなら std::copy(names.begin(), names.end(), std::ostream_iterator<std::string>(std::ofstream("meido.doc"), "\n")); だな。
79 :
デフォルトの名無しさん :03/01/10 18:57
問題 1234567890123456789の5乗を求めよ。 普通に求めにかかると絶対にオーバーフローしてしまいます。 どうすればいいですか? よろしくお願いします。
QBASICの文字列計算をする
ruby -e 'print 1234567890123456789 ** 5 , "\n"'
>>79 「多倍長計算」 で Google すれば色々見つかるよ。
85 :
デフォルトの名無しさん :03/01/10 21:29
これ解析頼みます int colorAlloc = 256 * sizeof(RGBQUAD); // size of color tables int bitsAlloc = infoHeader.biSize + colorAlloc;//+ infoHeader.biSizeImage; pMapBits = (LPBITMAPINFO)new BYTE[bitsAlloc]; memset(pMapBits,80,bitsAlloc*sizeof(BYTE)); pMapBits->bmiHeader = infoHeader; LPSTR pColor = ((LPSTR)pMapBits + (WORD)(pMapBits->bmiHeader.biSize)); for (i = 0; i < 256; i++) ((WORD*)pColor)[i] = i;
>>85 int型のcolorAllocに256にRGBQUADのサイズをかけてを代入
int型のbitsAllocにinfoHeader.biSizeにcolorAllocを足して代入
以下略
87 :
デフォルトの名無しさん :03/01/10 21:40
詳しく頼みます・・
パレット情報付きBITMAPINFOを構築してるんだろ。 memsetと、最後の、((WORD*)pColor)はパレットの格納に しては妙だけど。
>>312 この野郎!
と言おうと思ったけどIP晒されるのでやめた
N速なんか一番腐った板なんだからちょうどいいんでないの。犯罪者予備軍 うようよいるだろうし
45 :名無しさん@お腹いっぱい。 :02/07/31 16:59 ID:??? よ。 俺はお前を赦さない。 ネットの匿名性を悪用したお前を絶対に赦さない。 たいていのことは金で解決できる。 そう、お前が何処の誰であるかも金さえ積めば分かるのがこの社会のいいところだ。 嘘だと思って笑っていればいい。 俺は人捜しのプロだ。 毎日毎日借金を踏み倒して消えた奴を捜し回ってるんだよ。 ネットの卑怯者を捜したことはないが同じだ。 見つけられないのは金をかけないからだ。 そりゃそうだ。100万しか借金がない奴を100万かけて捜す馬鹿はいない。 今回は、金は問題じゃない。俺はお前を必ず捜し出す。 ホームで1番前には立たないことだ。 階段を降りる時は、まず後ろを見てからにしろ。 これから一生車には乗らない方がいいだろう。 お前やお前の家族に不幸があったら俺を思い出せ。 偶然かもしれないが、俺がやったのかもしれない。 俺はお前が1番大切にしているものを奪ってやる。 子供ができたら気をつけろ。 殺されたくなければ24時間お前の手元に置いた方がいい。 幼稚園にも小学校にも行かせず24時間お前の側に置くべきだ。 川や海に遊びに行くなどもっての外だ。俺がお前の子供を深みに引きずり込んでやる。 娘なら強姦して嬲り殺してやる。 息子なら正視できないような死体にしてお前に届けてやる。 その時は俺を思い出せ。そして自分が犯した愚劣な行為を思い出せ。 その時のお前の顔を拝むのが今から楽しみだ。
92 :
超初心者2(1) :03/01/11 02:58
#include <stdio.h> #include <conio.h> #define KEISAN "==============================================\n" /* 関数のプロトタイプ宣言 */ void data_read(void); void data_disp(void); void the_end(void); /* グローバル変数の宣言 */ int bango[100], kokugo[100], suugaku[100], jyohou[100]; float heikin[100]; int n, i; main() { int k; do{ /* 初期メニュー画面 */ clrscr(); gotoxy(26,3); printf("********* 成績処理 *********\n"); gotoxy(25,5); printf("データファイルの読み込み・・・・・【1】"); gotoxy(25,7); printf("成績一覧表・・・・・・・・・・・・・・・・・・・【2】"); gotoxy(25,9); printf("終わり・・・・・・・・・・・・・・・・・・・・・・・【3】"); gotoxy(25,11); printf("処理番号を入力して下さい"); gotoxy(50,11); scanf("%d", &k);
93 :
超初心者2(2) :03/01/11 02:58
/* ユーザ関数の呼び出し */ switch(k){ case 1:data_read(); break; case 2:data_disp(); break; case 3:data_end() ; break; default: ; break; } }while(k<4); return(0); } /* データファイルの読み込み */ void data_read(void) { char f_name[30]; FILE *fp; int b, k, s, j; gotoxy(20,7); printf("データファイル名を入力して下さい"); scanf("%s", f_name); /* データファイルのオープン */ fp=fopen(f_name, "r"); if(fp==NULL){ printf("ファイルがオープンできません\n"); getch(); exit(0); } /* データの読み込み */ n=1; while((fscanf(fp, "%d%d%d%d", &b, &k, &s, &j)) != EOF){ bango[n]=b; kokugo[n]=k; suugaku[n]=s; jyohou[n]=j; n=n+1; } n=n-1; gotoxy(20,9); printf("データファイルを読みました。\n"); gotoxy(20,11); printf("どれかのキーを押して下さい。\n"); getch(); fclose(fp); }
94 :
超初心者2(3) :03/01/11 02:59
/* 成績一覧表の作成 */ void data_disp(void) { /* 3科目の平均の計算 */ for(i=1; i<=n; i++){ heikin[i]=(kokugo[i]+suugaku[i]+jyohou[i])/3.0; } gotoxy(5,2); printf("*****成績一覧表*****\n"); printf(KEISAN); printf(" 番号 国語 数学 情報 平均\n"); for(i=1;i<=n;i++){ printf("%5d %5d %5d %5d %6.1f\n", bango[i], kokugo[i], suugaku[i], jyohou[i], heikin[i]);} printf(KEISAN); getch(); } /* プログラム終了 */ void the_end(void) { clrscr(); gotoxy(20,9); printf("成績処理の作業を終わります。\n"); gotoxy(20,11); printf("今後に期待します。"); getch(); exit(0); }
95 :
超初心者2(4) :03/01/11 03:01
実行すると、 gotoxy(25,7); printf("・・・覧 \ ^ 8-3.c(25) : Lexical error: undefined escape sequence printf("*****・・・覧 \*****\n"); ^ 8-3.c(80) : Lexical error: undefined escape sequence --- errorlevel 1 というエラーが発生して、実行できません。 どうしても原因がわかりません。よろしくお願いします。
マジレスだが、運子は塩辛かったぞ。
>>95 昔、gccだかでSJISを通そうとしたら
似たような現象が起きた。
多分、日本語を正式にサポートしてないコンパイラを
使っているせいだと思う。
>>97 アドバイスありがとうございます。
この部分を修正したら、コンパイルはできましたが、
gotoxyとclrscrが未定義というエラーがでました。
#include<conio.h>を定義してもなぜか認識されません。
コンパイラの問題でしょうか?
まず、OSとコンパイラを報告しろ。 さらに、そのプログラムはどこから拾ってきた?
100 :
超初心者2 :03/01/11 04:23
>>99 OSはWINDOUS98
コンパイラはDIGITAL MARS
このプログラムは教科書の問題で学生番号と国語、数学、情報の3科目の
成績のデータファイル(ファイル名seiseki.dat)を作成しなさい。
という問題です。
>>92 の下から3から5行目のようなメニュー形式にすることが
条件です。
WINDOUS98 WINDOUS98だって。ゲラゲラ WINDOUS98 WINDOUS98 ゲラゲラ ゲラゲラ ゲラゲラゲラゲラ
ボンタレンに改名汁!!!!
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
105 :
Cがさっぱり :03/01/11 10:03
Cで困ってる事があります。 碁盤目上のマス目を作ってそこに数値を入れるにはどうしたらいいんでしょうか? よろしくお願いします。
2次元配列に入れたら?
107 :
Cがさっぱり :03/01/11 10:31
2次元配列を升目にするやり方がわかりません...
108 :
デフォルトの名無しさん :03/01/11 10:33
二次元配列は升目なんです
>>107 コンソールアプリなら罫線使って作れよ
─┌┐┘└├┬┤┴┼
110 :
Cがさっぱり :03/01/11 10:41
それしか方法ないですよね... わかりました。 すぐに答えてもらってありがとうございました!
2
早いねぇ・・・。
249 名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:52 ID:rLfxQ17l >荒らしとか犯罪のためなの? そす。 246 名前:心得をよく読みましょう[] 投稿日:03/01/08 17:52 ID:BH998yxV >ひろゆき 俺のお気に入りのスレとか荒されてるんだがそういうのにも有効? 257 名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:53 ID:rLfxQ17l いずれは。
┨←なんでこれ付けないの?→┠
115 :
デフォルトの名無しさん :03/01/11 13:25
stdoutってなんだぁ?
標準出力
説→切 (;´Д`)
だいぶ前にあった、2chのシステムを利用したオークションサイトができるという話はどうなったの?
お前らのIPって儲かるんだよな
ああ 生活板のババァですか? ごくろうさまです。
夫やパートナーが、妻や恋人に対して
ふるう暴力〈ドメスティックバイオレンス―DV〉は、
家庭内で起こる暴力のため、なかなか表面化することはありません。
しかし、社会的、経済的、肉体的に優位に立つ男性が、
弱い立場にある女性をさまざまな暴力で支配しようとする行為は、
「夫婦げんか」などの個人的事情、個別的問題の範囲を越え、
女性の人権を侵害する明らかな犯罪です。
http://www.awf.or.jp/boutai/a_01.html
123 :
デフォルトの名無しさん :03/01/12 14:09
( ´∀`)女が男を言葉で貶すのは良いのですか…
124 :
デフォルトの名無しさん :03/01/12 15:40
ポインタの勉強をしていて,&a[i][j]とa+i+jが 違う場所を指すのは何故ですか? #include <stdio.h> int main( void ){ int a[2][3],i,j; for( i = 0 ; i < 2 ; i++ ){ for( j = 0 ; j < 3 ; j++ ){ printf("%p %p\n",&a[i][j],a+i+j); } } return 0; } --結果 0xbfbff8ac 0xbfbff8ac 0xbfbff8b0 0xbfbff8b8 0xbfbff8b4 0xbfbff8c4 0xbfbff8b8 0xbfbff8b8 0xbfbff8bc 0xbfbff8c4 0xbfbff8c0 0xbfbff8d0
126 :
デフォルトの名無しさん :03/01/12 16:26
>>124 コンパイラが"a"という配列名をint3つ分と解釈しているためだと思う。
だから、"a+1"とかすると(intのサイズ)×3×1のアドレスを指す。
>>124 jが1増加すると&a[i][j]は4、a+i+jは12増加している。
ではiは?
128 :
デフォルトの名無しさん :03/01/12 16:36
コンパイルしようとしたら can't open: Stdio.h: No such file or directoryってエラーが出ました。 環境設定が間違ってるのかな?こんな初心者にどうか愛の手を(m_ _m)
>>124 aの型がint [2][3](int (*)[3])の為。
>>128 もう解決済みだと思うが、大文字と小文字を区別しないとダメだと思う。
同じくド素人からの考え。
× #include <Stdio.h>
○ #include <stdio.h>
131 :
デフォルトの名無しさん :03/01/12 18:07
132 :
デフォルトの名無しさん :03/01/12 18:21
wchar_t str[4];に "空"とだけ書いたファイルから fwscanf(fp, L"%s", str); で読み込ませると printf("%x%x", str[0], str[1]) で 8bf3 となって str[0]に2バイト文字として読み込んでくれないのですが どうしてなんでしょうか("空"のSJISコードは8bf3) wcscpy(str, L"空");とすると printf("%x", str[0]);が 7a7a wcscpy(str, "空");とすると printf("%x", str[0]);が f38b となります やりたいことは fwscanf(fp, L"%s", str); if( wcscmp(str, L"空") == 0 ){・・・} といった感じのことをやりたいのですが どうしても上に書いた様になって 条件文が成立してくれません
テキストモードで開いていたファイルを バイナリモードで開いたら fwscanf(fp, L"%s", str); if( wcscmp(str, "空") == 0 ){・・・} がいけるようになりました あと wcscpy(str, L"空") としても wcscpy(str, "空") としても wprintf(L"%s", str); で"空"と表示されないのはどうしてでしょうか
何を今更・・・
642 が核心を突いてるぞ! (トリップ便乗!)
そうそう sports3 サーバ html 化はいります。
138 :
デフォルトの名無しさん :03/01/12 23:53
asdfg と入力してアルファベット順に出力したいんですが どうソートすればいいんですか
139 :
デフォルトの名無しさん :03/01/12 23:56
遣り方は幾つかあると思うが
>>124 >a+i+j
a[1][0],a[0][1]
をどう区別するつもりだ?
forを使うんですか?
>133 >wprintf(L"%s", str); >で"空"と表示されないのはどうしてでしょうか %s (小文字)が原因。ワイド文字は、%S (大文字)。 IP記録実験がはじまってから、変な顔文字が各板に貼られているのを見かけるのですが、 あれはなんの意味があるのでしょうか? ※)スレ違いなこと書いてスマソっす。
名前欄がどっかのスレに書込んだ時のままだった。鬱だ。。。 このスレの41とは関係ないっす。
144 :
デフォルトの名無しさん :03/01/13 01:08
文字列の先頭アドレスを受け取り,関数内で文字列内の文字を昇順にするのはどうすりゃいいですか?
>>144 a[?] = "beadc";
sort(a);
cout << a << endl;
結果:
abcde
て事かい?
146 :
デフォルトの名無しさん :03/01/13 01:32
宿題できなくて困ってるんですけどもしよければどなたかアドバイスしてもらえませんか?? (実行結果) 行を入力して下さい:My name is Yukari. 単語:My 単語:name 単語:is 単語:Yukari 行を入力して下さい:空行 総行数=1 総単語数=4 というふうなプログラムなんです。 とりあえず自分で思いつく限り参考書とかみて下のように 途中まで作ってみてものの何だかよくわからない形に… 単語がみつからなくなるまで呼び出しておいて表示させる方法と その時見つからない場合と見つかった場合のif文での分岐の仕方です。 初心者なのでみづらいかも、ごめんなさい
include<stdio.h> #include<string.h> #include<ctype.h> int wc(char **,char []); void main(){ char tango[250]; char line[50]; char *p,*sp int tango; int line; int sumtango=0; int sumline=0; printf("英文を入力しなさい。"); while(*(sp=gets(line))){ if(){ word=wc(sp) printf("単語:%s",tango); sumword+=word; sumline++; } printf("英文を入力しなさい。"); } printf("総行数:%d\n総単語数:%d",sumline,sumword); } int wc(char **start,char *tango){ if() return(0); else return(1);
149 :
デフォルトの名無しさん :03/01/13 01:42
/* 1から15までの奇数の積を計算してプリントするプログラムを書け */ #include <stdio.h> main() { int i, seki; seki = i = 1; while (i <= 15){ seki = seki * i; printf("%d\n", seki); /* とりあえず */ i += 2; } return 0; } 表題のとおりなんですが、参考書を手引きに問題を解いております。 自分で書いておいて、sekiという変数に1を初期値として代入するというところに 納得がいっておりません。 なにか、うまい書き方はないものでしょうか? 問題だと、1*3*5*・・・とならなければXだと思うのですが 今のままだと1*1*3*5*・・・になってしまいます
for(i=1;i<16;i+=2){printf("%d * ",i);seki*=i;}
>>148 ごめんなさい遅くなって。Cです。
書き直しって何をどうすべきでしょうか?
>>146 宿題に当たってのヒント
流れは(多分)こんな感じになる
■関数main
・変数などの宣言
・構文の入力
◇while(構文は空行でない)
//ここからの処理は様々だけど僕はこうした
・取得した構文の全ての空白位置をint型配列に格納 //単語の判定に便利
・空白行でない文字の塊を1単語とする // 一文字でもOK
・単語を2次元配列に格納していく // コピーの際終端文字を忘れずに
・色々表示
・構文取得
◇
main関数終了
>>149 i = 1;
seki = i;
i += 2;
while (i <= 15) {
seki += i;
i += 2;
}
とでも書いたら。
まぁ別にそのままでもいいと思うが。
>>146 ポインタで文字を扱う良問だと思う。
頑張って”もの”にしてくれ。
>>146 あと
・構文取得はscanf関数を使いなされ(C++だったらcin)
・変数の2重定義は反則
・セミコロンは忘れずに
基本です。
>>146 #include <stdio.h>
#include <string.h>
int main(void)
{
char buf[128], *p;
int wc = 0, lc = 0;
while (1) {
printf("行を入力して下さい:");
gets(buf);
if (buf[0] == '\0') break;
lc++;
p = strtok(buf, " .,");
if (p == NULL) continue;
printf("単語:%s ", p);
wc++;
while (p = strtok(NULL, " .,")) {
printf("単語:%s ", p);
wc++;
}
putchar('\n');
}
printf("総行数=%d 総単語数=%d\n", lc, wc);
return 0;
}
159 :
デフォルトの名無しさん :03/01/13 10:58
#include <windows.h>#include <cstdio> #define DATA_AXIS_NUM 2048 int main(){int x,y,z,t; BYTE **pData; pData=(BYTE**)new BYTE *[DATA_AXIS_NUM]; for(y=0;y<DATA_AXIS_NUM;y++) pData[y]=(BYTE*)new BYTE[DATA_AXIS_NUM]; for(z=y=0;y<DATA_AXIS_NUM;y++) { for(x=0;x<DATA_AXIS_NUM;x++) { if(z==0&&z!=x%256) t=0; if(223<z&&z<230) t=0; pData[y][x]=(BYTE)z++; } z=0; } for(y=0;y<DATA_AXIS_NUM;y++) delete[] pData[y]; delete[] pData; return 0; } (BYTE)z++でz=223辺りからz=255位まで0を返してきますが、メモリ破壊してる? tは条件ブレークポイントの為にあります 環境:VC++.NET&WinXP
160 :
デフォルトの名無しさん :03/01/13 12:01
文字列と文字を入力させいくつ入力した文字が文字列とあってるか カウントしたいんですが教えてください
ソートは比較しながらforや一時保管領域を使うのしかわからんのですが これではできませんかね?
???
基本選択法を用いて文字型配列の先頭アドレスを受け取り、文字列内の文字を 昇順にソートする関数を作れ。表示処理はmain()でというんですが教えてください。 自作関数でソートするのがわからんのです。
>>163 #include <stdio.h>
#include <string.h>
void sort(char ptr[])
{
int i, j, len = strlen(ptr);
char tmp;
for (i = 0; i < len - 1; i++)
for (j = i + 1; j < len; j++)
if (ptr[i] > ptr[j]) {
tmp = ptr[i]; ptr[i] = ptr[j]; ptr[j] = tmp;
}
}
int main(void)
{
char buf[512];
gets(buf);
sort(buf);
puts(buf);
return 0;
}
畜生。
>>163 はマルチだった。答えるんじゃなかった。
マルチ氏ね。
(^^)
167 :
デフォルトの名無しさん :03/01/13 22:05
文字列と文字を入力させいくつ入力した文字が文字列とあってるか カウントし出力したいんですが教えてください
そんなに世の中が嫌いか。 年収600万円に満たない屑でも愉快に暮らせる楽しい世の中じゃないか。 いちいち爆破するな。
お返事頂いて昨日はありがとうございました。
まだ途中なんですけどだんだんわかってきて
このぶんだと期日にはなんとか間に合いそうです。
>>PGバイト(学生)さん
ありがとうございます。ヒント頂いたおかげで
少しずつプログラムっぽくなってきました。
まだ一部わからないのでもうちょっと頑張ってみます。
>>157 さん
模範解答ありがとうございます!
「strtok」使ってやりたかったんですけど
習ってなかったしよくわからなかったんです。
でもこうやればうまく動かせるのですね~。ほんとに勉強になります。
でもそのまま宿題で出しちゃうわけにもいかないし
参考にさせて頂きます。ほんとにありがとうございました
なら、 if(buf[i]==' '||buf[i]==','||buf[i]=='.') [切り分け作業] などとしたら? これでも出来るんじゃない? strtokのかわりにね。
172 :
デフォルトの名無しさん :03/01/14 13:40
度々すみません 名前(アルファベット)五人分入力 ↓ 辞書式に並び替える ↓ "meido.doc"ファイルに書き込む というプログラムなんですが、先日レスしていただいた物より もっと初心者向けのものはないでしょうか? お願いします。
sort < con > meido.doc
174 :
デフォルトの名無しさん :03/01/14 13:50
>>173 さん
ありがとうございます。
できれば全体をおねがいします。
h
すいません c++なんですが、思い通りに動かないのですが、どこがおかしいかおしえてもらえないでしょうか? ここに貼っていいですか?レベルは入門者レベルです
あのー貼っていいですか 一応貼らせて頂きます でもながいので二つにわけます
#include <iostream.h> main() { int goukei, hikazei, kazei, syouhizei, k, sv,tv,uriage, s1, s2,m, n, num, nenrei, bunrui1, bunrui2,seibetu,kubetu1,kubetu2,kubetu3, a, b, c ; goukei = 0; hikazei = 0; kazei = 0; syouhizei = 0; k = 0; uriage = 0; a = 0; b = 0; c = 0; kubetu1 = 0; kubetu2 = 0; kubetu3 = 0; bunrui1 = 0; bunrui2 = 0; s1 = 0; s2 = 0;
cout << "レジプログラムスタート"<<endl; cout << " 買物客情報: "<< endl; while( cin >> tv >> sv) { while( cin >> m >> n) { num = goukei; if ( 50 > m ) hikazei = hikazei + n; else if ( 99 == m) goukei = num; else { kazei = kazei + n; syouhizei = syouhizei + n * 0.05; } }
goukei = kazei + hikazei + syouhizei; cout << " 課税合計額 " << kazei << endl; cout << " 消費税 " << syouhizei << endl; cout << " 非課税合計額 " << hikazei << endl; cout << " 請求額 " << goukei << endl; uriage = uriage + goukei - syouhizei; if ( 1 == nenrei ) { kubetu1 = kubetu1 + goukei; a = a + 1; } else if (2 == nenrei ) { kubetu2 = kubetu2 + goukei; b = b + 1; } else { kubetu3 = kubetu3 + goukei; c = c + 1; }
if ( 1 == seibetu) { bunrui1 = bunrui1 + goukei; s1 = s1 +1; } else { bunrui2 = bunrui2 + goukei; s2 = s2 + 1; } k = k + 1; cout << " 買物客情報: "<< endl; }
cout << " 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 " << endl; cout << " 本日の実績: " << endl; cout << " 来客数: " << k << " 名 " << endl; cout << " 総売上額 " << uriage << " 円 "<< endl; cout << " -------------------------------------------- " << endl; cout << " 年齢層別 " << endl; cout << " 青少年" << a << " 名 " << kubetu1 << " 円 " << kubetu1 / static_cast<float>(uriage) *100<< " % " << endl; cout << " 壮年" << b << " 名 " << kubetu2 << " 円 " << kubetu2 / static_cast<float>(uriage) *100<< " % " << endl; cout << " 高齢者" << c << " 名 " << kubetu3 << " 円 " << kubetu3 /static_cast<float>(uriage)*100 << " % " << endl; cout << " -------------------------------------------- " << endl; cout << " 男女別 " << endl; cout << " 1.男 " << s1 << " 名 " << bunrui1 << " 円 " << bunrui1 / (float)goukei *100<< " % " << endl; // cout << " 2.女" << s2 << " 名 " << bunrui2 << " 円 " << bunrui2 / static_cast<float>(uriage)*100 << " % " << endl; cout << " -------------------------------------------- " << endl; cout << "レジプログラム終了"<<endl; return 0; }
おねがいします
あのさ、まともに聞きたいならどういう風に動作させたいとか どういうエラーが出るとかエラーが出ないならどうなって終了してしまうとか そういったことを書かないとなかなか答えてもらえないよ。
返事も何もないところを見ると釣られたのかな…
187 :
デフォルトの名無しさん :03/01/14 16:14
度々すみません 名前(アルファベット)五人分入力 ↓ 辞書式に並び替える ↓ "meido.doc"ファイルに書き込む というプログラムなんですが、先日レスしていただいた物より もっと初心者向けのものはないでしょうか? お願いします。
丸投げにはそれなりの返答しかされません。 あしからず。
190 :
デフォルトの名無しさん :03/01/14 16:56
2つの三次元ベクトルの数値をそれぞれ入力し、その内積を求め表示するプログラムをお願いしますm(_ _)m
すみません 一番最初のwhileが二回目から勝手に1がcinされてしまって 繰り返しが行われません。 誰も見てくれてないのかと思いちょっと席をはずしておりました、すいませんでした
>>190 #include <stdio.h>
main() {
double ip,a1,a2,a3,b1,b2,b3;/*結果と各成分*/
printf("vect1=: ");
scanf("%f,%f,%f",&a1,&a2,&a3);/*各成分は実数、カンマ区切りとして*/
printf("vect2=: ");
scanf("%f,%f,%f",&b1,&b2,&b3);
ip=a1*b1+a2*b2+a3*b3;/*内積の定義どおり*/
printf("Inner Product= &f9.2\r\n",&ip);
}
ちょっと今からリナちゃんをインスコするので出られませんが おながいします
>>187 #include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
std::vector< std::string > str_list;
for( int i=0; i<5; i++ )
{
std::string tmp;
std::cin >> tmp;
str_list.push_back( tmp );
}
std::sort( str_list.begin(), str_list.end() );
std::ofstream fout("sage.doc");
for( int i=0; i<5; i++ )
{
fout << str_list[i] << '\n';
}
return 0;
}
>>195 「辞書順」で並べ替えて欲しいとかいてあるから、std::lexicographical_compare
を比較叙述関数に与えた方がいいのでは?
197 :
デフォルトの名無しさん :03/01/14 23:28
聞く時は最後に上げるのも礼儀だぞ
198 :
デフォルトの名無しさん :03/01/15 00:56
Cを始めたばっかりの超初心者です。宿題の一番最初でつまずいてます。。 scanf(), fscanf(),sscanf()は使用不可。gets(),fgets(),atoi()は使ってよし。 これで1行の間に任意で入力された数字(最大60桁、各数字間はスペースで区切る) を配列に格納して、数字以外のものがあれば入力しなおさせる。 というものなんですが、そもそもcharの扱いがよく分かりません。 本当に初心者で申し訳ないのですが、ヒントがいただければ嬉しいです。 よろしくお願いします。
>>198 仕様が不明確。
その宿題は、本当にそう書いてあるのか?
>>199 さん
これは宿題のほんの一部分なんですが、厳密にはこのように書いてあります。
「整数はスペースで区切られ、どんな数字でも良い。
ただし、入力行は最大60文字までとする。
もし入力された行に整数以外のものがあれば全ての値を捨て、新たな入力をさせる」
「string.hのファンクション、及びscanf(),fscanf(),sscanf()は使用禁止」
「gets(),fgets()は使っても良い。必要ならatoi()を使え」
不明瞭ならすみません。でもこれ以上は書いてないんです。
>>200 何処にも入力された数字を保存しろと書かれてないと言ってみる
( ̄ー ̄)
>>200 一応char配列の取り扱いの演習だと思って書いた。
入力の区切りはspace以外にtabでもよいようにisspace()で判定する。
(入力の束はtabで縦に揃えてあることが多いから)
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
main() {
int numbers[32];/*1文字おきにspaceのとき30個のint*/
char line[62];/*入力行を得るワーク*/
int n,ix;
while(1) {
if(fgets(line,sizeof line,stdin)==NULL) break;
/*lineには例えば123 -4567 12345...のような文字、最後は0が入る*/
/*strlen(line)でlineの文字数が判るがstr系は使ってはいけないので*/
errfg = 0;
n=0;
while(line[n]) {/*先に不正文字があるかcheck*/
if( !isspace(line[n]) ||
!isdigit(line[n]) ||
line[n]!='-' )
errfg = 1;
n++;
}
204 :
デフォルトの名無しさん :03/01/15 04:34
if( errfg ) { printf("数値エラー行:%s",line); } else {/*整数値と' 'だけのときatoiで変換*/ n=0; ix=0; while(line[n] ) { numbers[ix++]=atoi(line+n); while( !isspace(line[n]) ) { n++; } while( isspace(line[n]) ) { n++; } /* このwhile↑が無いと行末にspaceがある時1個余分に数値0が変換される*/ } for(n=0;n<ix;n++) { /*抽出した数値を表示*/ printf("%6d\r\n",numbers[ix]); } } }/* endwhile*/ /* 空行入力、またはリダイレクト入力ファイルの終わりで終了*/ exit(0); }/* endfunc main*/
>>200 質問の「ほんの一部分」では答えようが無いのでは
例えば「入力ファイルを整形しなさい」と言われただけでは
どう整形していいかわからないと思います
質問の前に、要点を把握して何をすべきか考える必要があるかと
>>200 入力された行に数字かスペース以外が含まれていたら、
もう一度入力させるだけじゃないの?
'-'も含まれるはずだよね。その辺は問題の表現から推察するのがプロ のやることです。atoiを使えとのことからint範囲でよかろう、 scan系使うなとの表現からchar配列操作の演習であろう、と判断。 それでよかった?>198さん。
その程度のコードでプロだとかアマだとか言うなよ 恥ずかしいから
209 :
198・200 :03/01/15 11:59
おそくなって申し訳ありません。
皆さん、どうもありがとうございます。
>>203 ,204
ありがとうございます!詳しく書いていただいてめちゃめちゃ感謝です!!
これからじっくり勉強させていただきます。
>>205 これは後で入力された数字を使った演習が続きます。(比較したり、素数を出したり)
それ以外の部分は本当に関係なくて。。
そこは何とかなるので、書きませんでした。足りなかったですね。すみません。
>>206 ,207
その通りです。
本当に初心者なのでこれから頑張って勉強します。
ありがとうございました。
>>200 こんなのどうだ?
#include <stdio.h>
int buf_chk(char *buf)
{
int spc=1;
while(*buf){
switch(*buf){// 数字か空白なら受理
case '0':case '1':case '2':case '3':case '4':
case '5':case '6':case '7':case '8':case '9':spc=0;break;
case ' ':case '\t':case '\n':spc=1;break;
default:
// 手前に空白がある場合符号も受理
if(spc)if(*buf=='+' || *buf=='-')break;
return 1;
}
buf++;
}
return 0;
}
int main()
{
char buf[60+1+1];
do{
fgets(buf,sizeof(buf),stdin);// 入力
}while(buf_chk(buf));// チェック
return 0;
}
数値も扱うならだめか… あと if(spc&&(*buf=='+' || *buf=='-'))break; だな…
使用禁止か? isdigit isspace
213 :
デフォルトの名無しさん :03/01/15 16:17
初心者なのですが C言語で1から10までの数値を2進数で表示したいのですが どうすればいいのでしょうか。 教えてくださいお願いします。
>>213 Windowsならitoa()でも使え。
itoa()ってなんでしょうか 詳しく教えてください。
浮動小数点でか? うーん困った... ループどうやって回そう
>>213 printf("1=1b,2=10b,3=11b,4=100b,5=101b,6=110b,7=111b,8=1000b,9=1001b,10=1010b\n");
>>213 Windowsでしか動かんぞ。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
char str[50];
for (i = 1; i <= 10; i++) {
itoa(i, str, 2);
puts(str);
}
return 0;
}
(^^)
>>213 unsigned c,r,t,f;main(){while(c<10){r=f=0;for(t=++c;t;t>>=1)r=r<<1|t&1,f++;while(--f) putchar(060|r&1),r>>=1;putchar(' ');}}
1箇所だけわざとバグってるから,直して使え
↑ 直し方わかってもここで言うなよ
>>213 >C言語で1から10までの数値を2進数で表示したいのですが
なつかしーっす。自分もC言語を始めて1、2週間辺りで組んだ経験があるので。
んで、早速、昔作ったライブラリから引っ張ってきてみたっす。
#include <stdio.h>
char *bitpot( char *, int, int );
int main( void )
{
char box[60];
int i;
for( i=1; i < 11; i++ )
fprintf( stderr, "%2d :: [%s]\n", i, bitpot( box, i, 16 ) );
return (0);
}
char *bitpot( char *pot, int c, int bit )
{
int i=0;
if( bit != 16 && bit != 32 )
return (NULL);
for( --bit; bit >= 0; bit-- )
sprintf( &pot[i++], "%1d", ( c >> bit ) & 0x01 );
return (pot);
}
>どうすればいいのでしょうか。
ビットをずらし、マスクをかける程度でいいと思います。
あと、
>>221 のようにビット論理和(?でいいんだったけ)を用いる手もあります。
224 :
デフォルトの名無しさん :03/01/16 04:54
#include <stdio.h> void main(void) { int num=1; printf("***This line has %d bug.***, num); } これってどこが間違ってますか?
> void main(void) ここが間違っている。
226 :
デフォルトの名無しさん :03/01/16 05:01
>>224 printf("***This line has %d bug.***, num); をprintf("***This line has %d bug.***", num); に
こんなもんエラーメッセージから判断できそうなものだけど
228 :
デフォルトの名無しさん :03/01/16 05:25
ボタンを押した時に描画した画が、 フォームを最小化したり、他のウインドウが重なったりした時 消えてしまうのが嫌なんで CMy00000Viewクラスへ「WM_PAINT」のWindowsメッセージハンドラの追加はしました 確かにできたんですが、まだ 大きなプログラムだと処理が遅く、ウィンドウを大きくしたら消える、少し動かさないと絵がでてこない という問題がありました・・ それはどうすればよろしいでしょうか?
ダイアログのピクチャーボックスの絵です SDIです
up_dateリージョンの取り方がよろしくないすね。 InvalRgn(RgnHandle)でup_dateしてください。
InvalRgn(RgnHandle)ってどうやって使うのですか?
つーか InvalRgn() って何?
7×7マスの迷路を解くプログラムを作りたいのですが、教えてください。 外側は全て壁で囲まれていて、迷路の縦方向をi、横方向をjとして、自分の位置を(i,j)で表します。 それから、右、下、左、上の順に進める方向を探す、というものです。
迷路のデータ構造を示してくれ
236 :
とけますか? :03/01/16 13:49
下記のコードで、標準出力に Giko の所持金が正しく表示されるように、 クラス Human を修正せよ。 クラス Giko および main() 内部を変更してはいけない。 #include <iostream> class Human { public: int getMoney() { return 10000; } }; class Giko : public Human { public: int getMoney() { return 10; } }; int main() { Human* usual = new Human(); Human* giko = new Giko(); cout << " usual : " << usual->getMoney() << endl; cout << " giko : " << giko->getMoney() << endl; delete usual; delete giko; return 0; }
仮想関数でないというひっかけか?
>>233 ,-ー─‐‐-、
,! || |
!‐-------‐
.|:::i ./ ̄ ̄ヽi
,|:::i |' (,,゚Д゚)|| < ソース出せ。ゴルァ!!
|::::(ノ 中濃 ||)
|::::i | ソース ||
\i `-----'/
 ̄U"U ̄
"Giko is a Human." とは、あなたも大胆な主張をなさる、、、
>>237 あ、もう正解わかっちゃってますね、多分。
基本なのにわからなかったんです・・・ショック。
#include <iostream.h> もしくは #include <iostream> using namespace std; とする。
仮想デストラクタも忘れずに。
>>236 virtual int getMoney()
>>244 正解 Humanクラスのほうにvirtualを付ける。
謝罪 俺は低レベルでしたm(_ _)mごめんなさい
247 :
デフォルトの名無しさん :03/01/16 16:39
プログラムを入力しそれを16進数で表示するプログラムを 作りたいのですがどうすればいいでしょうか。 こんな感じです。 00000 :23 69 6E 63 6C 75 64 65 20 3C 73 74 64 69 6F 2E #include <stdio. 00010 :68 3E 0D 0A 23 69 6E 63 6C 75 64 65 20 3C 63 74 h>..#include <ct
少なからず自分で組んでみてわからないところを聞いたほうがいいと思うよ。
GIFアニメのフレーム数を取得したいのですが どこを数えればいいんでしょうか? フレーム数だけ取得できればいいので GIFのイメージのヘッダの数数えればよさそうなんですが 調べてもわかりません
>>247 とりあえず、そのフォーマットで1行表示するルーチンね。
void dmp(char *x) {/* 入力 : x = メモリアドレス */
printf("%05ld %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %16s\r\n",
(long)(x&0x0FFFFF),(int)*(x+0),(int)*(x+1),(int)*(x+2),(int)*(x+3),(int)*(x+4),(int)*(x+5),(int)*(x+6),(int)*(x+7)
,(int)*(x+8),(int)*(x+9),(int)*(x+10),(int)*(x+11),(int)*(x+12),(int)*(x+13),(int)*(x+14),(int)*(x+14),x);
}
>>247 それを使ってファイルを編集するmain。このアイデアで加工してね。
main(char *fname) {/*file名:起動時パラメータ*/
FILE *fp;
char wk[258];
int n;
fp=fopen(fname,"r");
while(!feof(fp)) {
fread(wk,1,256,fp);
for(n=0;n<256;n+=16) {
dmp(wk+n);
}
}
fclose(fp);
exit(0);
}
>>252 今そこのぺーじみてたんですが
ImageBlockの始まりのバイナリでも書いてあれば
それを検索できるのですがわからないです・・・
どこかに書いて無いでしょうか?
254 :
素人でスマソ :03/01/16 19:31
タートルグラフィックスのプログラムなのですが、 #include <stdio.h> #include <ctype.h> #include <stdlib.h> int x,y,dx,dy; void put_mark(int x, int y) { move(x-2,y-2); cont(x+2,y+2); move(x+2,y-2); cont(x-2,y+2); move(x,y); } void forward(){ x=x+dx; y=y+dy; cont(x,y); put_mark(x,y); } void left_turn(){ int tmp; tmp=dx; dx=-dy; dy=tmp; } void right_turn(){ int tmp; tmp=dx; dx=dy; dy=-tmp; }
255 :
254の続き :03/01/16 19:32
void analysis(ch) { switch(ch){ case 'F': forward(); break; case 'R': right_turn(); break; case 'L': left_turn(); break; } } void turtle() { int ch; while((ch=getchar())!=EOF){ if(isalpha(ch)) analysis(ch); } } int main() { openpl(); space(-300,-300,300,300); x=0; y=0; dx=0; dy=10; put_mark(x,y); turtle(); closepl(); return 0; } これをいじって数字を入力したらそれたを数値として読み取り、次のコマンドを繰り返し実行するようにしたいのですが、 どこをどうすればいいですか? 例えば、5Fと入力するとFFFFFとおなじ動きをする。
>>254 こんな感じにすればいいと思う。
void analysis(int ch)
{
static int repeat_count = -1; /* < 0 は無効値 */
int i;
if (ch == 'F' || ch == 'R' || ch == 'L') {
if (repeat_count < 0) repeat_count = 1;
for (i = 0; i < repeat_count; i++) {
switch(ch){
case 'F': forward(); break;
case 'R': right_turn(); break;
case 'L': left_turn(); break;
}
}
repeat_count = -1;
} else if (isdigit(ch)) {
if (repeat_count < 0) repeat_count = ch - '0';
else repeat_count = repeat_count * 10 + ch - '0';
}
}
>>247 std::printf("%02X", 255);で2文字幅16進文字が出力されます
cout<<setw(2)<<setfill('0')<<hex<<255; //C++の場合
258 :
254の続き :03/01/16 21:21
259 :
デフォルトの名無しさん :03/01/16 23:05
a = (x, y) のa ってどんな値になるんですか?
>>253 ImageBlockの開始は0x2cと決まってるみたいだけど,
0x2cはImageBlockの開始以外でも当然出現する可能性があるから,
0x2cの数を数えても意味が無い。
素直にHeader読んで, パレット部やデータ部は読み飛ばして,
を繰り返すしかないと思う。
261 :
デフォルトの名無しさん :03/01/16 23:07
262 :
デフォルトの名無しさん :03/01/16 23:09
264 :
デフォルトの名無しさん :03/01/16 23:14
どういう計算になるんですか? 初心者すいません...
カンマ演算子は右端の結果を返す。
naruho.... madi thanx... kanari hazukasii...
とりあえずC限定として。 (C++も演算子オーバーロードしなけりゃ同じはずだけど。) カンマ演算子(名前違ったかも) 式1, 式2, 式3, ... ,式n とあれば、式1から順に評価して式nまで評価する。 この式全体の値としては, 式nの評価値をとる。 だから (x, y) の値は y になる。
これだけだと a = y と書いた方が簡潔なのでカンマ演算子の存在意義が わからんと思う。あんまりいい例が思いつかなかったけど, int a; printf("続けるなら1を止めるなら0を入れて:"); scanf("%d", &a); while (a) { printf("うんこ\n"); printf("続けるなら1を止めるなら0を入れて:"); scanf("%d", &a); } こういうループを考えたとき, 同じ処理を二箇所で書くのは 保守性などの点から不利。そこでカンマ演算子を使って, int a; while (printf("続けるなら1を止めるなら0を入れて:"), scanf("%d", &a), a) { printf("うんこ\n"); } と一箇所に纏めることもできる。 もっといい例あるかもしれんけど俺には思いつかない。ごめん。
>>268 カンマ演算子を使う典型的な例はfor文。
for文の括弧の中のセパレータがセミコロンのため、複数文を書きたい場合
カンマ演算子で区切って書くことが多い。
例 :
int i, j;
for (i=0, j=10; i<=10; ++i, --j)
cout << "10 = " << i << "+" << j << "\n";
>>269 ただその場合「同じ処理を二箇所に書かない」てメリットがないから
無理矢理whileでの例を作っちゃったけど。
でも確かにその方が典型的だね。whileの例が行儀のいい書き方にも見えないし。
一般的に
>>268 のwhileの例のような場合ってどう書くんだろ?
みなさんどもども. そういうように使うんすね. for の中に並べるのは使ってましたが, いざそう書かれると... たった10 文字で凹んじゃいました.
>>272 0回以上のループの場合よ?
あ、
do { if(...) break; ... } while(1);
て書くヤツか。
275 :
デフォルトの名無しさん :03/01/17 01:46
numberで指定した文字列を一文字ずつ表示するプログラムをつくりなさい と言う問題です どこが間違っているのでしょうか? それとこれをfor文に書き換えるとどうなりますか? #include <studio.h> void main (void) { int i=0; char number[21]='12345678901234567890"; while(20 > ++i) { printf("Number is %c \n" , number[i]) } }
#include <studio.h> void main (void) { int i=0; char number[21]="12345678901234567890"; while(20 > i) { printf("Number is %c \n" , number[i++]) } } for ( i = 0; i < 20; i++ )
277 :
デフォルトの名無しさん :03/01/17 02:14
すいませんプロトタイプ宣言でわからないとこがあるんですが /*プロトタイプ宣言*/ int wordput(char **post,char word[]); . int main() . /*関数の定義*/ int wordput(char **start,char *c){ になっている場合、**postと**startと word[]と*cはどう対応してるんでしょうか? プロトタイプでwordput11にはchar **,char[]の型が 必要とコンパイラに知らせたとして 後の関数で**start・*cが何を意味するのかわからないんです
278 :
デフォルトの名無しさん :03/01/17 02:29
>>277 プロトタイプ宣言での変数名に意味はないので、別に
int wordput( char **, char *);
と書けばよいです。関数の定義で
int wordput(char **start,char *c){
と書き始めたなら、関数の中でstartとcを
煮るなり焼くなり好きにしてよいです。
こういう意味じゃなくて?
279 :
デフォルトの名無しさん :03/01/17 02:30
引数では <type> <name>[] と <type> *<name> は同じ意味になります。 (これは厳密には C++ からの仕様だったと思います。 確か C では本来はコンパイルエラーになるはず。 コンパイラによってはエラー吐かないこともあるかもしれんけど) あと、プロトタイプの変数名は特に意味を持ちません。 単にその方が分かりやすいから書いてあるだけに過ぎません。 これだけ分かってればあとは分かると思いまつ。
280 :
デフォルトの名無しさん :03/01/17 02:32
281 :
デフォルトの名無しさん :03/01/17 02:41
>>279 ,278
ありがとうございました!
word[]と*cは同じ意味だったんですね。
形が全然違うように思えて混乱しておりました。
282 :
デフォルトの名無しさん :03/01/17 02:45
>>281 同じ意味だけど、形を変えるのはホントは良くない。
すいません。あともう一つ… 同じプログラムの関数の実体コードに for(; *c; c++;){ というところがあるんですけど char[]に置き換えると *c=word[]; c++;=char[i+1]; なんでしょうか? でもだとしたら終了条件のchar [] はどういう意味なんでしょうか?
>>283 (キミ流の書き方でいくと)
*c=word[0]
285 :
デフォルトの名無しさん :03/01/17 03:07
>>283 >引数では <type> <name>[] と <type> *<name> は同じ意味になります。
っていうのは、両方 <name> はポインタになるということです。
だから、別に何も変える必要はありません。
また、[ ] 演算子と * 演算子は使い方と優先順位が違うだけで
同じ演算子と思って構いません。
以下のコードは全て同じ意味になります。
*c c[0] (c + 2)[-2] *(&(c + 2)[-1]) - 1)
もちろん変数を宣言するときは別物です。> * と [ ] 但し、引数の場合の例外を除きます。
287 :
デフォルトの名無しさん :03/01/17 03:15
>>283 そのforループではchar ss[](と勝手におかせて)という文字列を
ss[0]から順に一文字づつ見ていくものだと思うです。
んでssの終端にはヌル文字が入ってるはずなので、そこで*cが偽になる
という話だと思います。
あと、=は代入演算子に読めるので書き方がマズー。
もう一つ、for()の2番目は終了条件じゃなくて継続条件です。
>>283 ごめんなさい、間違えました
>>285 ポインタになるんですか~
その説明だとすごくわかりやすいです。
ありがとうございました!
× *(&(c + 2)[-1]) - 1) ○ *(&(c + 2)[-1] - 1) カッコの数間違えた。
>> あっ、範囲の指定はforの1番目だったんですよね。失礼しました。
291 :
デフォルトの名無しさん :03/01/17 03:27
>>290 んんー。
for 文は
for(<最初に一度だけ処理する式>; <継続条件式>; <ループの終わりに毎回処理する式>) <ループ処理する文>
ですよ。
>>289 なるほど!間違えてばかりですね。
ごめんなさい
ところで
*(&(c+2)[-1]-1)
cには'+'だけど[]の中では
'-'になるのってどうしてですか?
>>292 +2 して -1 して -1 すれば 0 になるので
c[0] と同じになる、というだけです。
> 間違えてばかりですね。
ドンマイ。
失敗は成功の元。
>>293 そっか!じゃぁ
c+1==[1]ってことでいいんですよね?
ありがとうございます!
がんばって勉強します。
295 :
デフォルトの名無しさん :03/01/17 03:48
>>294 *(c+1) と c[1] が一緒、ね。
さて、寝るか。
>>295 遅いのにホントありがとうございました。
すごく助かりました
おやすみなさい(^^)/
297 :
デフォルトの名無しさん :03/01/17 06:03
float型の数字をchar buf[256]にいれたいんですが、どうすればよいでしょうか。
*buf=(char)myfloat;
(int)*chStr と (int)(*chStr) は同じですか?
300 :
デフォルトの名無しさん :03/01/17 06:15
>>298 なんかその数字は構造体にはいっていて、キャストできないとかいわれるんですが、なんか僕まちがってますかね?
301 :
デフォルトの名無しさん :03/01/17 06:16
>>300 マジか?
つーか、そのコンパイラは、どうやって、実数を代入してるんだ?
まぁ、何にしろ、特殊な環境っぽいので
リファレンスでも適当に読んで代入方法を探してみ
reinterpret_cast とか。
>>299 同じ。
C++ なら int(*chStr) も。
>>298 sprintf(buf, "%f", myfloat);
だろ。
C言語ではキーボードから矢印キーを入力して、 それがどの方向のキーかによって、 それに応じた処理をやらせることはできないんですか? 例えばswitch文あたりで switch(…){ case キーボードの↑: 処理1; break; case キーボードの↓: 処理2; break; …………… } のようなことをしたいのですが。
教えてください Cでsnprintfを自作することになりました。 参考になる資料とかありましたら教えてください。 フリーで使えるソースが何処かに落ちていると良いのですが。
マルチ ハ ヤメテ!!
312 :
デフォルトの名無しさん :03/01/18 00:29
>>310 snprintf(dest,~)
char buf[100000];
sprintf(buf,~);
strncpy(dest,buf,n
>>308 どうやればできますか?
>>309 _getch()という関数はどのヘッダーファイルに定義されてるんでしょうか?
curses.hの中にgetch()があるのは発見したのですが、
それは使えますか?またWM_CHARもどこに定義してあるのか
分かりません。
>>313 俺はよく unistd.h をインクルードしてますね。
Windows 系では conio.h で、#if で分けてます。
WM_CHAR は Windows プログラムのやつです。
>>307 環境依存の問題なのでココでは終了した旨を書き込んでから
自分の使ってる環境のスレで聞い下さい
>>314 WM_CHARはWindowsですか。当方UNIXなので使えないのかな。
>>315 システム依存の話になるんですね。
わかりました。自分のシステムに該当しそうな所のスレで尋ねます。
317 :
デフォルトの名無しさん :03/01/18 11:49
C言語で、まず正の整数を入力し それが素数かどうかを判定するプログラムを教えてください ※ループ回数を最小限にする 今はwhile文までしか習ってないのでwhile文を使うと思うのですが・・・
>>317 「エラトステネスのふるい」で検索してみれ。
320 :
デフォルトの名無しさん :03/01/18 20:33
age
>>319 この場合nまでの素数ではなくてnが素数かどうかって話だからエラストテネス関係ないだろ。
フラグ立てるのにもループしちゃうし。
多分、「nが素数かを確認するには2から√nまでで割り切れないことを確認すればいい」
つー奴のほうだと思うが。
if(n%2==0){printf("not prime.");exit(0);} for(i=3; i<sqrt(n); i+=2) if(n%i==0){printf("not prime.");exit(0);} printf("PRIME No."); じゃ駄目か?
>※ループ回数を最小限にする
これって真面目にやろうとしたら世界最先端レベルの研究になるような。
>>321 のやりかたで多分, 出題者の意向には沿ってるんだろうけど。
324 :
デフォルトの名無しさん :03/01/19 01:01
下に示した菱形をプリントするプログラムを書け アスタリスクを一個だけプリントするprintfと空白を一個だけプリントするprintf() を使用すること。ただし、for反復を可能な限り入れ子にし、printfを最小限に抑えること ----* ---*** --***** -******* ********* -******* --***** ---*** ----* (-はずれ防止のためですスペースに置き換えてください) うーむ、いくら考えても思いつかんす・・・、どなたか救済を!
>>324 > うーむ、いくら考えても思いつかんす・・・
ワラタよY⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。)!!!
326 :
デフォルトの名無しさん :03/01/19 01:15
>1 >Javaと基本情報もやっている. なんかリアルだな.1の台詞はキャラジャナカッタノカ?
>>324 #include <stdio.h>
#define ROWS 9
int main() {
int i;
for ( i = 0; i < ROWS; i++ ) {
int nspaces = (ROWS-1)/2 - i;
int nasts, j;
if ( nspaces >= 0 ) {
nasts = 2*i + 1;
} else {
nspaces = -nspaces;
nasts = 2*(ROWS-1-i) + 1;
}
for ( j = 0; j < nspaces; j++ )
printf( " " );
for ( j = 0; j < nasts; j++ )
printf( "*" );
putchar( '\n' );
}
return 0;
}
328 :
デフォルトの名無しさん :03/01/19 01:19
>>324 余り深く考えるな。
#include <stdio.h>
void a(void){printf("*");}
void s(void){printf(" ");}
void r(void){printf("\n");}
int main(void)
{
s();s();s();s();a();r();
s();s();s();a();a();a();r();
s();s();a();a();a();a();a();r();
s();a();a();a();a();a();a();a();r();
a();a();a();a();a();a();a();a();a();r();
s();a();a();a();a();a();a();a();r();
s();s();a();a();a();a();a();r();
s();s();s();a();a();a();r();
s();s();s();s();a();r();
return 0;
}
>>324 ちっ、遅かったか
int main() {
int i,j ;
for(i=0;i<9;i++){
for(j=0;j<(i-4)*(i-4)*(-5*i*i*i*i*i*i+120*i*i*i*i*i-1046*i*i*i*i+3936*i*i*i-5921*i*i+3336*i+1260)/5040;j++)printf("-");
for(j=0;j<(5*i*i*i*i*i*i*i*i-160*i*i*i*i*i*i*i+2086*i*i*i*i*i*i-14224*i*i*i*i*i+54145*i*i*i*i-113680*i*i*i+120164*i*i-43296*i+2520)/2520;j++)printf("*");
printf("\n");
}
for(;0;)for(;0;)for(;0;)for(;0;)for(;0;)for(;0;)for(;0;)for(;0;)for(;0;)for(;0;)for(;0;)for(;0;);
return 0 ;
}
>>322 sqrt(n) の結果は一時変数に入れといた方がいいし、
+ 0.5 しとかないと数値誤差で死ぬことが。
>>329 良かったら、これがなぜネタだと思ったか教えてくれないか?
>>324 #include <stdio.h>
#include <stdlib.h>
中略
int i, j;
for (i=0; i<9; i++) {
for (j=0; abs(i-4)>j; j++)
printf(" ");
for (j=0; 9-abs((i*2)-8)>j; j++)
printf("*");
puts("");
}
30分かかった。アホだ俺。。。
>>328 さん
別に怒らせるつもりで言ったのではないのです、ごめんなさい。
ただ、forがネストされていず、むやみに関数を定義されていたので
そう思ったのです。
#include<stdio.h> #include<math.h> #define RANGE 4 int main() { int x,y; for(y=-RANGE;y<=RANGE;y++){ for(x=-RANGE;x<=RANGE;x++){ if(abs(y)<=abs(-x+4) && abs(y)<=abs(x+4)) printf("*"); else printf("_"); } printf("\n"); } return 0; }
>>335 > if(abs(y)<=abs(-x+4) && abs(y)<=abs(x+4)) printf("*");
if(abs(y)<=abs(-x+RANGE) && abs(y)<=abs(x+RANGE)) printf("*");
だな。
>>334 怒っていない。勿論ネタだ(w
しかし、それをなぜネタと考えた(見破った?)のかが
純粋に知りたかった(&考えてもらいたかった)だけだ。
たとえば、行数で比べるなら
>>328 のコードは
>>327 よりも少ないし、
関数の定義も3つだけだし(一般にはむやみというレベルではないと思う)
for文も使っていないし、というか
ただ使うだけなら
int main(void)
{
int i,j;
for(i=0;i<1;i++)for(j=0;j<1;j++){
s();s();s();s();a();r();
みたいな手はいくらでも考えられる。
339 :
さとしがヤバイ :03/01/19 02:51
#include<stdio.h> #include<stdilib.h> この部分を補う FILE fout; if((fout=fopen("c:\\rscore.dat","w"))==NULL){ printf("出力ファイルがオープンできない\n"); exit(1); } この部分を補う のこの部分補うっていうのも二つとも教えて下さい お願いします
>>339 #include<stdio.h>
#include<stdlib.h>
int main(void){
FILE *fout;
if((fout=fopen("c:\\rscore.dat","w"))==NULL){
printf("出力ファイルがオープンできない\n");
exit(1);
}
fclose(fout);
printf("友達の宿題を写しました\n先生ごめんなさい\n");
return 0;
}
しかし、ネタ以外に答えようがないね。
324です うす、実は今独習でCを一から勉強して(遊んで?)いるところです。 参考書に”C言語プログラミング(原書C How to Program) プレンティスホール刊” ってやつを使っていまして、その練習問題だったわけです。 結構ためになる本と個人的には思っているのですが、いかんせん練習問題の 数があるにもかかわらず、その模範解答がなく、原作者のHPにもそれらしきもの がなかったのでお聞きしてしまいました。 どうもこう、数学的というか、論理的に解を導くというか、 そういうことが苦手みたいで、こういう一方的な作業がトンと苦手だったりします。 数学なんか高校で0点とったこともあるし(単にアホなだけか んな人間がプログラムするってんですから、じつは338さんの答えが 一番自分に合っていたりするのが、面白いところです。 何か作れるぐらいの技量をもてるようになる暁には、こういう 発想で組めたらいいなー。 あと、”むやみ”というのは私の言葉が明らかに間違っていました。失礼! みなさん、お答えサンクスです
>>342 こんな手もありまつ
int main(){
int i,j,p[]={2046,5630,21886,87390,349526,87390,21886,5630,2046};
for(i=0;i<90;i++)
if((j=((p[i/10]>>(9-i%10<<1))&3))==0)printf(" ");
else if(j==1)printf("*");else if(j==2)printf("\n");
return 0;}
345 :
デフォルトの名無しさん :03/01/19 04:32
>>343 abs() をループ毎に計算させておきながら模範とはよく言った。
abs なんて xor, sub, cmovns で終わりジャン。
#include <math.h> #include <stdio.h> main(){ int i,j; for(i=1; i<=9; i++) { int zettaichi=abs(i-5); for(j=0; j<zettaichi; j++) printf(" "); for(j=0; j<9-2*zettaichi; j++) printf("*"); puts(""); } return 0; }
350 :
デフォルトの名無しさん :03/01/19 11:23
>>349 int i,j;
int zettaichi=abs(i-5);
気持ち悪い。
k <= zettaichi
353 :
デフォルトの名無しさん :03/01/19 11:52
>>342 よ、騙されるな!
本当の模範解答とはこういう奴だ。
#include <stdio.h>
#define N 4
void p(int n){printf("%*c",n+1,'*');while(n++<N)printf("**");printf("\n");}
void f(int n){p(n);if(n){f(n-1);p(n);}}
int main(void){f(N);return 0;}
for使うんじゃなかったっけ?
>>354 真の模範解答とは・・・
真の模範解答とは、問題文の制約を墨守する事ではない。
むしろ問題文自体に含まれる矛盾・不合理を剔抉し、
それを止揚するものでなくてはならない。
また蛇足だが、問題文には for を使わなければならないという制約はない。
もう一度読み返してもらいたい。
>for反復を可能な限り入れ子にし、
即ち
∀x(for文が使用されている(x)⇒出来る限りネストする)
であり、使用しない場合は '真' となることは明白だ。
私としては、むしろ
>アスタリスクを一個だけプリントするprintfと空白を一個だけプリントするprintf()
>を使用すること。
について指摘をしてもらいたかったが。
おいお前ら、漏れならこうするぜ。 ひし形以外に、即、変更可能だ。 #define NL 9 char *a[NL] { "----*", "---***", "--*****" "-*******", "*********", "-*******", "--*****", "---***", "----*", }; int i, j; for (i = 0; i < NL; ++i) { for(j = 0; a[i][j]; ++j) (a[i][j] == '*') ? printf("*") : printf("_"); puts(""); }
357 :
デフォルトの名無しさん :03/01/19 14:02
ツマンネ
>>348 abs は最適化によって for の前に処理される罠。
>>359 俺が言うのもなんだけど, それ本当?
absがグローバル変数を触らないってことが,
どうしてコンパイラにわかる?
煽りじゃなく無知ゆえの疑問です。
あと質問だけど, 高速なabsってどうやって書く? とりあえず環境は VC++6 で。 俺が考えたやつ。 (a ^ (a >> 32)) - (a >> 32)
>(a ^ (a >> 32)) - (a >> 32) 処理系依存と未定義の塊だな
>>362 だから処理系指定したんだけど。。。
定義はint a;です。
普通に a > 0 ? a : -a でいいんでないかと。
未定義は The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand.
>>360 >>359 の言うような最適化をするかどうかは知らんけど...
> absがグローバル変数を触らないってことが,どうしてコンパイラにわかる?
わかる (と言うか教えている) 処理系あるよ。
例えば、VC++ 6.0 だと...
/Oi オプションを指定すると、次の関数が組み込み (インライン) 形式に置き換えられます。
_disable(), _outp(), abs(), memset(), _enable(), _outpw(), fabs(), strcat(), _inp(), _rotl(), labs(), strcmp(), _inpw(), _rotr(), memcp(), strcpy(), _lrotl(), _strset(), memcpy(), strlen(), _lrotr()
となってる。当然コンパイラは、関数の挙動は知ってるわけ。
また、GCC なんかでは拡張機能で、
int abs(int) __attribute__ ((const));
と宣言しておけば、abs() の引数が同じなら、返り値が変わらないことをコンパイラに教えることができる。
> 煽りじゃなく無知ゆえの疑問です。
そう言う疑問を持つことはいいことだ。
>>361 普通に、return a >= 0 ? a : -a; の方が早いと思うぞ。
また、
>>361 は環境に依存してるしね。
>>365 そう言う意味か。ごめん。a
>>31 ってすればいいのか。
ていうかそもそも分岐使った方が速いのか。
>>366 詳しくありがとう。
確かにそういう機能がないと最適化がすぐ手詰まりになりそう。
勉強になりました。
>>>>>>>>>>>>>>>>>>>>>>>>a > 0 ? a : (-1*a)
max(a,-a)
>>366 そういうことです。
まぁ、どのコンパイラでも保証されるわけじゃないんですけどね。
>>367 どうしても、それでやりたいのなら
a>>(sizeof(a)*CHAR_BIT-1)
#define BITSOF(a) (sizeof (a) * CHAR_BIT)
>>371 もともと負数の右シフトが処理系依存だし, それで可搬性が上がったと
いえるかどうか疑問です。
ところで, ちょっとテストしてみました。VC++6とWinXPとPen4-1.6。
実行速度で最適化。めんどいから概要だけ書くと, 実行時間の比率で
正の数のみ入力 -> 分岐:ビット = 2.05:1
負の数のみ入力 -> 分岐:ビット = 2.68:1
くらいの感じ。最適化なしだと1.2:1くらいに差は縮まりますた。
#いや・・・ビットシフト凄いだろってことじゃなく,
#単に個人的な好奇心です。可搬性の問題も認識してます。
#スレ汚しすまそ。
ガウス分布(正規分布)の乱数を発生させる関数を作りたいのですが、 平均と、分散を可変にするようにしたいです。 考えてみたのですが、全くわからず、 検索しても、ソース見つからなかったんで、質問させていただきました。 よろしくお願いいたします。
>>375 ありがとうございます。
早速やってみます。
一応自分で考えたんですが #include <stdio.h> void main(void) { int i, n; i = 2; printf("自然数を入力してください: "); scanf("%d", &n); printf("%dは", n); if (n == 1){ printf("素数ではありません.\n"); } while (i < n){ if (n % i == 0){ printf("素数ではありません.\n"); } i++; } printf("素数です.\n"); }
これだと実行結果に 「3は素数ではありません 素数です」 と出力されてしまします まだreturn文やfor文は習っていないのでそれらは使わずに(それより難しい方法も) 解決する方法はありませんか?
>>317 最後のwhile内のif内で、'i=0;break;'となど付加して、 printf("素数です.\n"); の前で、 if(i!=0) を付けておけば?
>>317 #include <stdio.h>
int main(void)
{
int i, n, flag;
i = 2;
printf("自然数を入力してください: ");
scanf("%d", &n);
printf("%dは", n);
flag = 0;
while (i < n){
if (n % i == 0)
flag = 1;
i++;
}
if(flag==1)
printf("素数ではありません.\n");
else
printf("素数です.\n");
return 0;
}
御願いします。 an=1/nという数列の和が100になるまでの経過を見るという プログラムを作るのですが、 和が10,20,…100となるときのかかった時間を計測する と言う問題で 時間の測り方がわかりません。 誰か教えて下さい。
例えば100000万回くらい繰り返させてストップウォッチ計測 ・・・もっと高度な方法もあるが,始めはここからでしょう
うわすごい回数言ってもた... 間違いだ,悪いが自力でなんとかしろ
>>382 timeGetTime()
Windowsならばの話
>>380-381 無事成功いたしました
こんな初歩的な質問に答えていただきありがとうございました
>>382 プロセスの経過時間でいいならclock()/CLK_TCK
388 :
デフォルトの名無しさん :03/01/21 00:21
>>382 標準関数ならclockというのがある。
clock_t clk;
clk = clock();
処理A
printf("%f sec\n", (clock()-clk)/(float)CLOCKS_PER_SEC);
これで処理Aにかかった時間が秒単位で表示される。
>>382 Unixならcshのtimeか、外部プログラムのtime,
Solarisならrusageもつかえる。
ストップウォッチなどによる計測はだめだよ~。
レスありがとです。 timeやclockを使うとき,和が100になるまでのじかんは start = clock(); for(i = 1;sum<=100;i++) {x=1/i; sum=sum+x;} end = clock(); で計測するとして、和が10や20を超えるまでの時間は どうすればいいのでしょうか? ↑の計算途中でtime取得のタイミングがわからないのですが。
391 :
デフォルトの名無しさん :03/01/21 01:21
j=10; start = clock(); for(i = 1;sum<=100;i++) {if(sum<=j){clk[j/10-1]=clock;j=j+10} x=1/i; sum=sum+x;} end = clock(); こんな感じかな。
>391 サンクス ただ、 if(sum<=j)という条件だと変数clk[]が 膨大な配列になってしまうと思うんですが。 どうでしょう。
>393 サンクス ただ、 clk[j/10-1]=clock;だと 変数clk[]がclock()へのポインタになってしまうと思うんですが。 どうでしょう。
>>394 そうだね。。。ごめんよ。。。
てかそこまでわかってんなら自分で書こうよ。。。
ワラタ
397 :
デフォルトの名無しさん :03/01/21 18:06
宿題やらせろや( ゚Д゚)ゴルァ! 確認しておきたいのですが>all この擦れは、依頼人のスキルの上達なんてことは一切考えず、 他人の宿題をやってしまうスレですよね。 たまに、「本人のためにならないから、後は自分で考えろ!」という パピコがありますが、それは別スレだった筈ですが。
「本人のためにならないから、後は自分で考えろ!」ってのはダメでいいけど、 「面倒臭くなったから、後は自分で考えろ!」ってのはありにして欲しいなぁ。
でも、実際には ・ネタで答えられる → 写していったらアホ ・非常に高度に答えられる → 誰かにやってもらったのバレバレ ・他の質問スレと同じ状況になる → スレ違いだが本人のためにはなる のどれかになってる気が。
401 :
デフォルトの名無しさん :03/01/21 21:35
void CServerSampleDlg::OnRButtonDblClk(UINT nFlags, CPoint point)//接続開始 { _beginthread(&BThread,0,this); CDialog::OnRButtonDblClk(nFlags, point); } void CServerSampleDlg::BThread(LPVOID xParam)//一段目のスレッド { CServerSampleDlg *pDlg; pDlg = (CServerSampleDlg *)xParam; pDlg -> InitServer(); } void CServerSampleDlg::OnReceive() { char cBuffer[256]; recv(m_YourSocket,cBuffer,256,0); m_EditReceive=cBuffer; } void CServerSampleDlg::Thread(LPVOID pParam) { CServerSampleDlg *pDlg; pDlg = (CServerSampleDlg *)pParam; EnterCriticalSection(&g_section); pDlg -> OnReceive(); LeaveCriticalSection(&g_section); //pDlg -> CloseServer(); }
402 :
デフォルトの名無しさん :03/01/21 21:36
BOOL CServerSampleDlg::InitServer() { //接続 WSADATA wWsaData; unsigned short sPort=2000;//ポート番号 CString ClientIPAddr=m_EditSend;//クライアントのIPアドレス if(WSAStartup(MAKEWORD(2,0),&wWsaData)!=0) return FALSE; m_MySocket=socket(PF_INET,SOCK_STREAM,0); if(m_MySocket==INVALID_SOCKET) return FALSE; m_SockAddr.sin_family=PF_INET; m_SockAddr.sin_port=htons(sPort); m_SockAddr.sin_addr.s_addr=inet_addr(ClientIPAddr); memset(m_SockAddr.sin_zero,(int)0,sizeof(m_SockAddr.sin_zero)); int SockAddrSize=sizeof(m_SockAddr); if(bind(m_MySocket,(struct sockaddr *)&m_SockAddr,sizeof(m_SockAddr))!=0) return FALSE; if(listen(m_MySocket,1)!=0) return FALSE; for(;;){ m_YourSocket= accept(m_MySocket,(struct sockaddr *)&m_SockAddr,&SockAddrSize); _beginthread(&Thread,0,this);//二段目のスレッド } return TRUE; }
403 :
デフォルトの名無しさん :03/01/21 21:37
二つのクライアントからソケットでメッセージを受け取れるサーバーを作りたいのですが
>>401-402 のソースだと接続時にassation(たしか)と出てしまいます。
汚いソースで申し訳ないのですが流れ的に変な過程(行)を指摘していただけないでしょうか
よろしくお願いします
>>404 > フローチャートとプログラムおよび処理結果をMS-Wordで編集
ムリだ。
>>404 > #include<iostream.h> // iostream.h:標準入出力ヘッダファイル
> void main(void) // main:メインプログラム
この問題の出題者は頃しておけ。
授業はほとんど出席したけど、結構年いった婆さんが先生で、何言ってるか意味不明でした・・・
>>406 出題コードは痛いが
Wordはフローチャート得意だぞ
全部って言っても2つだけなんだね。がんばれよお前ら。
411 :
デフォルトの名無しさん :03/01/21 22:06
401-402、誰かちょっとでいいので見て・・
>MS-Wordで 組版環境まで指定しないで欲しい。。。
>>409 得意不得意の話じゃないぞ。
回答を Word で作ってうpしろというのか?
>>411 見ることは見たが、漏れには MFC なんぞわからん。
課題(3)のほうはなんとかできましたが、課題(4)のほうがサッパリ(汗
>>417 できたんかよ課題(3)。いまやってたのに。。。
419 :
デフォルトの名無しさん :03/01/21 22:18
>>415 すみません、、誰か分かる方いらっしゃったらよろしくお願いします。
今も考えてるんですが どういう流れにすればよいのか分かりません
>>414 そうだろ
コンパイル通るかどうかとか
実行が正常かどうかは
受講者の領分
講師の仕事は受講者が自分の領分をまっとうする手伝いだ
WordどころかPDFで十分
>>418 サマ
自分のと比べてみたいので是非とも作ってくださるとうれしいです(^^;
>>421 ごめん面倒くさい。
特に変なことしなきゃ誰でも似たような回答に辿り着くと思うので,
俺が書くより421さんのを貼ってみんなに添削してもらったほうが
早くて高クオリティかと。
424 :
デフォルトの名無しさん :03/01/22 13:27
ベクトル{ai}を定義し、y=exp(-x);0≦x≦1をベクトルで表せ をCで組んでもらえませんか?
いや、ぜんぜんわからんわー y=1; for(i=0; i<=100; i++) { yy=y; y=-1*exp(-1*i/100.0); line(x,y,i/100,yy); }
問題の意図がわからん。
428 :
デフォルトの名無しさん :03/01/22 15:48
short int large(short int a,short int b) // 関数値の型と、 { // 仮引数(与えられるデータの型と仮の名)の指定をする if(a>=b) return(a); // 関数値(結果として返されるデータ)の設定 else return(b); } これのサブプログラムを改造して、3個の整数の最大値を求めるサブプログラム「 short int max3(short int a,short int b,short int c)」 を作れっていうんですけどどうやればいいのでしょうか?
サブプルグラムキタ━━━━(゚∀゚)━━━━!!
なめた問題だ
return large(large(a, b), c);
short int max3(short int a,short int b,short int c) { return max(max(a,b),c); }
>>429 short int large(short int a,short int b)
{
return a > b ? a : b;
}
とりあえず434はバカなわけだが
short int max3(short int a,short int b,short int c) { int maxval; maxval=a; if(b>maxval) maxval=b; if(c>maxval) maxval=c; return(maxval); } こんな感じでもOKですか?
メインはこんな感じにしてみました #include<iostream.h> #include "sub.cpp" void main(void) { short int x,y,z,max; cout<<"最初の整数データを入力してください "; cin>>x; cout<<"最初の整数データを入力してください "; cin>>y; cout<<"最初の整数データを入力してください "; cin>>z; max=max3(x,y,z); cout<<max<<endl; }
あう、全部最初のデータになってる(汗
間違ってはない。
440 :
デフォルトの名無しさん :03/01/22 17:25
>ドッキョウ大生タン 最終課題をCで書いてみますた。貼っていい?
float average(int array[],int n) { int i,ave,total=0; for(i=0; i<n; i++) total+=array[i]; ave=total/n; return(ave); } 次は一次元配列の平均を求めるサブプログラム作ってるんですが、これだとエラーがでちゃうんですが、どこが狂ってます?
ありがとうございます、aveとtotalをfloat定義したらできました
444 :
デフォルトの名無しさん :03/01/22 17:33
445 :
しつこくてスマソ :03/01/22 17:45
void analysis(int ch) { static int repeat_count = -1; /* < 0 は無効値 */ int i; if (ch == 'F' || ch == 'R' || ch == 'L') { if (repeat_count < 0) repeat_count = 1; for (i = 0; i < repeat_count; i++) { switch(ch){ case 'F': forward(); break; case 'R': right_turn(); break; case 'L': left_turn(); break; } } repeat_count = -1; } else if (isdigit(ch)) { if (repeat_count < 0) repeat_count = ch - '0'; else repeat_count = repeat_count * 10 + ch - '0'; } } 解説お願いします。 if (repeat_count < 0) repeat_count = 1; for (i = 0; i < repeat_count; i++) ってこのプログラムではどういう働きをしているの?
447 :
C++なんかワカンネ440 :03/01/22 17:56
分割して貼ります。 #include<stdio.h> #include<string.h> #define BUFSIZE (256) #define MAXSTUDENT (100) #define MAXNAME (32) struct student{ char name[MAXNAME], yomi[MAXNAME]; int a, b, sum; }; int yomisort( int, struct student **); int sumsort( int, struct student **); int myfprint( FILE *, int, struct student **, char *);
448 :
C++なんかワカンネ440 :03/01/22 17:56
/* usage: 入力ファイル名 出力ファイル名 を引数で与える。*/ int main(int argc, char *argv[]) { FILE *fi, *fo; int i; struct student *sp[MAXSTUDENT]; if(argc != 3) exit(1); fi = fopen(argv[1], "r"); if(!fi) exit(1); fo = fopen(argv[2], "w"); if(!fo) exit(1); for( i=0; i<MAXSTUDENT; i++){ fgets( buf, BUFSIZE, fi); if( feof(fi) ) break; sp[i] = (struct student *)malloc(sizeof(struct sudent)); if(!sp[i]) exit(1); sscanf( buf, "%s %s %d %d", sp[i]->name, sp[i]->yomi, &(sp[i]->a), &(sp[i]->b)); sp[i]->sum = sp[i]->a + sp[i]->b; } fclose(fi); /* iは読み込めた人数になってる */ myfprint( fo, i, sp, "入力順のデータ"); yomisort( i, sp); myfprint( fo, i, sp, "名前の読みの五十音順"); sumsort( i, sp); myfprint( fo, i, sp, "2科目の平均点の降順"); fclose(fo); }
449 :
デフォルトの名無しさん :03/01/22 17:57
int yomisort( int n, struct student *sp[]){ struct student *dmy; int i, j; for(i=0, i<n, i++){ for(j=n-1; j>=i; j--){ if( strcmp( sp[j]->yomi, sp[j+1]->yomi) > 0){ dmy = sp[j], sp[j] = sp[j+1], sp[j+1] = dmy; } } } return 0; } int sumsort( int n, struct student *sp[]){ struct student *dmy; int i, j; for(i=0, i<n, i++){ for(j=n-1; j>=i; j--){ if( sp[j]->sum < sp[j+1]->sum){ dmy = sp[j], sp[j] = sp[j+1], sp[j+1] = dmy; } } } return 0; }
450 :
C++なんかワカンネ440 :03/01/22 17:58
int myfprint( FILE *fp, int ninzuu, struct student *sp[], char *title) { int i; fprintf(fp, "%s\n", title); for(i=0; i<ninzuu; i++){ fprintf(fp, "%s\t%s\t%d\t%d\n", sp[i]->name, sp[i]->yomi, sp[i]->a, sp[i]->b); } return 0; } ここまで。
451 :
C++なんかワカンネ440 :03/01/22 18:05
問題点 ・C++じゃない。 ・全角文字のソートが激しく不安。 ・エラー処理がいい加減。入力ファイルによっては暴走するかも。 あとは皆さんの力で。 # 鯖重いなあ、、、
サンクスです、今のところ全然分かりませんが、なんとか解析して参考にしたいと思います
>>445 そのプログラムが基本的に「数値を読み込み, 次に実行する機能を指定する文字を
読み込み, 指定された機能を数値の回数だけ実行する」という動作をしていること
はわかる?"150R"を読み込んだらright_turnを150回実行するという様に。
読み込んだ数値はrepeat_countにセットされるから,
for (i = 0; i < repeat_count; i++)
は解説不要だと思う。ここで,
if (repeat_count < 0) repeat_count = 1;
は, "R"のように数値を指定せず機能だけを指定された場合, repeat_countは
初期値の-1になっているから, そのような場合に, 指定の機能を1回だけ実行
させるために設けられている。つまり"R"と"1R"は等価となる。
サブ(rei12sub.cpp) int sum(int array[],int n) { int i,total=0; for(i=0; i<n; i++) total+=array[i]; return(total); } メイン #include<iostream.h> #include “rei12sub.cpp” void main(void) { int data[10],i; cout<<”整数を10個入力しなさい “; for(i=0; i<10; i++) cin>>data[i]; cout<<”10個の整数の合計は “<<sum(data,10)<<” です。” <<endl; } これを参考に 実数のn個の一次元配列を実数の大きさの順に並べ替えるサブプログラム (void sort(float array[],int n)) を作り、試してみよ。 って問題なんですけどどうやればいいのでしょうか? 検討つかないっす(汗
455 :
しつこくてスマソ :03/01/22 18:31
456 :
デフォルトの名無しさん :03/01/22 18:34
$ cd c:\\recycled
>>454 #include “rei12sub.cpp”
これって教師が書いたの?
こんなやり方するくらいなら別ファイルにしない方がマシなような。
/* 大きい順に並べる。最も単純なバブルソートを用いる。 */
void sort(float array[], int n)
{
int i, j;
float temp;
for (i=0; i<n-1; i++)
for (j=0; j<n-i-1; j++)
if (array[j] < array[j+1]) {
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
サンクスです、解析してみます~ 教師が書いたやつです。詳しいテキストは上~のほうに張ってあります。
459 :
デフォルトの名無しさん :03/01/22 23:31
すいません。ちょっとわからないんです。 関数の問題で副作用で値を返すってあったんですが… 副作用って関数の中でmainから与えられた引数の 内容を変えられるってことでいいんでしょうか??
>>459 まずmain()からで無くても意味は同じ
次にCかC++によって意味が変わる
Cであれば、引数はポインタで、そのポインタが指す先が変更される
C++であれば、Cと同じか、引数そのものが変更される
462 :
デフォルトの名無しさん :03/01/22 23:55
463 :
デフォルトの名無しさん :03/01/23 00:02
>>462 詳しい解説ありがとうございます
何となくだったのがちゃんとわかってスッキリしました(^^)
464 :
デフォルトの名無しさん :03/01/23 00:43
文字配列の問題でわかんないところがあるんで教えて下さい char buf[100]; と宣言した配列に gets(buf) でキーボードから文字列を入力して受取り、 その後別の配列で char word[100]; にstrcpyのように文字列全てではなくて 一文字ずつ文字を写すにはどのようにすればいいでしょうか?
>>459-463 厳密には、それだけではない。
関数内で、グローバル変数を変更するとか、関数内の静的変数を変更する等も、副作用の一種です。
また、printf() で画面等に表示するとか、fgets() でキーボードから入力するのも副作用です。
要は、関数において値を返す以外のことは全て「副作用」です。
467 :
デフォルトの名無しさん :03/01/23 01:04
>>465 その場合
while(buf!='\0'){
にするとして、代入はどういうふうにすればできますか?
ポインタ使ってやるんでしょうか…?
char *sp;
sp=buf; を宣言して
word[]=sp;
ってかんじですか?
468 :
デフォルトの名無しさん :03/01/23 01:09
>>464 i=-1;
do{
i++;
word[i]=buf[i];
}while( buf[i] =! '\0' );
469 :
デフォルトの名無しさん :03/01/23 01:11
× =! ○ !=
>>467 >>468 のやり方もしくは,
for (i=0; buf[i]!='\0'; i++)
word[i]=buf[i];
word[i]=buf[i];
だな。0オリジンじゃないと気持ち悪い性格なので俺ならこれで書く。
>>470 それなら
for(i=0;word[i]=buf[i];i++);/* for(i=0;(word[i]=buf[i])!=0;i++); */
472 :
デフォルトの名無しさん :03/01/23 01:36
>>468 >>470 いろんな方法があるんですね~。
でもこんなにすぐ思いつくなんてはすごいですね
同じような形でポインタ使ってもできますか?
char *dp=word,*sp=buf; while(*dp++=*sp++);
質問しても良いですか? C++の実行結果をテキストに出力するやり方なんですけど。
誰も居ない様なので、失礼します。
さっさとC++相談室に行くかあきらめて寝ろよ
475 から 476 まで、その間およそ 5 分。
下記のコードのコンパイルが通るように、新たにコードを追加せよ。 既存の行を変更してはいけない。 class Niwatori { public: void f(Tamago* gocchi) {} }; class Tamago { public: void f(Niwatori* toricchi) {} }; int main() { return 0; }
481 :
デフォルトの名無しさん :03/01/23 12:47
asage
/* class Niwatori { public: void f(Tamago* gocchi) {} }; class Tamago { public: void f(Niwatori* toricchi) {} }; */ int main() { return 0; }
ワラタ
>>480 class Tamago;
という前方宣言を付ければ通る。
template< class Tamago > class Niwatori { public: void f(Tamago* gocchi) {} }; template< class Niwatori > class Tamago { public: void f(Niwatori* toricchi) {} }; int main() { return 0; }
でも、482 が最も模範的な回答の気がする。 つーか、実際そうしないか?
488 :
獨協C++ :03/01/23 17:12
ガーン 同じ大学のヤシに先越されたYO! 漏れはぜんぜんわからない~ 440さんはもう一度来ないかな・・・
>>488 という事は、全く同一のプログラムを提出したくはないと?
490 :
獨協C++ :03/01/23 17:16
>>489 そうなんです。
おばちゃん教授とはいえ、その変のチェック厳しいんですよ~
>>490 ちょっと前レス見てみたけど、課題が簡単だから、どちらにしろよく
似たような解答になると思うよ。
492 :
獨協C++ :03/01/23 17:18
>>491 そうですか。
前回の課題は自力で何とかなったので、
もう少しがんばってみます。
>>492 俺もC++勉強用に書いてみる。出来たら貼るから。
>>492 この2002年度最終問題って奴か?提出明日じゃん。
>>獨協C++ あの少ない人数の中に漏れ以外に2chに張るやつがいたとは(藁 課題は知り合いのプログラマーに解いてもらって突破した あんなの自力じゃ無理だ(汗 ちなみに去年の過去問題手に入れたけど、そっちは恐ろしく簡単だぞ
まぁアレだ、2chに入り浸る暇があるなら勉強しろと
497 :
獨協C++ :03/01/23 17:33
>>495 おぉ、毒協大生タソ降臨!
そうなんだよね。
うちは文系学部(大学)だし、漏れの周りはほぼ全滅。
あのおばさんも説明の仕方わるいしね。
あの婆さんは何いってるか不明だよな ちなみに去年の問題は整数をいくつか入れて合計と平均を表示するプログラムがあって、それの説明 もう一個は最小値を求めるサブプログラムの説明と穴埋め 課題とは裏腹にテスト問題はかなり簡単みたい あとはfloatとかshort int,long int、文字列の扱いについての説明が出てるね
500 :
獨協C++ :03/01/23 17:39
>>498 おーすげぇ~
テスト問題の方が簡単だー
果たして課題は明日までにできるか不安。
しかもこれから塾講のバイトなんですよね。11時過ぎまで。
多分徹夜でつ。
あっ、そろそろ支度しないと・・・
頑張ってください、見当を祈ります。 とりあえずテストは問題28あたりまで自力でやれれば余裕でしょう
502 :
獨協C++ :03/01/23 17:42
>>501 がんばります。
もしかしたら、あした提出してるのは毒狂タンだけかも(w
提出したらバレてしまうなw ちなみに、まるっきり全部やってもらったわけじゃなく、隣で教えてもらってやったから問題ないかな 説明しろって言われるとツライが
雑談なら他所いけ
2人だけの世界に入りました。
いま二人は指輪を選んでます。
仲人は誰?
509 :
デフォルトの名無しさん :03/01/23 19:01
文字列でわかんないトコがあるので質問してもいいですか? 空行を入力するまで文字列の入力を繰り返すのに while(*(sp=gets(buf))) を使うのですがどう働いてるのかわからない。 gets(buf)でchar buf[100]; に文字列を渡してるのだと思うんですけど char *spはどう働いてるんでしょうか? lineの先頭アドレスをもらうってことかと思ったんですけど だとしたら「*」は何を表すんでしょう…
>>502 漏れは教えてもらいながらやったやつがあるから、404氏がやったやつを使っても問題ないかと
511 :
デフォルトの名無しさん :03/01/23 19:15
>>509 「~の内容」
つまりbuf[0]の中身
512 :
デフォルトの名無しさん :03/01/23 19:27
>>511 そっか。buf[0]の中身があればループするってことですね。
ありがとうございました。
あともう一つだけ聞いてもいいですか…?
while(*(sp=gets(line)))で文字列をchar buf[100]にいれて
ループを出たらprintfで出力しなきゃいけないんですが
printf("%s",buf);だと文字列が何も表示されないんです。
%cだと文字が変わっちゃうし…。
どうすればいいでしょう?
>>512 >while(*(sp=gets(line)))で文字列をchar buf[100]にいれて
gets(line)でbufに入力文字列が入るワケがない。
>ループを出たら~~文字列が何も表示されないんです
エンターだけ入力した時にループ終了だから表示されるワケがない。
もしかして、釣られた・・・のか?
514 :
デフォルトの名無しさん :03/01/23 19:47
>>513 あっ!ごめんなさい。間違えました…
while(*(sp=gets(buf)))です。
そっか。whileの中で表示させればよかったんですよね。
ループ終わったら表示させることしか考えてなかった(・・;)
(^^)
516 :
デフォルトの名無しさん :03/01/23 23:24
>>514 つか本当に
while(*(sp=gets(buf)))
なんてやっていいのか?
空行が出てくる前にファイルが終了に到達したらどうなるんだ?
あと、bufに確保している以上の文字数がある行が出てきたらどうなんだ?
という問題もあるがなあ。getsは過去のコードとの互換性を保つためだけに
ある関数で、使っちゃいかんぞ。
517 :
デフォルトの名無しさん :03/01/23 23:24
サイトにアクセスした時点でリモートホストが伝わっているわけだが。
「ボランティア」って言葉がなんとなく胡散臭い感じがする。 それにやってることは白血病の解析の二番煎じだしね。
IPを知られる事が問題なんではなく、無関係なデータを収集されたりせんかというのが
トロイとか入ってたりな
宿題 : 同期・非同期の意味と違いを答えなさい。だって。 いみふめーだな。
どこが意味不明?
523のレスが意味不明
同期: 同じ時期に同じ職場等に就いた人のこと。 非同期: 同期ではない人のこと。
同期: セクース 非同期: オナーニ
セクースなど実際には同期が取れてない罠
>>528 同期を取るためにプロセス間通信を利用します。
「いっていい?」
「まだ」
「いくいくいっしょに~」
同期を取るのに失敗しがちなわけですが・・・
週末だから宿題が無いのか・・・
無いものはないのにあるものはある。 右手はどっち?
533 :
デフォルトの名無しさん :03/01/25 16:53
getsを使い文字列を入力して 大文字の数、小文字の数、数字の数、空白の数、その他の文字数 をそれぞれ求めるプログラムをつくりたいのですが どうしたらいいでしょうかお願いします。
>>533 まずはgetsを使わないようにするところから始めよう!
getsはだめなんですか?
>>535 だめ。getsは互換性のためだけにある関数で、
使っちゃいけない。
宿題です。お願いします。 すべての組み合わせのパターンを表示するプログラムを 作りたいのですが、どうすればいいですか? 例えば、下記のような値が与えられたときは A0, A1 B0, B1 C0, C1 D0, D1, D2 下記のような組み合わせをすべて出力できるようにしたいのですが どうすればいいのでしょうか?表示の順序にはこだわりません。 すべてのパターンを表示していただければどんな順序でもかまいません。 [A0, B0, C0, D0] [A0, B1, C0, D0] [A0, B0, C1, D0] [A0, B0, C0, D1] ・ ・ ・ [A1, B1, C1, D2]
>>537 #include <stdio.h>
static const char *A[] = {"A0", "A1"};
static const char *B[] = {"B0", "B1"};
static const char *C[] = {"C0", "C1"};
static const char *D[] = {"D0", "D1", "D2"};
int main()
{
for(int iA = 0; iA < sizeof(A)/sizeof(A[0]); iA++){
for(int iB = 0; iB < sizeof(B)/sizeof(B[0]); iB++){
for(int iC = 0; iC < sizeof(C)/sizeof(C[0]); iC++){
for(int iD = 0; iD < sizeof(D)/sizeof(D[0]); iD++){
printf("[%s,%s,%s,%s]\n", A[iA], B[iB], C[iC], D[iD]);
}
}
}
}
return 0;
}
>>535 宿題スレってことは学校でgets教えてるってことか。
デタラメ教えやがって。
>getsは互換性のためだけにある関数 とは、どういう意味ですか?
>>537 ちょっと遅くなりましたができたのでアップしておきます。
どなたかこのプログラムをもっとすっきりした形にして下さい。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Atom {
char atom[10][10];
int n;
};
void printall(struct Atom *, int, int, int *);
int main(void)
{
FILE *fi;
char buf[128], *p;
struct Atom a[10];
int i, j = 0, m, cue[10];
if ((fi = fopen("combi.txt", "r")) == NULL) exit(1);
while (fgets(buf, 128, fi)) {
int i = 0;
p = strtok(buf, ", \n");
strcpy(a[j].atom[i++], p);
while (p = strtok(NULL, ", \n"))
strcpy(a[j].atom[i++], p);
a[j++].n = i;
}
printall(a, j, 0, cue); return 0; } void printall(struct Atom *a, int m, int n, int *cue) { int i, j; for (i = 0; i < a[n].n; i++) { if (m - 1 == n) { printf("["); for (j = 0; j < m; j++) { if (j == m - 1) printf("%s", a[j].atom[i]); else printf("%s", a[j].atom[cue[j]]); if (j != m - 1) printf(", "); } printf("]\n"); } else { cue[n] = i; printall(a, m, n + 1, cue); } } }
printall()関数を整理してみた。 void printall(struct Atom *a, int m, int n, int *cue) { int i, j; for (i = 0; i < a[n].n; i++) { if (m - 1 == n) { printf("["); for (j = 0; j < m; j++) if (j == m - 1) printf("%s]\n", a[j].atom[i]); else printf("%s, ", a[j].atom[cue[j]]); } else { cue[n] = i; printall(a, m, n + 1, cue); } } }
strtokって、いくつも1度に指定できるんですね。 (','と' 'と'\n')
回答早いですね。 もう出来ているとは・・・ どうも有難う御座いました。
>>544 一度にいくつも指定できないと、わざわざstrtok()を使う意味がない。
>>533 gets 使うことは全然問題ないよ、気にしない方がいいよ。
ただ、バッファのサイズには気をつけてね。
#include <stdio.h>
#define BUFSIZ 256 // 最大文字入力数+1
char buf[BUFSIZ];
int i, upper, lower, degit, space, other;
gets(buf);
upper = lower = degit = space = other = 0;
for (i = 0; buf[i]; ++i) {
if (buf[i] >= 'A' && buf[i] <= 'Z')
++upper;
else if (buf[i] >= 'a' && buf[i] <= 'z')
++lower;
else if (buf[i] >= '0' && buf[i] <= '9')
++degit;
else if (buf[i] == '_')
++space;
else
++other;
}
printf("upper=%d, lower=%d, degit=%d, space=%d, other=%d\n",
upper, lower, degit, sapce, other);
void printall(struct Atom *a, int m, int n, int *cue) { int i, j; for(i=0; i<a[n].n; i++) { if(m-1==n) { printf("["); for(j=0; j<m-1; j++) printf("%s, ", a[j].atom[cue[j]]); printf("%s]\n", a[j].atom[i]); }else{ cue[n] = i; printall(a, m, n + 1, cue); } } }
>>533 isdigit,islower,isupperなどは使え無いの?
550 :
デフォルトの名無しさん :03/01/25 20:48
age
>>540 今ではgetsは使ってはいけない。
しかし、昔の規格にgetsが入っているため、仕方なく残してある。
getsは意味のあるタブーなのだよ。
552 :
デフォルトの名無しさん :03/01/25 20:49
宿題です。全然分かりません。お願いします。 1文字を正方形の区画と考えて、与えられた図形を 2分割(裏返しも考慮)するプログラムを作成しなさい。 (注:'-'は実際は空白文字です) 例題: ******* ******* **----* **----* ****--* ****--* ------* ------* 回答: ####### #++++++ #+----+ #+----+ #++#--+ ####--+ ------+ ------+
>>547 getsには問題おおありだろ。
バッファのサイズに気をつけてって問題点までちゃんと認識してるじゃねえか。
外から読むときは、すべからく予想外のものがくることを想定すべきだ。
getsのバッファオーバーフローなんかその典型でちょっと気をつければ
防げることじゃないか。
あとなんでctype.hのマクロ群を使わないんだ?
事実上ASCIIだけだからそのコードでもさほど問題ないだろうけど、
移植性に問題あるぞ。それに、普通ctype.hのマクロのほうが速いし、
意図が明確になるし。
何が分からないの?答え出ているじゃん
555 :
デフォルトの名無しさん :03/01/25 20:54
>>552 例題の意味が俺には分からんぶぁい。
あと、CかC++か指定しる!
>>553 >getsのバッファオーバーフローなんかその典型でちょっと気をつければ
>防げることじゃないか。
だから問題ないんでしょ。
宿題ごときに、何ムキになってんの?
557 :
デフォルトの名無しさん :03/01/25 21:06
訂正 宿題→宿題レベル
>>555 図形を2分割
↓
図形を同じ形に2分割
に訂正です。すみません。レプタイルという問題だそうです。
あと、C言語でおながいします。
559 :
デフォルトの名無しさん :03/01/25 21:08
*が3列あったらどうすんお?
>>556 宿題だからこそムキになってる。
こういうのは早いうちから癖つけとかんと。
コンパイル中... BlockArray.cpp Microsoft Visual Studio\LeadBall\BlockArray.cpp(49) : error C2065: 'BLOCK_STOCKRECT' : 定義されていない識別子です。 Microsoft Visual Studio\LeadBall\BlockArray.cpp(49) : error C2109: 配列または、ポインタでない変数に添字が使われました。 Microsoft Visual Studio\LeadBall\BlockArray.cpp(49) : error C2664: 'SetRect' : 1 番目の引数を 'int' から 'const class CRect &' に変換できません。 (新しい機能 ; ヘルプを参照) 理由: 'int' から 'const class CRect' へは変換できません。 コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。 cl.exe の実行エラー LeadBall.exe - エラー 3、警告 0 くだらない質問で申し訳ないんですが、 誰か上の意味を教えてください。
コンパイル中... BlockArray.cpp Microsoft Visual Studio\LeadBall\BlockArray.cpp(49) : error C2065: 'BLOCK_STOCKRECT' : 定義されていない識別子です。 Microsoft Visual Studio\LeadBall\BlockArray.cpp(49) : error C2109: 配列または、ポインタでない変数に添字が使われました。 Microsoft Visual Studio\LeadBall\BlockArray.cpp(49) : ぬるぽ C2664: 'SetRect' : 1 番目の引数を 'int' から 'const class CRect &' に変換できません。 (新しい機能 ; ヘルプを参照) 理由: 'int' から 'const class CRect' へは変換できません。 コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。 cl.exe の実行エラー LeadBall.exe - エラー 2、警告 0、ぬるぽ1
>>553 こいつ、移植性に問題あるって指摘しておきなが、
getsのこと否定してやがる。支離滅裂。
あと、ctype.h がない、C言語のこと知らないんだ。
そういう意味で ctype.h は移植性に問題あるんだけどな。
そのころの習慣で、ctype.h を使わないプログラマーがいるんだろうな。
>560 それでダメダメしか言わないんじゃな。素直に疑問に答えてやればいいのに
>>560 gets使わず何使うの?
まず、それに答えなさいよ。
scanf?ぷっ
>>563 何で移植性に問題ある? gets使わなくても移植性のあるコードかけるだろ。
昔のコードにgets使ってるコードがあるから仕方なく規格に入ってるだけ。
んで、ctype.hがないC処理系なんて前提にしてるの?
そういうレベルなら、getsだって使えない処理系あるぞ。
それどころか、エントリーポイントがmainじゃない処理系だってあるんだがな。
スタックがない処理系だの、大文字しか使えない処理系だの。
そういうレベルの話なのか?
他の図形も考えられます。
****
****
↓
##++
##++
とか。複数考えられるときはそのうちの1種類だけできればいいそうです。
また、分割できない時はその旨のメッセージを表示すればいいです。
>>559 すみません、意味が分かりません。
>>547 です。
仕事でコード書くときにには、is系使いますよ。
それと、gets の代わりに、fgets の stdin ですかね。
でもそういう問題じゃないと思ったんで。
単に質問に答えただけですから、すみません。
>>565 普通fgetsだろう。
じゃあ書いてやるから少し待て。
>>567 なんとなく分かって来たべ。やってみる。
直感的なんだけど、うまく分割できる図形ってのは、かなり限られてるんじゃねーか?
>>563 > あと、ctype.h がない、C言語のこと知らないんだ。
せめて ANSI ぐらいは、想定しようよ。
>>566 も書いてるけど、極論し出すとキリないぞ。
572 :
デフォルトの名無しさん :03/01/25 21:24
573 :
デフォルトの名無しさん :03/01/25 21:24
>WINDOUS98 禿藁 age
>>532 今はじめて気が付いたんだけど、
左と右ってエロだね。
>>571 そしたら gets も問題ないわけで、
gets だけ問題するのはおかしいという意味ですよ。
>>575 getsは移植性が問題なんじゃなくて、バッファ溢れを防げないことが問題なんでしょ。
>>576 そのことは、最初から
>>547 さんは書いてるし、
あと
>>568 の発言もある。
どうもいちゃもん付けてるだけとしか思えないんだけどね。
>>575 たしかにANSIだけを考えてると問題ないかもしらん。
が、getsは使うべきじゃないだろう。
んで、こんな感じ。散々言っといて移植性やらバッファオーバーフローやらに
問題あったらどうしよう(w
#include <stdio.h>
#include <ctype.h>
#define BUFSIZE 256 // 最大文字入力数+1
int main(void) {
char buf[BUFSIZE];
int i, c, upper, lower, degit, space, other;
upper = lower = degit = space = other = 0;
while (fgets(buf, sizeof(buf), stdin)) {
for (i = 0; (c = buf[i]) != '\0' && c != '\n'; ++i) {
if (isupper(c))
++upper;
else if (islower(c))
++lower;
else if (isdigit(c))
++degit;
else if (c == ' ')
++space;
else
++other;
}
}
printf("upper=%d, lower=%d, degit=%d, space=%d, other=%d\n",
upper, lower, degit, space, other);
return 0;
}
綴りの間違いに気づけよっ と、変なところを突っ込んでみる。
>>578 >>533 の言う空白が' 'だけでなく改行や復帰なども含まれるのならc==' 'じゃなくてisspace(c)じゃないか?
>>577 > そのことは、最初から
>>547 さんは書いてるし、
でも、バッファサイズ問題は最終的にはどうしようもないからねぇ。
(
>>547 の BUFSIZ をいくつにしてもあふれる時は、あふれるからね。)
> あと
>>568 の発言もある。
自分が (仕事とは言え) isxxx() とか fgets() 使いながら...
> gets 使うことは全然問題ないよ、気にしない方がいいよ。
> ただ、バッファのサイズには気をつけてね。
と言うのは、ちょっとなんだかなぁと言う感じがしなくもない。
>>579 isdigit() って書いてるのにねぇ...。
>>578 で、256文字以上入力された場合はそれでいいの。
それなら、そんなに大騒ぎせんでもって感じ。(www
>>583 > gets 使うことは全然問題ないよ、気にしない方がいいよ。
> ただ、バッファのサイズには気をつけてね。
バッファーフローの問題以外は、問題ないよって意味にとれましたが。
そもそも質問にはgets使ってあるんだから、問題があるなら出題する方だと思います。
出題する方っていうのは、質問した人じゃなくて、その人の出題した人という意味。 けど、K&R本も問題ありということになるよ。
gets使うと、実行時にも警告メッセージがどんどこ出てきて、 まともに入出力できないから、だめぽ。
ここは宿題スレのはずだったのだが・・・
だって、これ難しいよ。 宿題のレベル超えてねぇか。
どうやって解こうかなあ、と頭のなかで色々いじくってみてる。 実装するの大変そうな案ばかり。
問題と例題と回答からなにをすればいいのかわからん・・・
あ、なんとなくわかったような・・・ +はなにを表しているんだろ
+は空白になった部分ね。
>>590-593 とりあえず、漏れの書きかけの流れ。
1. 問題の図形を c[][]にセット。
2. if(cの面積が奇数) nomatch→exit。
3. cに含まれて、かつ面積が半分な図形aをつくってみる
4. aが連続な多角形になってるか(2つの島に分かれたりしてないか)チェック。
5. b=c-aがaと合同かどうか、回したり裏返したりしてチェック。
こんなんでどうよ?総当たり的な要素が満載ですがw
>>594 ちがうぞ!
解答の#と+が合同になるようにしる!って事だべ。
例題: ******* ******* **----* **----* ****--* ****--* ------* ------* 回答: ####### #$$$$$$ #$----$ #$----$ #$$#--$ ####--$ ------$ ------$ '#','$'で、出来た図形が'同じ'なんだろ。 しっかりしと。
>>595-596 合同になるようにってのは分かったけど、分割した片方は消すのかと思った(先入観)。
難しいねぇ~
なんだ*のまま操作というか、単位図形の集まりとして表現すると、 島になってないかどうかとかいうチェックが入りそうな。 そうじゃなくて境界線で表現して、分割線を入れてみるという線はどうだろう。
>>597 分割した片方を消しても、元の画像と
分割後の画像の差分で簡単に取り出せる
難しいのは、効率良く合同な図形に分ける事
600 :
デフォルトの名無しさん :03/01/25 23:16
学校の宿題なんですが、全然わからなくて困っています・・よろしくお願いしますm(_ _)m ↓が問題文です CPUのシミュレータ CPUの動作を模擬するプログラムを書いてみよう。 CPUは、命令をメモリから取り出し、その命令に基づいた動作をする。 動作は例えばメモリからデータを読み出してCPU内のレジスタにコピーしたり、加減乗除演算をしたりする。 この一連の動きを真似るプログラムを書く。 CPUは、原則としては何でも構わないが、広く使われるIntelのPentium系のCPUは動作が非常に複雑なので、比較的簡単な、実験Iで用いるプロセッサがよいだろう。 動作の検証には、簡単なプログラムをメモリ上に用意し、それを1ステップごとに実行した結果を表示する。
まず、 *の数が分割数(2)で割り切れなければ 処理は終了。 あと、どんな特徴があるんだろう。 # 文字の 縦の長さと 横の長さが違うから # 問題の意味がよく分からんかった。
>>600 それは、物質(CPUそのもの)はいるの?
二つに分けた時に、回転なり裏返しなりして重なればOK!
>>600 実験Iで用いるプロセッサってなに?
レジスタと命令セットがわからない。
605 :
デフォルトの名無しさん :03/01/25 23:26
>>602 いや・・ちょっとわからないです・・m(_ _)m
ほかにも問題があるんで、どれか1つを提出すればいいんですが・・・
↓がほかの問題の1つです
図形処理(イメージの輪郭抽出)
イメージを与えられたとき、その輪郭を抽出することを考えてみよう。
まずは白黒2値で描かれたイメージの輪郭を抽出してみよう。
画像処理の教科書を見ると「輪郭抽出フィルタ」といった描き方がされているかもしれない。
更に、グレースケール(白黒の多階調)やカラーのイメージの場合についても調べて、プログラムしてみると面白いかもしれない。
更に進めて、イメージの一般的な変換(色調の変換、輪郭強調、拡大縮小回転など)を考えてもいい。
>>598 それもいいかも。というか、島チェック時にそういう手法が絶対必要なのか?
>>601 それはすぐに思い付いたので、
>>599 で入れてるけど、
前処理でNoMatchをできるだけ洗い出したいという線で激しく同意。
>>603 激しく外出。
だと思う。先走ったか
図形の分割問題Cマガに前あったな。
いつのか忘れたが。
>>600 スタック型とかCISC,RISCの話?
エミュレータを自作しれということ?
質問が漠然としすぎ。
609 :
デフォルトの名無しさん :03/01/25 23:38
1. 図形領域をの半分を取り出す。 2. それらのマスが全て隣接しているかチェック 3. 合同かチェック 1.2.3. を総当りでやる。でけんことはないけど。
2. の隣接してるかのチェックは、 全てのマスを0とする。 ひとつ取り出し 1 とする。 隣接したマスを 1 すると同時に、再起呼び出し。 0 が残っていたら不連続
1.まず座標を{x、y}の配列にする。 2.任意の一つを取り出し、選択済み配列にいれる。 3.選択済み配列内の座標とxもしくはyが同一で、他方の差の絶対値が1である座標を探し、選択済み配列に加える。 4.2.から繰り返す。 選択済み配列に全ての座標が入れば図形は連続している。 イマイチだな。
サイズが固定なら、「合同になりえる形」 から元の図形を生成した方が楽なんじゃない?
これ、高専の宿題なのか・・・・?
>>614 ごめん。何となく思いつき。
こういう問題は必ず、「分割できる元の図形」 や 「分割した後の図形」 がもつ特徴があるはずだから、
それがわかれば枝狩りできると思った。
重心を求めるのは? 座標の端っこ(4隅?)を求めて素直に真ん中 そこから、対称的に成るものは無いか探す。
分割後の領域の片側をA、もう一方をBする 分割前の領域をA+Bとする マスの並びをM[x][y]で示すことにする。 1. 領域の分割------------------------------- A+Bの領域のマスの個数の桁の2進数を考えるこの桁数をnとする M[][] に何桁目かを代入しておく、マスがないところは-1 for (i = 0; i < 2^n; ++i) { 2進数表記で0と1のビットが同じかチェック 同じ場合 2. を行う } 2. 領域が連続しているかチェック------------- 1.で用意した2進数のビットがたっている領域をAとする 領域A分のフラグのテーブルF[n]を用意して、クリアする。 領域Aのマスの一つを取り出す。 21. そのマスに該当するF[?]に1をセットする。 21a. そのマスの上側のマスを調べて領域Aであれば21を呼び出す 21b. そのマスの右側のマスを調べて領域Aであれば21を呼び出す 21c. そのマスの下側のマスを調べて領域Aであれば21を呼び出す 21d. そのマスの左側のマスを調べて領域Aであれば21を呼び出す 22. f[]のフラグが全て1なら連続だから 3. を行う 3. 領域AとBが合同かチェック---------------- ヘルプ! 注. 21a~dではM[][]を参照してその方向にマスがあるのか、 あれば何桁目かを調べさらに領域Aであるかをチェックする 効率悪いし、領域の面積が64超えると、、、
訂正!ごめんなさい。長いのに。 分割後の領域の片側をA、もう一方をBする 分割前の領域をA+Bとする マスの並びをM[x][y]で示すことにする。 1. 領域の分割------------------------------- A+Bの領域のマスの個数の桁の2進数を考えるこの桁数をnとする M[ ][ ] に何桁目かを代入しておく、領域がないところは-1 for (i = 0; i < 2^n; ++i) { 2進数表記で0と1のビットが同じかチェック 同じ場合 2. を行う } 2. 領域が連続しているかチェック------------- 1.で用意した2進数のビットがたっている領域をAとする 領域A分のフラグのテーブルF[n]を用意して、クリアする。 領域Aのマスの一つを取り出す。 21. そのマスに該当するF[?]に1をセットする。 21a. そのマスの上側のマスを調べて領域Aであれば21を呼び出す 21b. そのマスの右側のマスを調べて領域Aであれば21を呼び出す 21c. そのマスの下側のマスを調べて領域Aであれば21を呼び出す 21d. そのマスの左側のマスを調べて領域Aであれば21を呼び出す 22. f[]のフラグが全て1なら連続だから 3. を行う 3. 領域AとBが合同かチェック---------------- ヘルプ。 注. 21a~dではM[ ][ ]を参照してその方向にマスがあるのか、 あれば何桁目かを調べさらに領域Aであるかをチェックする 効率悪いし、領域の面積が64超えるとね、、、
問題の解法自体は、中学校の数学の教科書の章と章の間の コラムにでも載ってそうな感じだね。>図形の 数学板にでも聞きに行くか。
島チェックの関数、やっと書けたぶぁい。
621 :
オバカさん :03/01/26 02:21
いつぞや他のスレで質問させてもらったんですが、どのスレだか忘れてしまったんで ここで質問したいんですが、回文判定のプログラムです。 いろいろ調べてるうちに以下まではなんとかわかったんですが、 文字列入れるとエラーになってしまうんですがどうやったら 普通に動くんでしょうか? 長くてすみませんが救ってくださいませぇ。 #include <stdio.h> #include <stdlib.h> #include <string.h> int hantei(char s[]); int main(void) { /* ここから下の数行がおかしいと思うんですけど */ char X; printf("文字列を入れてください。:"); scanf("%s",X); if(hantei("X")) printf("Xは回文です。\n"); else printf("Xは回文ではありません。\n"); return (0); } int hantei(char s[]) { int i,j; i=0; j=strlen(s) -1; while(i<j && s[i]==s[j]) { i++; j--; } return i>=j; }
char X[100]
char X; ←これを char X[256]; ←こんな風にする 理由はわかるよね?
if(hantei(X))
かぶった上に見落とし・・・ 鬱・・・
>>621 突っ込みどころが多すぎるが取り敢えずこんな物だろう
char X[260];
printf("文字列を入れてください。:");
scanf("%s",X);
if(hantei(X))
printf("%sは回文です。\n",X);
else
printf("%sは回文ではありません。\n",X);
627 :
デフォルトの名無しさん :03/01/26 02:35
質問だがchar型の数字をint型に変換する方法ってない? #include<stdio.h> #include<string.h> char filename[256]; char filetype[256]; int filenumber=0; strcpy(filename,"test"); strcpy(filetype,".bmp"); strcat(filename,(char)filenumber); strcat(filename,filetype); printf("%s\n",filename); >> test0.bmp と出力させたい…
>>627 sprintf("%s%d.%s", filename, filenumber, filetype);
チゴタ char buf[256]; ... sprintf(buf, "%s%d.%s", filename, filenumber, filetype); printf("%s\n", buf);
631 :
デフォルトの名無しさん :03/01/26 02:54
printf("%s%d.%s\n", filename, filenumber, filetype); でしょ。
>>627 の文にマジレスするとatoiだと思うのは漏れだけですか?
>>632 に更にマジレスさせてもらうと、
atoi は文字列の数字をint型に変換する場合だからちょっと違うかと。
634 :
デフォルトの名無しさん :03/01/26 03:18
数字を文字列に変換する関数を聞いているんじゃない?
じゃあ c-'0' が正解だな。
636 :
デフォルトの名無しさん :03/01/26 03:21
いえいえ (int)c です。
ガンガレ!まかせた。
解答者が質問者になってしまって申し訳ないが、教えれ。 C=A+BのAを生成する関数を書いてくれると助かる。
641 :
デフォルトの名無しさん :03/01/26 03:36
A=C-B
642 :
オバカさん :03/01/26 03:46
>>622 ,623,624,625さんどうもです。
特に625さんののようにやったらうまくいきました。
これで単位獲得まで15分の100から20分の100まで前進しました。
感謝しております。
こんなんはどう?マス目の書かれた紙の上にブロックを置くイメージで。 元の図形の半分大きさの図形を順に生成 -(1) 元の図形と重なるか順に試す -(2) 残った領域と生成した図形が同じか順に試す -(3) おめでとう {0,1} で、そのマスの上にブロックが {ない, ある} を表す。 置くときは xor すると一つのマスにブロックが重なった状態が 0 になりチェックしやすそう。 (0) 元の図形の外に面している辺の位置と長さを記録 (1) 連続した図形を作るのがめんどくさそう。これも外に面している辺の位置と長さを記録。 (2) 元の図形の外辺のどれかと生成した図形の外辺のどれかが一致する(はず)。 辺の長さがぴったりなら(3)へ。反転と回転で最大 2x4=8 パターン繰り返す。 (3) (2) と同じ。残った図形の外辺のどれかと生成した図形の外辺のどれかが一致する。 最大 2x4=8 パターン繰り返す
644 :
デフォルトの名無しさん :03/01/26 09:55
>>640 >C=A+BのAを生成する関数を書いてくれると助かる。
具体的なコードを提示できなくて悪いんだけど、
分割する前の図形の辺は、必ず分割した後の図形の辺(の1部)に
なる事を利用すれば、かなり絞り込めるんじゃないの?
「辺」というよりは、「辺に接するマス」だな。
>>555 とはかなり違う戦略だけど、こんな感じで見つけ出せないかな・・・
1.始点となるマスを任意に決定(下図 A)。
A の場合、上と左の辺が切断した際にも辺となる点に注意(枝狩りに使えそう)。
まだ、下と右の辺がどうなるかは未決定。
2.全てのマスに対して、A と対応づけてみる(下図 a)。
a の場合、右の辺が切断した際にも辺となることが分かっている。
3.A に対して、つながるマスを設定する(下図 B)。
ここで、A の右側は辺にはならない事が決定する。
4.B に対して、対応するマスを決定する(下図 b)。
AB*****
*****ba
**----*
**----*
****--*
****--*
------*
------*
647 :
デフォルトの名無しさん :03/01/26 13:34
random関数で引数を持たせるということはできるのでしょうか? もしできないのならどうすればいいのでしょうか。 コンパイラはg++です。 void Pile::shuffle() { for(int i = 0; i < rest; i++) { int j = random(rest); //動かない原因 int w = indexes[i]; indexes[i] = indexes[j]; indexes[j] = w; } }
#include <stdlib.h> #include <stdio.h> #include <time.h> /* 0 から 99 までの乱数を表示する */ int main(void) { randomize(); printf("Random number in the 0-99 range: %d\n", random (100)); return 0; }
649 :
デフォルトの名無しさん :03/01/26 14:55
647です。 自己解決してしました。 どうもありがとうございました。
//ブロックの追加 Add(pBlock); if(m_bShift){ for(int i = 0; i < GetSize(); i++){ static_cast<CDirBlock*>(GetAt(i))->SetRect(BLOCK_STOCKRECT[i]); } } return pRetObj; BlockArray.cpp(49) : error C2664: 'SetRect' : 1 番目の引数を 'int' から 'const class CRect &' に変換できません。 (新しい機能 ; ヘルプを参照) 理由: 'int' から 'const class CRect' へは変換できません。 コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいです。 このエラーの解決方法教えて~~~~~~~~~~~~
651 :
デフォルトの名無しさん :03/01/26 16:33
高校で突然c言語のプログラムを作る事になりました。 本を読んでもサッパリで、丸投げ状態です。 誰か作って頂けないでしょうか? 課題は以下の通りです。 最短経路のプログラムを作る 入力:グラフと経路の始点、終点 入力フォーマット:'(' '(' 頂点ID 頂点ID ..... ')' '(' '(' 頂点ID 頂点ID 距離 ')' ..... ')' ')' '(' 頂点ID 頂点ID ')' 出力フォーマット:'(' 距離 頂点ID 頂点ID ..... ')'
>>651 「最短経路探索」でググってみれば、
幾らでも有名どころのアルゴリズムが
見つかるような気がするが・・・
一体何が分からないんだ?
ダイキストラあたりが一般的かな? 他のお勧めアルゴリズム漏れもきぼーん。
>>657 マルチが何故いけないか全然理解して無いだろ。
じゃ、放置決定だね。
未だに
>>552 をやってる訳だが。
問題の図形の大きさは8×8までで十分ですか?それなら、
unsigned char c[CHAR_BIT]で一つの平面を表せるんだけど。
>>660 今時、そこまで詰め込まなくても良いと思うけど。
途中経過が膨大になってメモリーを圧迫するようになってから考えれば良いんじゃない。
最初は、わかりやすいように1マス1バイトで良いでしょう。
宿題スレで聞けって言われたんでお願いします。 どうしても出来ないんで御教授お願いします。 n及びn+2がともに素数になる数の内15000以上の最小の数値の組み合わせ nとn+2を求めるプログラムを作成せよ。って問題なんですが お願いします。
方向としては、 15000以上の奇数を追って、素数がでたなら、その数プラス2の値も、 素数判定して、素数なら出力終了、で良いんじゃないの?
>>666 素数判定ってどんな関数を作ればいいんですか?
エラトステネスのふるい
小さい方の数から割っていけば良い。
670 :
デフォルトの名無しさん :03/01/28 13:49
どなたか教えて下さい。 Windows3.1やWindows95やWindows98やWindowsMEでは問題なかったのですけど、 Windows2000やWindowsXPでエスケープシーケンスの処理が入っているEXEファイルを 実行してもエスケープシーケンスの部分が正しく動作しません。 MS-DOSプロンプトの問題なのでしょうか??? 例えば・・・画面に表示されている文字の削除で、 printf("ESC[2J"); または printf("\033[2J"); とやるとWindows2000やWindowsXPでは画面上に [2J とだけ表示されて、 画面上の文字が表示されません。 Windows2000やWindowsXP環境でエスケープシーケンスを入れる時の方法があれば、 教えて欲しいのですが・・・。よろしくお願いします。
Win2000やXPはDOSベースで動いてない。 システムを勉強したほうがいいね。
多分答えは 15137 15139
673 :
デフォルトの名無しさん :03/01/28 13:56
>>671 レスありがとうございます。
では、Win2000やXPはDOSベースで動かすにはどうしたらいいのかご存じですか?
(私はDOSプロンプトで動作するものだと思いこんでいましたので。)
度々申し訳ありませんが、ご回答して頂けると幸いです。
>>672 素数判定はなんとかなりそうなんですが、
双子素数はその素数判定をnとn+2のときを続けてforループか
なんかでやるんですか?
DOSベースでないOSをDOSベースで動かしたいといわれても
676 :
デフォルトの名無しさん :03/01/28 14:05
>>675 無茶っていうことですね。了解しました。
度々のご回答、ありがとうございました。
>>663 好きなようにすれば良い。 出来上がった物を改良して行っても良い。
エスケープシーケンスを使わない方法でやるしかないよ。
>>676 Win2000 or WinXP上からWin95系のエミュレータを動かして実行するっていう荒技もあるけど
それじゃだめなんでしょ?
680 :
デフォルトの名無しさん :03/01/28 14:12
>>678 エスケープシーケンスの代わりになるような方法が他にあるのでしょうか??
>>679 個人的に使う分ですので、それでも構いませんが、どんなツールが必要なのですか?
>>680 やったことないが、CONFIG.NTかなにかに
ANSI.SYS入れても動かないのだろうか<未確認
682 :
デフォルトの名無しさん :03/01/28 14:26
>>681 レスありがとうございます。
ネットでいろいろと調べてみます。
情報提供に感謝します。
684 :
デフォルトの名無しさん :03/01/28 14:30
>>683 貴重な情報ありがとうございます。
早速試してみます。
685 :
デフォルトの名無しさん :03/01/28 14:39
>>684 を試した結果
出来ました。みなさん本当にありがとうございました。
Windows2000環境で、C:\WINNT\system32のconfig.ntファイルに
「device=%SystemRoot%\system32\ANSI.SYS」
の1行を追加してマシンを再起動したら、画面クリアや文字に色がついたりと、
エスケープシーケンスに対応されるようになりました。
>>683 それでも32ビットアプリの場合はエスケープシーケンスは無理という事ですな
>>663 常に同時にnとn+2を判定して行って、
両方とも素数の時に出力しても良いし、
常に最後の一つは格納しておき、
次に求まった物とそれとの差が2なら出力する
というような物でも良い。
それとももう出来たのか?
あげ
689 :
デフォルトの名無しさん :03/01/28 21:50
double x; x=0.0; x+=0.1をfor文で10回まわすと、どうなるの?
VisualStudio 6.0 の Win32 Console Applicationで ある条件が起こったときに、コンソールの背景の色を変更 したいんですが、どうやればいいんでしょう? Webで調べては見たのですが、分かりませんでした。 助けてください。
>>691 SetConsoleTextAttribute()
691です。
>>692 ありがとうございました解決しました!!
>>687 うう。出来ませぬ。ちょっと触りだけでも
プログラムお願いします。
695 :
デフォルトの名無しさん :03/01/29 02:59
>694 for(int i=15001;i+=2) { if( is_prime(i) && is_prime(i+2) ) { printf("%d %d\n", i, i+2); break;} } or int i=3, prev=3; while(i+=2) { if( !is_prime2(i) ) continue; if( i - prev == 2 ) { printf("%d %d\n", prev,i ); break;} prev = i; } みたいな。
698 :
他スレ518 :03/01/29 03:13
質問なのですが、 文字をそのままにして計算させることは可能でしょうか?たとえば、 double a=1.2, b=2.3, c, d; d=a+b+c; で、“d=3.5+c”と計算させたいのです。
そういう計算をするクラスを作ることは不可能ではないだろう
もちろんOK お好きなように
>699-700 できねえっす。。698で書いたふうにするとむちゃくちゃ大きな数になるし。
だから、どんな「文字」を「そのまま」にするかは、コンパイラには 分かりっこねーし、C/C++の委員会もそんな事を規定してない。 MyDouble d, a=1.2, b=2.3, c, d; d = a + b + c; 上の式が自分に都合の良くなるようなMyDoubleを作れって事だ。 #上まあ、テンプレートにしろ、とまでは云わんが。
MyDouble・・初めて聞きました。手もとの教科書にも載ってないし。 テンプレートの意味とかもわかんない厨ですが、 それ使ってがんばってみます。
>>703 ・・・702 の下から 2 行目が読めない?
>>703 お前には当分無理だ。あきらめたほうがいいぞ
クラスって知ってるか?
部類
ネットがらみのプログラムなのでつがパイプ破壊とか言われて止まってしまいます。 int fd1, fd2; int ret; int i; char buf[1024]; char alphabet[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int recvmes() { int select = -1; while( select == -1 ) { ret = read(fd2, buf, 1024); printf("%s ", buf[0]); for( i = 0; i < 26; i++ ) { if( strcmp( &buf[0], &alphabet[i] ) == 0 ) { select = i; break; } printf("%s ", alphabet[i]); } } return select; } アルファベット一字の入力をクライアントに促して サーバ側にはそのアルファベットの番号を返すようにしてるはずなのですが ここに踏み込んだ途端?止まってしまいます。 どうすれば良いでしょうか。
char alphabet[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ↓ char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
すいませぬ…。 今UNIX環境ではないんでチェックができないんです…。 (ガッコならありますが2ch禁止だyoウワァァァァァン) どうなるんでしょうか?
710 :
デフォルトの名無しさん :03/01/29 16:33
文字列を置換するプログラムを作りたいのですが どうしたらいいでしょうか教えてください。 例えば12345と入力したら!”#$%と表示するようなプログラムです。
>>709 alphabet[]の要素数が26ではなく27になる
>710 痴漢用のテーブルもつとか計算式で変換条件書いて求めるとか 変換条件をまずは明確にしよう あとはそれをどう書くかだ
忘れてました… 上のプログラムはサーバ側で、 「パイプ破壊」とか出るのはクライアント側なんです。 ガッコからは遠いので試すのは明日になります…。 今はとりあえず試験勉強をば…ワカラネェヨウワァァァン 三ヽ(`д´)ノ
714 :
デフォルトの名無しさん :03/01/29 22:03
715 :
デフォルトの名無しさん :03/01/30 07:18
>>710 const cvttbl[128]=" (32byte非印字文字分)!\""#$%&'()*+,-./"\
"0123456789:;<=>?@ABCDEF・・(ASCII順に全alpha文字)・・xyz{|}~";
fgets(buff,fp);またはscanf("%s",buff);/*文字列を読む*/
for(i=0;i<strlen(buff);i++)/*各文字を変換*/
buf2[i]=cvttbl[buff[i&127]];
fputs(buf2,fp);またはprintf("%s\n",buf2);
cvttbl[]の中身をいじれば好きな変換にできる。上のは元の文字に変換する
ようになってる。普通は1対1、重複なしになるようにするね。
>>714 未だにやってる訳だが、
30分走らせても例題の答えが出ないプログラムが出来上がった。(当然総当たり)
もうすこしマシになったら公開するべ。
Cソースから、C++ソース内の関数呼べますか?
>>717 そのCソースがC++のコンパイラでコンパイルできるのなら可能。
古いレスだけど。 3を含まない双子素数は必ず、6の倍数の±1になるのでそれを利用するのが吉かと。 或いは、6の倍数+1と+5ね。 #っていうか、私が出題側ならそのくらいは頭を使って欲しい。
>>709 Cygwin入れれば、WindowsでもPOSIX環境が使えるよ。
# 学校のunixは、SSH接続を許可していないの?
723 :
デフォルトの名無しさん :03/01/31 11:20
age
>>719 私が出題側なら、
そういう組み込んだところで大して効率も変わらず、
中途半端で自分では証明もできないような
聞きかじりの知識を使うのや止めて欲しい。
それにしても、6 だけって。
>>726 ををををーー!
感動しますた。ありがとございました。
ところで(もしかしたらうすうす分かっていたかも知れませんが)
実は
>>552 の問題は「宿題」ではなく「ネタ」でした(スンマセン)。
この問題を(コンピュータで解こうと)思いついたとき、
見た目は簡単・内容は明白でありながら、実は意外に厄介そうだったので
このスレに書いたら盛り上がるかなと思い、書いた次第です。
とりあえず、これからじっくりコードを読ませてもらいます。
>>727 大丈夫。うちの大学で学部のときに出題された課題とほとんど同じでしたから。
>>725 証明できないの?
私は数学屋じゃないので厳密じゃないけどこんな感じでしょ?
6以上の整数において、
・6の倍数、6の倍数+2、6の倍数+4は2の倍数なので素数ではない。(自明)
・6の倍数+3は3の倍数ので素数ではない。(自明)
・よって、素数は6の倍数+1、6の倍数+5以外には有り得ない。
・双子素数は6の倍数+5とそれに2を足した数でしか有り得ない。
・これは6の倍数±1とも言える。
>>731 そだね。Good job !
厳密にする場合は、ちゃんと式で書かないとだめだけど、
そのままでも「証明の説明」にはなっていると思うよ。
>>732 私も数学屋じゃないですが、
結局偶数だけじゃなく、3の倍数も弾けるってことでしょ。
数学的には意味のあることかも知れないけど、
それをプログラムに取り込んだところで、
全然 Good job でないと思いますが。
>>734 ループの回数が1/3になるよね。
それに、双子素数の片方の候補を絞り込むにも有利だよね。
736 :
デフォルトの名無しさん :03/02/01 16:39
とんでもない宿題が出ちゃいました 月曜日までにSMTP使ったメール送信プリグラムをVCで作らなければいけません。 しかもC++で、標準関数やSTLを使わずにWinAPIで作らなければいけません。 僕の留年がかかっています。誰かソース書いてください。 よろしくお願いします。
>>736 そんな考えで進級したって、仕方が無いでしょう?
宿題が出たということは、その宿題ができる程度の授業はあったはず。
授業内容と、かけ離れたソースを持っていっても、先生はすぐわかる。
標準関数もSTLも使わずにWinAPIだけ使う講義って何だよ。 Windows でのプログラミングのノウハウを教える授業なんて聞いた事も無いぞ。 俺には単にメーラーのサンプルが欲しくてここで聞いてるだけにしか見えないが?
>>739 >Windows でのプログラミングのノウハウを教える授業なんて聞いた事も無いぞ。
アヴィバ辺りでは?
>>736 >標準関数やSTLを使わずに
exit()も使ってはいけません。
ABヨVAはプログラミング教えんのか?
Perlで書いて提出しちまえや。
>>741 ExitProcess() で良いと思うが。
問題は、スタートアップルーチンで標準関数が呼ばれているのをどうするかだ。
>>744 WinMainCRTStartup() に処理を記述しる。
746 :
デフォルトの名無しさん :03/02/02 15:49
はじめまして 先週の宿題で3科目の点数を3回入力して、その際、 入力できる桁数を3桁までで可変入力とし、 'owari'以外で数値以外のものはエラーとして どの科目でも点数に'owari'と入力した時点で終了し 最後に入力した数字を出力させたいのですが、 可変入力の部分をどのようにすればいいのかわからなくなり 行き詰まってしまいました。この部分はどのように記述すれば いいのでしょうか?よろしくお願いします。
可変入力? variable input?
for(j=0;(kotae[j]=getchar())!='\n';j++); for(j=0;(answer[j]=fgetc(fp))!='\n';j++); printf("%d",strcmp("delta","delta")); if((strcmp(kotae,answer))==0){ printf("\n正解です。\n\n",res++); } else { printf("\n間違いです。\n\n"); printf("答えは%sでした。\n",answer); } 標準入力から入力をもらいそのあとファイルから文字を読み込み それらが一致していたら「正解です。」間違っていたら「間違いです。」 と表示したいのですがこれではなぜかうまくいきません。読み込む文字を 入力したのに正解にはなりません・・・なぜでしょう?誰かご教授お願いします。
>>746 owariは5桁だな
てことは何桁でも入れて、あとで桁数チェックでいいんじゃないの?
1行読む
owariだったら終了
3桁以上だったらもう一回入力
数字以外だったらもう一回入力
>>748 終端にNULLがいるんじゃないの?
#include <stdio.h>
void main( void )
{
char buffer[81];
int i, ch;
printf( "文字列を入力してください: " );
/* 標準入力 "stdin" から 1 行読み込む */
for( i = 0; (i < 80) && ((ch = getchar()) != EOF) && (ch != '\n'); i++ )
buffer[i] = ch;
/* 文字列の終端に NULL 文字を格納 */
buffer[i] = '\0';
printf( "%s\n", buffer );
}
>>750 すいません・・それでもうまくいきません。
もじれつを比較してみるとなぜか、ファイルから読み込むほうの
文字列のほうがながくなっているんです・・・
ちなみにこのプログラムは英単語の練習プログラムの一部です。
お返事どうもです。 下のように記述してみたのですがこの場合、 1桁あるいは2桁の数値を入力してもエラーと判定されてしまい また、■を空白文字とした場合、123■■をエラーとしたいのですがなりませんでした。 i<3としている為、このようになると思うのですが 入力した文字、数字の分だけ判定できるようにするにはどうすればいいでしょうか?
#include<stdio.h> #include<ctype.h> int main(void) { char x[10][10],y[10][10],z[10][10]; int j,i,t=0; printf("3桁までの数字を3個入力。\n"); for(j=0;j<3;) { scanf("%s %s %s",x[j],y[j],z[j]); for(i=0;i<3&&t==0;) { if(isdigit(x[j][i])==0) t++; else if(isdigit(y[j][i])==0) t++; else if(isdigit(z[j][i])==0) t++; else i++; } if(t!=0) { printf("エラー\n");t=0; } else {j++;} } for(i=0;i<3;i++) printf("%s %s %s\n",x[i],y[i],z[i]); return 0; }
誰か助けてください。 C/C++ソースのコメントだけを削除するプログラムを作れという宿題が出ました。 最初は/* or //でチェックONにして*/ or \nまで削除すればいいのかと 思ったのですが、さくっと破綻しました。 もしわかる方がいらっしゃいましたらお願いします。
#include <stdio.h> void in_c_comment( FILE *in, FILE *out ) { int cur, next; next = fgetc( in ); while ( (cur = next) != EOF ) { next = fgetc( in ); if ( cur == '*' && next == '/' ) return; } } void in_cpp_comment( FILE *in, FILE *out ) { int cur; while ( (cur = fgetc(in)) != EOF && cur != '\n' ) ; if ( cur == '\n' ) putchar( '\n' ); }
void commentout( FILE *in, FILE *out ) { int cur, next = fgetc( in ); while ( (cur = next) != EOF ) { next = fgetc( in ); if ( cur == '/' ) { if ( next == '*' ) { in_c_comment( in, out ); next = fgetc( in ); continue; } else if ( next == '/' ) { in_cpp_comment( in, out ); next = fgetc( in ); continue; } } else if ( cur == '\"' ) { /* 文字列リテラル */ fputc( cur, out ); while ( (cur = next) != EOF ) { fputc( cur, out ); next = fgetc( in ); if ( cur == '\"' ) { break; } else if ( cur == '\\' ) { fputc( next, out ); next = fgetc( in ); } } continue; } fputc( cur, out ); } } int main(void) { commentout( stdin, stdout ); return 0; }
>>754 んな読みにくいソース提示しなくていいから、どう破綻したか書いてよ。
コンパイルエラーならその内容、動かしているなら入力と出力を提示するとかさ。
>>754 とりあえず俺が気づいた所は・・・
まずは ungetc() の使い方覚えれ。
あと /* */ の組はただ削除するのではなく、' ' に置き換えるようにすると吉。
削除ってどうやるのでつか?
>>760 >最初は/* or //でチェックONにして*/ or \nまで削除すればいいのかと
の意味での削除だが。
>>750 気持ち悪いからナル文字をNULLって書かないでくれ。
>>751 >750は標準入力だけ示唆したけど、ファイル入力についてはどう思う?
>>753 scanf("%d%d%d"・・・の返却値が3ということで3個の数値というのは
チェックできるよ。それから各数値が0~999か判定すれば3桁の数値か判定できる
>>754 ひょっとしてn行にわたるコメントでダメとか?
>>746 実験程度なら構わないけど、scanf()は危険なんで使わない方がいいかと。
766 :
デフォルトの名無しさん :03/02/03 14:07
------------------------------------------------------------------------- 実数値の小数点以下2桁目が6、7のときだけ+1する8Bの実数型の関数を作れ。 プロトタイプ宣言は不要。引数は1個とし、引数によって関数の結果を返してはいけない。 ------------------------------------------------------------------------- これ解ける人いますか?;;
「8Bの実数型」 ってなんですか? 鉛筆のむちゃくちゃ請いつですか? まさか double の事じゃないよね? つーか、結果を返せとはどこにも書いてないし、 void f(double d) { switch((int)(d * 100.0) % 10) { case 6: case 7: d += 1; break; } } }
問題の問題点 ・実数値を引き数として受け取るかどうか言及されていない。 ・プロトタイプ宣言が不要と言う意味が明確にされていない。 ・引き数によって関数の結果を返す云々というのも意味不明。 ・解ける人がいるかという質問は、他人を馬鹿にしている。 ・マルチポスト あ、問題の意味が理解できるかどうかって質問なのかな?
丸め誤差とか、どうでもええんかな
言及されていないものはどうでもええと解釈しる!! つーか、 > d += 1; これ間違いだな。正しくは +1;
コンパイル通らないやんw
>>773 警告は出るけど通るよ。
確認位してから書こうよ。
警告も出ないよ。
警告レベル上げたら?
警告レベルに拠るだろー、意味を持たないコードがどうたらという警告が出そう
あげたよ
俺のコンパイラは無意味な警告は出さない。
俺のコンパイラは警告は出さない。
俺のコンパイラでは最適化により吐かれたコードは以下の通り。
82 ca 82 e9 82 db ( ´∀`)<ぬるぽ
俺のコンパイラはコードは出さない。
784 :
デフォルトの名無しさん :03/02/03 16:07
fprintfを丸ごとなくすにはどうしたら良いのでしょう。 #define fprintf(a, b)としても、 引数が可変なので、fprintf(stderr, "%d", 1)みたいなのが残ります。 自分のコンパイラでは、 #define fprintf(a, b, ...) はエラーになるみたいです。
マクロはCの関数ではないので、同じルールが当て嵌まるとは限らないわけですね。 既存のソースからfprintf()を消すにはエディタで消すくらいしかないんじゃないかな。 条件で有効無効を切り替えたいなら #define DPRINTF(x) (void) (DEBUG && fprintf x) とでもしておいて、 DPRINTF((stderr, "%d\n", argc)); って感じに使えるけど。
引数に副作用が無いのであれば、大抵 #define fprintf これで事足りる。
__inline int fprintf(FILE *f, const char *fmt, ...){return 1;} または、 #define fprintf ORIGNAL_FPRINTF #include<stdio.h> #undef fprintf __inline int DUMMY_FPRINTF(FILE *f, const char *fmt, ...){return 1;} #define fprintf 1 ? (void)0 : DUMMY_FPRINTF 両方ともVC限定の__inline使ってるけど、可変長引数はインライン展開できないので 下の方が最適化されるかな。
788 :
デフォルトの名無しさん :03/02/03 22:33
ポインタの中に何千行と書かれた文字列、 たとえばデータベースみたいなものから、 指定された文字列を検索して表示させるプログラムは どのように書けばいいわかるかたいらっしゃいますか…? たとえば『国会議事堂』という単語が含まれているポインタに 『会議』という検索を書けたら出てくる、なたいな…
何千行くらいなら、ふつーにwcsstrかけたらいいだろ。
>なたいな… なたいなー! 自分で検索アルゴリズムを実装したいの? だったら、Knuth-Morris-Pratt, Boyer-Moore, Rabin-Karp あたりを調べてみろ
791 :
デフォルトの名無しさん :03/02/03 22:54
>>790 誤:なたいな
正:なみたいな
でした
すみません…
言ってみたいけどいい例が思いつかない、なたいな…
794 :
デフォルトの名無しさん :03/02/04 01:23
おまいら答えてやれよw str使った限りなく短いプログラムでも書いて 力見せ付けてやれ
>>788 grepは知ってる? ツールが要るのじゃなくて検索の演習なのかな?
797 :
デフォルトの名無しさん :03/02/04 09:56
文字列検索プログラムの演習です grep… 調べてみます
798 :
デフォルトの名無しさん :03/02/04 11:00
素数を表示させるプログラムってどうやるんでせうか? forやらifやら覚えたての初心者なんでわからんす
799 :
YAHOO!無料です :03/02/04 11:04
2ヵ月無料キャンペーンにご疑問の方。 ぜひ、メールください。すごい改善策(最新のキャンペーン期 間延長方法) をマジでお教えします。多少の謝礼はいただきますが、確実な 情報でございます。 実質私も現在bbに申し込んでからずっと料金は一銭もかかっ ておりません。 興味ある方はぜひ連絡お待ちしております。 たくさんのお問い合わせお待ちしております。 その他bbに関する全ての疑問に関してお答えいたしますので 、気軽にお問い合わせ ください。連絡心よりお待ちしております。 ※12M+無線LANパックの場合 ・ADSL基本料金 2480 円 ・モデムレンタル量 890 円 ・無線LANパック 990 円 ・NTTの回線使用料 173 円 これがなんとっ!!タダにーー!!! 詳しくは直接メールください。 ryoukinn2003@yahoo.co.jp
>798 このスレよく嫁
>素数を表示させるプログラムってどうやるんでせうか? 「素数を表示」と一言でいっても、どんなプログラムなのか見当がつかない。 例えば、 ・入力された数値が素数かどうか検査するプログラム。 ・入力(指定)された数値以上の最低の素数を表示するプログラム。 ・入力(指定)された範囲の全ての素数を表示するプログラム。 >forやらifやら覚えたての初心者なんでわからんす 大丈夫、それだけ知っていればプログラム(の雛型)はできる。 最初は、 for (1から100まで) { その数か素数かどうか検査する if (素数) { 表示 } } ここから始めればいい。 #勿論、ほんとに1から100までループさせるのは馬鹿馬鹿しいけど。
802 :
デフォルトの名無しさん :03/02/04 13:47
素数を1,3,5、…と表示させるプログラムです(例えば1~100の範囲内) あんまり出来が悪いので課題を課せられてしまいました ご教授よろしくおながいします 素数をどう表現すればいいかで引っかかってます 素数は1かその値でしか割り切れないっていう条件をうまく使うんでせうか…
#include <iostream> using namespace std; int main() { for(int i=3; i<100; i+=2) { int j; for(j=2; j<i; j++) if((i % j)==0) break; if(j==i) cout<<i<<endl; } return 0; } とりあえず
>>802 1は素数じゃない。2は素数。
2,3,5、…
が正しい
そ、そうでした…吊ってきます
cout<<i<<endl; の行が何を意味しているかわからなかったりします forとifとswitchぐらいしか習ってないもんで…^^;
printf("%d\n",i); と同じような感じです。
printfの代わりだったんですね… 他にもputsみたいなのもあるみたいで奥が深いですなぁCは
coutはc++のライブラリであって、cには無関係。 printf()はフォーマットで加工する標準出力用関数、 puts()は加工しない(改行をつける)標準出力用関数。
2以外の素数は全て奇素数なので、素数かどうかの判断も奇数だけ当たればいいね。 ついでに言えば、調べたい数の平方根までで充分だし。
mainの最初に printf("%d ",2); を、追加。
奇素数って言葉は初めて聞いたな
>>788 文字コードセットのケアはしてない。ファイルは標準入力からえる。
#include <stdio.h>
#include <string.h>
#define TARGET "会議"
int main(int argc, char * argv[])
{
char buf[512];
while (fgets(buf, sizeof(buf), stdin))
if (strstr(buf, TARGET))
fputs(buf, stdout);
return 0;
}
実数xを四捨五入して整数jにその結果をセットする ってどう書けばいいですか?
j=(int)(x+0.5)
819 :
デフォルトの名無しさん :03/02/05 14:13
* ** *** **** ***** ****** ******* ******** このような文字模様を描きなさい
* ** *** **** ***** ****** ******* ********
#include<stdio.h> int main() { int i,j; for(i = 0; i < 9; i++) { for(j = 0; j <= i; j++) { printf("*"); } printf("\n"); } } これで満足かい?
>>822 はっきり「クソつまらない」と言ってやるのも愛情かと。
回答例1 printf("*\n**\n***\n****\n*****\n******\n*******\n********\n"); 回答例2 static char const stars[] = "********"; int ic; for (ic = 1; ic < sizeof(stars); ic++) { printf("%.*s\n", ic, stars); }
回答例3 #include<stdio.h> int main(void){static char c[9],i;while(i<8){c[i++]='*';puts(c);}return 0;}
826 :
デフォルトの名無しさん :03/02/06 20:24
予定を登録するプログラムの宿題なのですが期限が迫っているのに分かりません。 どなたか教えてください。 「日付をあらわすクラスDateごとに予定を登録するクラスScheduleBook。 ただしDateクラスは正しい日付であることをチェックすること。」 ↓以下のものが与えられています。 ScheduleBook::ScheduleBook(void);//コンストラクタ int ScheduleBook::register(Date d, char* s);//日付dに予定sを登録 char* ScheduleBook::shoe(Date d, int i);//日付dの予定のi番目を表示 int ScheduleBook::num(Date d);//日付dに登録されている予定の数 よろしくお願いします
>>826 クラスScheduleBookを、どうすればいいんだ?
作るのか?
与えられているって事は、それを使ってなんかするのか?
828 :
デフォルトの名無しさん :03/02/06 21:36
下のハノイの搭のプログラムに対して、円盤を1枚移動するたびに棒A~Cの状態を表示する関数を定義して改良せよ。 円盤の状態を2次元配列(グローバル変数でよい)表現し、最初の要素を棒の番号とし、2番目の要素にそれぞれの棒に 積まれた円盤の番号を格納するとよい。必要であれば、円盤の移動に応じて2次元配列の内容を変更する関数を定義するとよい。 #include <stdio.h> hanoi(char src, char dst, char tmp, int n){ if (n > 1) { hanoi(src, tmp, dst, n-1); hanoi(src,dst,tmp,1); hanoi(tmp,dst,src,n-1); } else{ printf("move from %c to %c\n",src,dst); } } main(){ int n; printf("input number of discs "); scanf("%d", &n); hanoi('A', 'B', 'C',n); }
829 :
デフォルトの名無しさん :03/02/06 21:38
上の問題の実行例です。 input number of discs 2 A:21 B: C: move from A to C A:2 B: C:1 move from A to B A: B:2 C:1 move from C to B A: B:21 C:
#include <stdio.h> int s;// diskの枚数 int towerinfo[3][1024]; // TOWERにどの円盤が入ってるか show_tower(){ int i,j; for(i=0;i<3;i++){ printf("%3d : " , i); for(j=0;j<s;j++){ if(towerinfo[i][j] == 1 ) printf("%3d" , j); } printf("\n"); } }
hanoi(int src, int dst, int tmp, int n , int m){ if (n > 1) { // 山の塊で考えて hanoi(src,tmp,dst,n-1 , m+1 ); // 自分よりも小さい山を移動 hanoi(src,dst,tmp,1 , m ); // 自分を移動 hanoi(tmp,dst,src,n-1 , m+1 ); // 自分よりも小さい山を移動 }else{ // DISKが1枚ならちゃんと処理をする // 具体的には、SRC番目のTOWERからDST番目のTOWERにmという円盤が移動 towerinfo[src][m] = 0; towerinfo[dst][m] = 1; printf("disk %d is moved from %d to %d \n",m,src,dst); show_tower(); } }
main(){ int i,j,k; int n; printf("input number of discs "); scanf("%d", &n); s=n; for(i=0;i<3;i++)// まず最初に、タワーの初期化 for(j=0;j<n;j++) towerinfo[i][j]=0; for(j=0;j<n;j++) towerinfo[0][j]=1; // 次に最初のタワーに全部の円盤を乗せる show_tower(); hanoi(0, 1, 2 , n ,0); }
後は自分でやっとくれー ついでに、0をA、1をBと表示するには、'A' + i という裏技が使える。 これは文字コードを直接変えてる。 printgの書式はそのときは%cにしてください。
834 :
デフォルトの名無しさん :03/02/06 23:42
ありがとうございました!!やってみます
printgってなんだろ…… 逝って来ます あ、動作確認した環境はcygwin gcc 2.3ぐらいだす
836 :
デフォルトの名無しさん :03/02/07 00:53
move from A to C という風に表示させるにはどうすればいいですか??
>833 に書いたつもりだったんだが…… ヒントは、 printf("%3d : " , i); ↓ printf("%c : " , 'A'+i); printf("disk %d is moved from %d to %d \n",m,src,dst); ↓ printf("move from ( ) to ( ) \n",( ) + src,( ) + dst); がんがれ。
研修の課題の一つなのです。お力添えをお願いいたします。
Q.配列に文字列"yamada taro"を代入し、以下の実行結果が得られるプログラムを作成。
<実行結果>
文字列は yamada taro
1文字目=y 領域アドレス=0x65cefd(ココは状況次第で変化)
2文字目=a 領域アドレス=0x65cefe( )
5文字目=d 領域アドレス=0x65cf01( )
11文字目=o 領域アドレス=0x65cf07( )
#include <stdio.h>
void main(void)
{
char C[]="yamada taro";
printf("文字列は %s\n",C);
printf(" 1文字目=%c 領域アドレス=____\n",C[0],____);
printf(" 2文字目=%c 領域アドレス=____\n",C[1],____);
・・・
printf("11文字目=%c 領域アドレス=____\n",C[10],____);
アンダーバーにした部分の記述がわからないのです。
>>824 回答例1は爆笑w
記述ルールがない以上、確かに正しいプログラムではあると言えますね・・・(゚∀。)アレ?
printf(" 1文字目=%c 領域アドレス=%p\n",C[0], &C[0]); printf(" 2文字目=%c 領域アドレス=%p\n",C[1], &C[1]); 以下同
char s[]="yamada taro"; for (uint i = 0; i < 11; ++i) printf(" %2d文字目=%c 領域アドレス=%p\n", i+1, s[i], &(&*(s+i))[0]);
>for (uint i = 0; i < 11; ++i) マジックナンバーきもい。 > printf(" %2d文字目=%c 領域アドレス=%p\n", i+1, s[i], &(&*(s+i))[0]); なんで、 &s[i] じゃないんだろ。
>>838 そのアンダーバーが一文字に対応してるのなら、こんな所だろう
printf(" 1文字目=%c 領域アドレス=0x%x\n",C[0],C+ 0);
printf(" 2文字目=%c 領域アドレス=0x%x\n",C[1],C+ 1);
・・・
printf("11文字目=%c 領域アドレス=0x%x\n",C[10],C+10);
まぁ、このままだと駄目な場合もあるが…
なんで%#x使わないんだろう・・・
846 :
デフォルトの名無しさん :03/02/08 14:42
C++で構造体を勉強しているんですが、 構造体のポインタについて調べています。 下記のプログラムでは、「a->x」というのがどういうことなのかを 調べようとしています。なのにVC++でコンパイルするとエラーと警告は 出ないのですが何故かきょうせい終了させられます。 ご教授よろしくお願いします。 #include "stdafx.h" #include <iostream> using namespace std; struct test{ int x; }; test *a; int main() { cout << "a->x=" << a->x << endl; return 0; }
警告レベルを上げると警告されると思うけど、 aが初期化されてないのでaの指す先が未確定。 そのためにIllegalなアクセスが発生して強制終了すると思われ。 取り敢えず、 test st; test *a = st; とでもしてみたら? #って、出力される値は不定値だけど。
>>846 です。プログラムのみならず日本語もおかしいのでカキコを
改めてさせてください。
私はVC++で構造体について勉強中で、構造体のポインタ(特に
下記のプログラム内の"a->x"というのがどういうことか)を調べています。
ところが下記のプログラムをデバックするとエラーも警告も出ないのに
実行すると強制終了させられます。
何かご教授していただけると幸です。よろしくお願いします。
#include "stdafx.h"
#include <iostream>
using namespace std;
struct test{
int x;
};
test *a;
int main()
{
cout << "a->x=" << a->x << endl;
return 0;
}
>>847 '&'が抜けてる。
で、真面目に考えれば、
test st = {999};
test *a = &st;
とでもしておけばいいんでないかい?
あああ、 struct test { int x; }; だったのか。 typedefしているのかと思っちまったじゃないか。 それだったら struct test *a; だろうがよ。
aが未初期化・未代入でメモリ上の正当なtest型インスタンスを指していないからです。
853 :
デフォルトの名無しさん :03/02/08 16:29
scanf系で""で囲まれた文字列全体を読み込みたいと思っている. で,空白文字も""内に含まれるのだが,スキャンセットを使って次のように書いてみた. #include <stdio.h> int main(void){ int i; char name[2][10],buf[10]; for(i=0;i<2;i++){ printf("No.%d:name >", i+1); fgets( buf , sizeof buf , stdin ); if( sscanf( buf , "\"%[^\"]\"\n" , &name[i][0] )!=1 ){ printf("error\n"); i--; } } for(i=0;i<2;i++){ printf("%20s\n",name[i]); } return(0); } すんと,一つの入力が10文字越えると変になっちまう. No.1:name >"hogehoge hogehoge" No.2:name >error No.2:name > hogehoge nameの第二添え字の数字を越えてもうまく動くようにできない?
854 :
デフォルトの名無しさん :03/02/08 16:29
2つの複素数a+bi,c+diの除算(a+bi)/(c+di)を行いその結果を複素数e+fiに代入する。 複素数は2つの実数を使って表現せよ。”i”は虚数単位である。 という問題なのですがお願いします。
855 :
デフォルトの名無しさん :03/02/08 16:33
>>850 C++だとはっきり書かれてるだろうに。
>>848 警告がでないのは、グローバルだからだろうに。
>>853 ごめん.多分自己解決.fgetsのバッファリングが問題だったので
rewind(stdin);
を入れてやったら良かった.逝ってくる.
858 :
デフォルトの名無しさん :03/02/08 16:41
>>854 std::complex<double> c1(a,b), c2(c,d), c3;
c3 = c1/c2;
double e = c3.real(), f = c3.imag();
>>854 マジレスすると
e = (c*a+d*b)/(c*c+d*d)
f = (c*b-a*d)/(c*c+d*d)
#include <iostream> #include <complex> int main() { std::complex<double> a, b, c; std::cin >> a; std::cin >> b; c = a / b; std::cout << c; return 0; } /* $ ./a (1.2,2.3) (4.5,5.6) (0.354195,0.0703352) */
862 :
デフォルトの名無しさん :03/02/08 17:38
#include <stdio.h> int main(){ int a=1,b=2,c=3,d=4,e,f; e = (c*a+d*b)/(c*c+d*d); f = (c*b-a*d)/(c*c+d*d); printf("%d+%di",e,f); } こんな感じで
符号付整数jをn〈整数)ビット右に算術シフトし結果を符号付整数kに代入するcの構文を書け、 なのですが、どうすればいいんですか?初心者で全くわかりません。演習で提出しなければいけません。 どうかお願いします。
>初心者で全くわかりません。 いま2月だぞ? 授業は今年になってから始まったノカナ?
>>863 > 初心者で全くわかりません。
と言うことなら...
「あ・き・ら・め・ろ」
2ch に書かれた正解でその演習をクリアしても、その先が辛くなるだけだ。
おとなしく、再履修しとけ。
866 :
デフォルトの名無しさん :03/02/08 18:25
ま、いいじゃねーか それにここのスレタイは C/C++の宿題をやらせろや!!! じゃん 教えてやれば?
Cで明示的に算術シフトすることは不可能じゃなかったか? 少なくとも標準では。
>>866 > それにここのスレタイは
> C/C++の宿題をやらせろや!!! じゃん
おお、なるほど。そう言われりゃそうだな。そんじゃ...
int j;
int k;
int n;
k = j >> n;
ただ、j < 0 の時の結果は処理系定義だったかと...。
869 :
デフォルトの名無しさん :03/02/08 19:35
今度、C++を覚えたいのですが いきなりC++を覚えるよりも先にCを習得すべきなのでしょうか?
>>869 その前に、2ch の仕組みを習得すべきだ。
スレタイぐらい読めるだろ ?
>>869 その方が、嫌いにならないで済むと思う、C++は、かなり凶悪なので。
JavaをやってからC++とかね。
873 :
デフォルトの名無しさん :03/02/08 20:01
区間[a,b]で一様に乱数を与える関数rand0()があるとする。これを使って区間[c,d]の関数値として一様乱数を与えるdouble型関数を作れ。a,b,c,dはdouble型とせよ。その値はすでに定義されている。なんですが、アルゴリズムを教えてください。
>>873 アルゴリズムって程のもんじゃないだろ。
double x = rand0();
double y = (x - a) / (b - a) * (d - c) + c
876 :
デフォルトの名無しさん :03/02/08 20:32
>>875 それでは一様乱数にならないという罠。
区間[a,b] の幅が極端に小さく、区間[c,d] の幅が極端に大きいと
あからさまに歯抜けになる。
計算機屋らしい解答を求む。
>>876 歯抜けになっても有効数字は変わらないんじゃない?
b-aで大量に桁落ちするんでしょ
a,b,c,dが同じdoubleなら歯抜けにはならん気がするが・・・
aとbの間に何個doubleが入るか調べて、同様にcd間のdoubleの個数を調べる。 両者が片方の倍数なら簡単だが、互いに素な時はrand0()を有限回数呼んでも 不可能では?
質問。[1.0, 2.0]の間にはいくつdoubleがあるんですか。
>>881 doubleの解像度ははっきりしているから有限個ですね。
寧ろ、rand0()の性能の方が問題になりそう。
883 :
デフォルトの名無しさん :03/02/09 05:02
M行N列の行列Xを引数として入力し、別の引数として行列Y=tXX(tは上付き) を出力できるvoid型の関数がある。M,N値はすでに定義されているものとして、 実行行列であるX,YのX,YがM=Nでハミルトニアンである場合をプログラミングせよ。 という問題なんですけど凶悪すぎて手も付けられません…… だ、だれか~(T□T
884 :
デフォルトの名無しさん :03/02/09 05:40
初心者な質問ですいません。 私は今月曜提出の数学のレポートをしているんですが、 何度やっても「~.hがオープンできない」としか出なくてコンパイルできません。 オリジナルの~.hを使うには何か別の設定をしなければならないのですか? 使っているのはCPad for LSI C-86です。
886 :
デフォルトの名無しさん :03/02/09 05:50
>>885 すいません。やり方が分からないです・・・。
887 :
デフォルトの名無しさん :03/02/09 05:51
ひょっとしてOSで設定するファイルのリードとかライトですか? それは一応やりました。
>>873 かなり姑息な方法だが、精度落ちとか防ぎたかったら
bool divide(){
return (2.0*rnd()>b+a);
}
double rnd2(){
double x=(c+d)/2.0,result=0.0;
while(x>EPSYRON){
if(divide())
result+=x;
x/=2.0;
}
return result;
}
余り信用しないように
>>873 かなり姑息な方法だが、速度を無視して精度落ちとか防ぎたかったら
C++の記法で書けば
bool divide(){
return (2.0*rnd()>(b+a));
}
double rnd2(){
double x=(c+d)/2.0,result=0.0;
while(x>EPSYRON){
if(divide())
result+=x;
x/=2.0;
}
return result;
}
ここでEPSYRONは大抵math.hに定義されてる計算機エプサイロン(定数)
定義されてなかったら、(x>EPSYRON)を(x+x>x)とでも置き換えてみる
普通int値のrand(int)が定義されてるから、divide()を整数乱数で置き換えて
やると速度が格段に上がる筈。この場合return(rand(2)==1)にでも置き換える。
ま、専門家じゃないので、余り信用しないように
891 :
デフォルトの名無しさん :03/02/09 06:18
>>889 いえ、プログラムは全く教えてもらってません。
先生が計算するプログラムをホームページに載せてるので、それを実行して結果をメールで出せ。
っていうもの凄く簡単なレポートのはずなのですが、
そのC言語を使える環境が無いので色々付け焼き刃でダウンロードとかしてみたけど全然ダメでした。
>>887 Pathの設定がされてないか、環境変数includeかなんかが定義されてない
可能性大
CPadの設定ダイアログを見てみる。コンパイラ設定とかリンカ設定
が空欄だったらコンパイルできないはず。
893 :
デフォルトの名無しさん :03/02/09 06:30
>>893 HPのソース見たけど、#include[行末まで空白]
なんてあって、ちょっとビクーリ
その問題は自分で解決してね。
核心部分は2番目以下
ちゃんとincludeパスにそれらのヘッダがあるものとして
(コンパイルするファイルがあるフォルダでもOK)
NR_utility.cというファイルは実はLSI-Cでは
読めない。というのも8文字以上の長さのファイル
だから。DOSプロンプトでそのフォルダーにCDして
ren NR_Utility.c nruty.c
で、名前を8文字以下にしましょう。
NR_Utility.hについても同じです。
895 :
デフォルトの名無しさん :03/02/09 06:49
>>894 メチャメチャありがとうございます。
動きました。
ソースに関しては数学専門の教師なので大目に見てやってください。
これで無事進級できそうです。
>>891 コンパイルして実行してメール出せばOKのレポートってイイですね。
マニ学校ですか?
897 :
デフォルトの名無しさん :03/02/09 06:55
>>896 プログラムとはあんまり縁のない大学の数学科です。
100万回くらい計算を繰り返して答えの精度を上げるものらしいのでこれからはパソコンも使えないといけないみたいですが。
ま、くれぐれもAnalの道には入り込まないように
数学科に限らず、これから計算機使うの必須になるけど、 教官がろくにプログラミングとかできない学科って悲惨よね。
次スレは立てないからな! 覚えとけよ!まんこ好きが!
901 :
デフォルトの名無しさん :03/02/09 14:27
宿題じゃないんですが、 void CS06Wnd::OnPaint() { CPaintDC dc(this); int i; int x; for (i = 0; i < 10; i++) { x = i + 30; dc.Arc(x, 0, x + 50, 50, 0,0,0,0); } } これでエラーがでます。なんででしょうか?
902 :
デフォルトの名無しさん :03/02/09 14:30
wakarimasita
903 :
デフォルトの名無しさん :03/02/09 14:33
やはり分かりません
905 :
デフォルトの名無しさん :03/02/09 14:42
>>904 この前から始めたばかりなので設定はほとんど弄ってないのですが
エラーにはerrorC2018 文字0*81は認識できません
とかかれます。
>>905 i=0のところに全角スペースが入ってる
907 :
デフォルトの名無しさん :03/02/09 14:49
>>905 (だけじゃなく、質問する人みんなに...。)
ねえ、毎回書かれることだけど、なんで最初から...
> エラーにはerrorC2018 文字0*81は認識できません
を書かないの ? そうすれば、
>>902-904 みたいな余分なレスなしに、
>>906 がすぐ返ってきて、ウマーなのにさ。
>>908 最初から書くと
文字0*81は認識できないんだろ?
日本語読めないのか?
とすぐ返ってきて、マズッな余寒
0x81じゃなくて0*81なのか?
最適化。 日本語0は認識できない。
だからあれほどエディタは全角(2バイト)空白が見える設定にしておけと・・・ それと、IMEの設定で全角空白はShift+Spaceで出るようにしておくとか。
s/ / /g
VC++の人はどうしてる?
VC++の中の人はどうしてる?
中の人などいない!
VC++の白の人はどうしてる?
VC++の北の人はどうしてるの?
VC++の發の人はどうしてるの?
VC++のぬるぽの人はどうしてるの?
922 :
デフォルトの名無しさん :03/02/10 20:18
オチが付いたところで・・・・
>>915 全角スペースが混じってたらその行のそれ以降がまともに色分けされなくなる
からすぐ気付くし、最悪コンパイル時にわかるし、別にどうもしてないけど。
それ以前に全角でスペース空ける機会がないよなぁ・・・
925 :
デフォルトの名無しさん :03/02/10 22:23
大学の宿題です。さっぱりわかりませんが とにかく長いらしいです・・・ ヒントだけでも下さい。VC+6.0です。 問題:80名の成績データがseiseki.datにあり、 第1列目に受講者ID、2~6列目までに得点がある。 各受講者の合計得点、平均点を計算するプログラム を作成せよ。平均点は四捨五入せよ。また、計算した プログラムをもとに、60名を合格、20名を不合格と 判定するためのボーダーラインを決める機能も装備 すること。ちょうど60名にならないときは、60名以上で 60名に一番近くなるようにすること。 ぶっちゃけ関数forぐらいしか習ってない。
927 :
デフォルトの名無しさん :03/02/10 22:26
こんなの、エクセルでやるのが一番。 プログラムを組むまでではない。
928 :
ビルゲイシ :03/02/10 22:37
>>927 それをやりたいかどうかなんて関係ないですが何か?
おまいみたいな香具師はじゃばくらいしか操れんのだろう
平均点は四捨五入とかVCでやりたくないね
intで切り捨てさせてくれ。
これがファイルの中身です。 メモ帳で開いたのをコピペします。 IDEx.1Ex.2Ex.3Ex.4Ex.5 1526631272 25271755131 39675224198 45314333264 (中略) 762182222877 775672296126 787870338016 794417161866 801080495540
やりなおし。列の間はtabかなんかのようです。 行の間はなし。 ID Ex.1 Ex.2 Ex.3 Ex.4 Ex.5 1 52 66 31 2 72 2 52 71 75 51 31 3 96 75 22 41 98
四捨五入くらいVCでも簡単にできるだろ?
どうもうまく表現できない・・・ ホントは縦にきれいに並んでるんだけど。
>>935 いいよ、大差ないから。
で、何がわからないんだ?
さっぱりわからないんじゃなにもできないぞ。
>>936 四捨五入とボーダーラインを決める
ためにはどんな感じでやればいいのかと。
合計、平均は何とかできそうなんで。
四捨五入はfloatに0.5足してintに ボーダーは合計点数順にソート 60位の点より少なければ不合格
ヒントか? まず、構造体(で十分だよな?)を用意。 学生さん{ 点数[0~4] 平均点 } 60 匹。 で、ファイルに読み込む for文(全部の学生さん) 学籍番号読む ついでに、学生さん[学籍番号].平均点=0; for文(全部で5教科){ 点数読み込む 学生さん[学籍番号],[何教科目]=点数 足しとけ 学生さん[学籍番号].合計点+=点数 } 学生さん[学籍番号].平均点=(合計点+0.5)/ 5教科。 // 過去ログ参照 for文(5教科){ 表示 学生さん[学籍番号][何教科目] } 表示 合計点と平均点 } っと・・・・・・
いろいろ問題発生(笑)ま、いっか。大体想像つくだろうし。 構造体に合計点もないし、初期化もしてないし。そのまま動かすと 誤動作間違いなし。 ソートを考えると、構造体でやってポインタを交換したほうがいい……んだっけ?
別に 60 匹程度なら構造体丸ごとソートでも特に問題は無い
とりあえずソートの勉強してみます。 こりゃ後何日か徹夜かな。
>>925 の
>ぶっちゃけ関数forぐらいしか習ってない。
に何で誰も突っ込まないんだろう…
>>943 他に突っ込む所がいっぱいあるからだろ。
いわゆるマスキング効果だよ。
946 :
デフォルトの名無しさん :03/02/11 01:26
俺の大学ではC++をやりません。Cだけ。しかもつまんねーソートとか。kmpなんて覚えてどうすんだよ。死ねってかんじ。
>>946 こういうこというヤツは
C++やったところで
なにもできないことがおおい。
ソートは奥が深いぞ。いろんなソートの動作を調べてみると 「世の中、頭のいい人がいるもんだ」と感心するけどな。
>>924 qsortでガンガレ。教科書orWebにサンプルがあるので。
関数を自分で組むより、言語にあるならそっちを使うのが定石。
で、それで遅かったら自分で組むのがベスト、だと多分思う。
924 ->
>>942 ごめんなさい……
別に、計算とかだけならCで十分と思われ。
グラフィックとかやりたかったら、コンパイラ(というかライブラリ)
に激しく依存するので、自分で勉強するのがいいと思います。
特に、学校のマシンがUnix Linux関連だと、もう……(XX)
>>950 誰が誰に宛てたレスなのかサパーリわかんねー
寝付けなかったので漏れも
>>925 の宿題やってみよっと!!眠くなるまでな。
>>946 情報系以外ならCだけでも十分かなぁ。
情報系なら絶対に不十分だと思うけど、
Cしかやらない学科も結構ある。
っていうか、Cやってくるならまだいい方で、
中にはfortranやらlispやらpascalやら・・・。
ありがとう。とてもよくわかりました。
誤爆
ファイル操作ほとんど失念もうダメポ おやすみなさい
>>953 Lispはいいんじゃねえの。学校でLisp習えるなんで羨ましいよ。
Lispは教えるの難しそうだねぇ。 Cとは別の意味で。
>>959 Lispは抽象度が高いというかなんというか、難しそうだけど。
でもCみたいにポインタがどうしたとかそういう瑣末な
所を抜きにいきなり計算理論に入れるのは教育にいいと思うんだけどな。
いや、無論ポインタの概念も大事だと思うけど、
でもそれは割とCPUにべったりの低水準な技術としての部分であって、
まずアルゴリズムやらの理論をきっちりしっといたほうがよいような。
やれアルゴリズムだ、とかやろうとしてもその前にポインタだ配列だ
mallocだfreeだとかやってもしゃーないような気がしてならないんだが。
そういうところでつまずいてるとしたらもったいない気がする。
その先にもっと面白い世界があるわけで。
ちなみにLispにはポインタの概念もきっちりと存在する。
というかLispのListはもろにリスト構造でconsセルはポインタ
が二つあるだけの存在だし(実際にはもうちょっと複雑だけど)。
10年位前にある本(SICP)を読んで、Lispで普通にオブジェクト指向
できちゃうのを見て仰天した覚えがある(w
とはいえ、実用言語かというと、そうでもないところが痛い。
実用にならないってわけじゃなくて、仕事としては需要がないから、
実用的じゃないという意味なんだが。就職の面接で「Lispやってました」
つってもほとんどのところは (゚Д゚)ハァ? だろうしな。
そういうおれは今日もCでお仕事さ(w
>>960 私ゃEmacs上で動かすくらいだな。
複雑なマクロとしてだったりすることが多いけど
計算式を工夫するときにも使ってる。
awk/perl/javascriptでもいいんだろうけど
再帰式なんか書くのにはlispの方が楽だね。
#って、それはそれでlisp使いから怒られそうだな。w
Lisp もさ、かじる程度に勉強するのはいいと思うんだけどさ、 さもそれがC言語並にいろんな分野で活躍してる言語であるかのように 教えられたりするとちょっと引くんだよな。 最初から「いまどきEmacsのマクロ以外で使われてないけどな」とか そういうことも教えとかないとあらぬ誤解を生むのではないかと。
963 :
デフォルトの名無しさん :03/02/11 14:41
このような動作をするプログラムを作るにはどうすればいいでしょうか。 例えば ○○○basket○○○ball○○○player○○ (○は空白) と入力すると basket○ball○player と出力される 単語と単語の間に空白を1つ残すプログラムを作りたいのですが どうすればいいのでしょうかどなたかお願いします。
sed -e 's/ +/ /g' っていうか、Cでやる仕事じゃないねぇ。
s/^ +// s/ +$// をお忘れで。
プログラムつってるんだから教えてやればいいのに
出来ているも同然だと思われ
>>963 #include <stdio.h>
int main()
{
int ch;
while((ch = getchar()) != EOF)
{
putchar(ch);
if(ch == ' ')
{
do { ch = getchar(); } while(ch == ' ');
ungetc(ch);
}
}
return 0;
}
>>925 #include <stdio.h>
#include <stdlib.h>
#include <search.h>
#define IN_FILE "seiseki.dat"
#define OUT_FILE "seiseki_out.dat"
#define NUM_STUDENTS 80
#define NUM_PASS_STUDENTS 60
struct student
{
int id;
int average;
} student[NUM_STUDENTS], *sort_student[NUM_STUDENTS];
int compare(const void *elem1, const void *elem2)
{
return (*(struct student **)elem2)->average - (*(struct student **)elem1)->average;
}
int main()
{
char buf[256];
int i, score1, score2, score3, score4, score5;
FILE *FP = fopen(IN_FILE, "r");
if(!FP)
{
perror(IN_FILE);
return -1;
}
fgets(buf, sizeof(buf), FP); for(i = 0; i < NUM_STUDENTS; i++) { if(!fgets(buf, sizeof(buf), FP)) { perror(IN_FILE); return -1; } if(sscanf(buf, "%d %d %d %d %d %d", &student[i].id, &score1, &score2, &score3, &score4, &score5) != 6) { fprintf(stderr, "format error at line %d\n", i + 1); return -1; } student[i].average = (int)((score1 + score2 + score3 + score4 + score5) / 5.0 + 0.5); sort_student[i] = &student[i]; } fclose(FP); qsort(sort_student, NUM_STUDENTS, sizeof(struct student *), compare); FP = fopen(OUT_FILE, "w"); if(!FP) { perror(OUT_FILE); return -1; } for(i = 0; i < NUM_STUDENTS; i++) fprintf(FP, "ID:%2d、平均:%3d、%s\n", student[i].id, student[i].average, student[i].average >= sort_student[NUM_PASS_STUDENTS - 1]->average? "(・∀・)イイ!!": "あぼーん"); fclose(FP); return 0; }
>>969 行頭の空白が取れないぞ。
#include <stdio.h>
int main()
{
int ch;
ch = getchar();
while(ch == ' '){
ch = getchar();
}
while(ch != EOF){
if(ch == ' '){
do {
ch = getchar();
} while(ch == ' ');
if(ch == EOF){
break;
}
putchar(' ');
}
putchar(ch);
ch = getchar();
}
return 0;
}
>>972 制御が見にくい。
#include <stdio.h>
int main()
{
int ch;
while((ch = getchar()) != EOF)
{
while(ch == ' ');
ch = getchar();
while(ch != EOF)
{
putchar(ch);
if(ch == ' ')
do ch = getchar(); while(ch == ' ');
else if(ch == '\n')
break;
else
ch = getchar();
}
}
return 0;
}
#include <stdio.h> #include <string.h> main() { char s[]=" basket ball player "; char* p; if(NULL != (p=strtok(s," "))){ printf("%s", p); while(NULL != (p=strtok(NULL," "))) printf(" %s", p); } } むしろstrtokを使っとけと。
あ、間違い #include <stdio.h> #include <string.h> main() { char s[]=" basket ball player "; char* p; if(NULL != (p=strtok(s," "))){ printf("%s", p); while(NULL != (p=strtok(NULL," "))) printf(" %s", p); } }
976 :
デフォルトの名無しさん :03/02/13 00:38
printfとかで 『\d』って言う文字を表示させるにはどうしたらいいのですか…? 当然 printr("\d"); ってのはエラーが出るのですが…
printf("\d"); の間違いです すみません
>>978 ありがとうございます!!!
ってことは『%d』って表示させるときも
『%%d』 って打てばいいんですね
\\はCの文字列リテラル共通。 %%はprintf系のみの仕様。 一応。
1から15までの数字をつかった、最大差分三角形のプログラムを作りたいの ですが、よくわかりません。教えてください
>>982 「最大差分三角形」というのがよくわかりません。教えてください。
Cマガジン(ってまだあるの??)に載りそうな問題だな。 確かに総当りっぽいが、ちょっとしたコツで劇的に 処理時間を短縮できそうな気もするし。 気が向いたら考えてみるか。
986 :
デフォルトの名無しさん :03/02/13 02:39
1、メールする
goto使いまくった汚いプログラムだけど出来たからうpする。 #include <stdio.h> #include <stdlib.h> #define MAXN 15 int inuse[MAXN]; int tri[5][5]; int main(void) { int i, j, k, l, m; int n, o, p, q; int r, s, t; int u, v; int w; for (i = 1; i <= MAXN; i++) { inuse[i - 1] = 1; for (j = 1; j <= MAXN; j++) { if (inuse[j - 1]) continue; inuse[j - 1] = 1; for (k = 1; k <= MAXN; k++) { if (inuse[k - 1]) continue; inuse[k - 1] = 1; for (l = 1; l <= MAXN; l++) {
とりあえず総当たりごり押しの15段だけを解く きったねーの作ってみてる(w
if (inuse[l - 1]) continue; inuse[l - 1] = 1; for (m = 1; m <= MAXN; m++) { if (inuse[m - 1]) continue; inuse[m - 1] = 1; n = abs(i - j); if (inuse[n - 1]) goto lbl10; inuse[n - 1] = 1; o = abs(j - k); if (inuse[o - 1]) goto lbl9; inuse[o - 1] = 1; p = abs(k - l); if (inuse[p - 1]) goto lbl8; inuse[p - 1] = 1; q = abs(l - m); if (inuse[q - 1]) goto lbl7; inuse[q - 1] = 1; r = abs(n - o); if (inuse[r - 1]) goto lbl6; inuse[r - 1] = 1; s = abs(o - p); if (inuse[s - 1]) goto lbl5; inuse[s - 1] = 1;
t = abs(p - q); if (inuse[t - 1]) goto lbl4; inuse[t - 1] = 1; u = abs(r - s); if (inuse[u - 1]) goto lbl3; inuse[u - 1] = 1; v = abs(s - t); if (inuse[v - 1]) goto lbl2; inuse[v - 1] = 1; w = abs(u - v); if (inuse[w - 1]) goto lbl1; inuse[w - 1] = 1; printf("%d %d %d %d %d\n", i, j, k, l, m); printf(" %d %d %d %d\n", n, o, p, q); printf(" %d %d %d\n", r, s, t); printf(" %d %d\n", u, v); printf(" %d\n", w); lbl1: inuse[w - 1] = 0; lbl2: inuse[v - 1] = 0;
lbl3: inuse[u - 1] = 0; lbl4: inuse[t - 1] = 0; lbl5: inuse[s - 1] = 0; lbl6: inuse[r - 1] = 0; lbl7: inuse[q - 1] = 0; lbl8: inuse[p - 1] = 0; lbl9: inuse[o - 1] = 0; lbl10: inuse[n - 1] = 0; inuse[m - 1] = 0; } inuse[l - 1] = 0; } inuse[k - 1] = 0; } inuse[j - 1] = 0; } inuse[i - 1] = 0; } return 0; }
後は適当に改造してくれ。
ごめんバグりまくってるわ(w もう一度考えるからちょっと待ってて
>>987 割り込みすまん。
んで、作って解かせてみてるんだがこりゃだめだ。
何時間かかるかわかったもんじゃない。
#include <stdio.h> #define N 15 static int tri[N]; /* * 配列triには * 01 02 03 04 05 * 06 07 08 09 * 10 11 12 * 13 14 * 15 * のように入ってる。 */
void check(void) { static const int pair[][2] = { {1, 6}, {2, 7}, {3, 8}, {4, 9}, {6, 10}, {7, 11}, {8, 12}, {10, 13}, {11, 14}, {13, 15}, {-1, -1}, }; int i; /* check */ for (i = 0; pair[i][0] != -1; i++) { if (tri[pair[i][0]] - tri[pair[i][0] + 1] != tri[pair[i][1]]) { // printf("\r"); return; } } /* ok print */ for (i = 0; i < 15; i++) { printf("%d ", tri[i]); } printf("\n"); }
void put(int pos, int k) { int j; tri[pos] = k; if (k == N) check(); else for (j = 0; j < N; j++) if (tri[j] == 0) put(j, k + 1); tri[pos] = 0; } void genperm(void) { int pos; int count = 0; count = 0; for (pos = 0; pos < N; pos++) tri[pos] = 0; for (pos = 0; pos < N; pos++) put(pos, 1); } int main(int argc, char * argv[]) { genperm(); return 0; }
バグ取れたよ。左右対称は判別してないから2つ答えでるけどね。 inuse[w - 1] = 0; lbl1: inuse[v - 1] = 0; lbl2: inuse[u - 1] = 0; lbl3: inuse[t - 1] = 0; lbl4: inuse[s - 1] = 0; lbl5: inuse[r - 1] = 0; lbl6: inuse[q - 1] = 0; lbl7: inuse[p - 1] = 0; lbl8: inuse[o - 1] = 0; lbl9: inuse[n - 1] = 0; lbl10: inuse[m - 1] = 0; }
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。