1 :
デフォルトの名無しさん :
04/12/11 17:24:57
2 :
デフォルトの名無しさん :04/12/11 17:26:12
从*・ 。.・)ノ<よろ〜
(・3・) エェー ぼるじょあも答えるYO!
>>1 乙。
うpローダーのURLを、前スレで作ってくれた方の所に変えて欲しかった。
7 :
デフォルトの名無しさん :04/12/11 18:48:47
なにこのきもいスレ
9 :
デフォルトの名無しさん :04/12/11 18:52:11
さゆってなに?白湯?
10 :
デフォルトの名無しさん :04/12/11 18:59:32
11 :
デフォルトの名無しさん :04/12/11 19:38:50
ぶしゅ
#include <stdio.h> int main(void) { printf(&linux["\021%six\012\0"], (linux)["have"] + "fun" - 97); return 0; }
[課題] 角度θを0度から180度まで5度おきに変えてsinθとcosθ をもとめ、一覧表として表示するプログラムを作りなさい。 角度を実数値として扱いなさい。 [環境] 言語:C 簡単なプログラムなら作れるんですが数学が混じるとorz
[課題] (1)テキストエディタを用いて、20個の整数をdata.txtというファイルに保存せよ。 ただし、各整数は空白か改行で区切られているものとする。 (2)data.txtから20個の整数を読み込んで、それらを配列に格納せよ。その配列の全要素 を逆順にしてoutput.txtへ出力せよ。この時、各要素は空白で区切られているものとする。 [環境] 言語:C “テキストエディタを用いて”って書いてありますけど、多分Cでどうにかするんだと思います。 何かもうそれすらあやふやなほどで、1〜10まで全然分からないので本当に困っています。 どなたか宜しくお願いします。
>>14 #include <math.h>
int main(){
int x=0;//実数値(角度)
float y=3.141592;//円周率
/***** sin *****/
printf("== sin ==\n");
for(x=0;x<=180;x=x+5){
printf("\t%1.5f\n",sin(y*x/180));
}
/***** cos *****/
printf("== cos ==\n");
for(x=0;x<=180;x=x+5){
printf("\t%1.5f\n",cos(y*x/180));
}
}
17 :
デフォルトの名無しさん :04/12/11 21:40:03
>>14 #define PI 3.14159
#include <stdio.h>
#include <math.h>
int main(int argc,char* argv[]){
unsigned short ang;
for(ang=0;ang<=180;ang+=5)
printf("sin(%u):%.3f\tcos(%u):%.3f\n",ang,sin(ang*PI/180),ang,cos(ang*PI/180));
return(0);
}
これでいいんかなぁ?
>>15 「テキストエディタを用いて」って記述されてるから、data.txtはエディタで作れば
いいんじゃないの。
あらま。被ってしまったね。すまんこ
>>18 >data.txtはエディタで作ればいいんじゃないの。
ということは、実質的にはC言語の問題は(2)ということで良いんすか?
というか、テキストエディタって、そういうソフトですか?
テキストエディタを用いてって書いてあるんなら、テキストエディタで作ればいいんだよ
>>21 なるほど、君が非常にやばい状況にあるのはわかった。
テキストエディタとは、Windowsに初めからインストールされている「メモ帳」など
の総称だよ。だから、data.txtはメモ帳で
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
と打って、data.txtというファイル名で保存すればよい。
数字と数字の間はスペースで、区切ってあるよ。
あと、コーディング(C言語の問題)の箇所は、君の言うとおり(2)になるね。
>>16 すいませんがもっと理解が簡単な風に作れないですか?
この課題はC言語を1からやる講義の課題なので
自分は高校で軽くやっただけなので考察書くことを考える
と中身が分からないとつらいので
すいませんがお願いします。
あとVisual Stadioでプログラムを作るのでお願いします
>>24 君にはVisual*Studio*すらももったいない気がする。
すちゅーでぃお
>>16 はこれでもかって言うぐらいとても簡単です。
>>23 おぉ、神降臨!
テキストエディタの説明、大変有難う御座いました!
何か説明を受けてから改めて問題を見てみると、自力で出来そうな気がしてきました!
ちょっとやってみて、やっぱり駄目だったらまた来ます!
>>25 二次方程式ax2 + bx + c = 0の 2つの実数解、重解、2つの複素解を
求めるプログラムを作り、実行しなさい。ただし係数は簡単のため0と
する。
このレベルぐらいならつくれました。
>>29 俺のやつは使い物にならないのかw
がーん
ってか係数が0だったらその式は定数じゃないのか???
>>27 %sではホワイトスペースが現れるまで一つの文字列と見做してしまう。
:の前後で分けたいなら、少なくとも前は%[^:]などで取らないといけない。
すいません。 コピーしてテキストに貼り付けたら文字化け起こしたため困惑 してました orz
>>31 どうでもいいけど無闇とshortを使うのはよくない。
>>29 SUGEEEEEEE!!!!!
神だ!
これでこのスレは救われりゅ!
>>35 だって範囲的にshortの範囲じゃない?
無闇にint使うのはメモリの無駄じゃない?
shortで収まると分かっている場合はshortのがいいと思う。
>>37 だろうな。定数なんだもんw
解を求めるルーチンが間違ってても、正解は出てくるんじゃないかな。
>メモリの無駄 じつはアドレッシングサイズを変えてしまうほうが無駄
intもshortも16ビット以上であることしか保障されてないんじゃなかったっけ?
>>38 普通にintを使うほうがより適切なコードになる可能性が高い。
試しに使っている環境で最適化をしたコード同士を較べて見たら?
shortは16bit, longは32bit intは16or32bit
43 :
デフォルトの名無しさん :04/12/11 22:56:16
>>38 それはよほど大きな配列をつくる場合だけだ。
そうか。了解。これからは余りshort使わないようにするわ。dクス
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) としか決められてない。
自力でやってみましたが、時間の無駄でした!
どなたか
>>15 の(2)をお願いします!
sizeof(char) < sizeof(short) じゃないの?
50 :
デフォルトの名無しさん :04/12/11 23:08:26
>>49 sizeof(char)==sizeof(short)でもいい。
ただし、その場合charは16bit以上になる。
>>50 そんなの存在するのかな?
1バイトが16ビットとか
>>51 charもintもlongもみーんな32bitの環境で開発したという話を聞いたことがあるYO!
それどころかshort、int、long、long longみんな64ビットって話も聞いたことがある。 (charはどうだったかは聞いていないが)
55 :
デフォルトの名無しさん :04/12/12 00:15:59
>>48 時間の無駄ってことはないだろう。自分で考えるほどプラスになることはない。
まぁ、とりあえずほれ。
でもちゃんと勉強しとかなきゃ後で大変だぞー。
int main()
{
FILE* in_stream;
FILE* out_stream;
int value[20];
in_stream = fopen("data.txt", "r");
if (in_stream == NULL) {
return -1;
}
out_stream = fopen("output.txt", "w");
if (out_stream == NULL) {
return -1;
}
for (int i=0; i<20; i++) {
fscanf(in_stream, "%d", &value[i]);
}
for (int i=19; i>=0; i--) {
fprintf(out_stream, "%d ", value[i]);
}
fclose(in_stream);
fclose(out_stream);
return 0;
}
おいおい、sizeof(char)はCの規格で8bitと保証されているよ
charは一律1バイトだろ。ぜってー(←なぜか変換できない)
bit数はどの型も処理系依存
ま、#include <limits.h>してCHAR_BIT使えばいいわけだが。
>>55 ありがとうございました!
何か自分の不甲斐無さとやって頂いた嬉しさと
貴方の物腰の柔らかさに冗談抜きで泣きそうです…。
とりあえず今は課題ですので、提出する事を
重視しています。幸いうちの学校は春休みが
二ヶ月強あるので、そこでじっくり理解
していくつもりです。
長文失礼しました。
62 :
デフォルトの名無しさん :04/12/12 03:39:45
[課題] 文字列操作関数strcpy()と同じ働きをする関数strcopy()を定義せよ。 ただし定義した関数の中では、ポインタを用いること(配列アクセスabc[i]などを用いない)。 また、ここで定義した関数と、次のmain()を組み合わせたプログラムを作成し、うまく動作することを確認せよ。 #include<stdio.h> #define LINELEN 80 main() { char str1[LINELEN],str2[LINELEN]; while (gets(str1) != NULL) { strcopy(str2,str1); printf("%s\n",str2); } } [環境] 言語:C お願いします。
>>62 char* strcopy(char* to, char* from){
while(*to++ = *from++)
;
return to;
}
>63の関数と>62をコンパイルして実行したらうまく動作しません。なんで?
この関数の戻り値って使い道あるの?
69 :
デフォルトの名無しさん :04/12/12 04:15:10
>>69 位置がずれまくった戻り値って使い道あるの?
まあそれ以前の問題があるが。
>>68 戻り値は必須ではないけど、標準のstrcpyは返すから。
使い道って意味でも必須ではないけど、あるとウレシイこともある。
まれだけど。
>>64 動かないのはなんでだろうね?自分のとこでは動きました。
まず
>>64 は私ではありません。
間違ったのはchar* strcopyの*を入れてなかったことかも…
引数のほうだけじゃダメなんですね。
言われてみれば戻り値にも入れないと確かにダメだ…。
今Windowsでコンパイラとかインストールしてないので試せないのですが、
UNIXでやったときはコンパイルすると関数にエラーが出てしまい(残念ながらメッセージは思い出せません…)、
実行できませんでした。
たぶんそれは上のことが原因だと思います。
明日試してみたいと思います。
ありがとうございました。
あと気になっていたんですが、これがいわゆる「ぬるぽ」ってやつなんですか?
全然ちがう
スミマセン、こんな課題が出ました。 手助けお願い致します。 2004年のカレンダーを、UNIXのcalコマンドと同様に表示させる。 言語はCです。 よろしくお願い致します。
cal [-jy ] [[month] year] オプション -j ユリウス暦で表示する -y 現在の年のすべてのカレンダを表示する month 表示したい月を指定する year 表示したい年を指定する 説明 カレンダをテキスト・ベースで形成して表示する。オプションを指定しない場合は現在の月のカレンダが表示される。
system("cal"); system("cal -y"); :
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>75
>>75 char *str1,*str2;
while (gets(str1) != NULL)
{
strcopy(str2,str1);
printf("%s\n",str2);
}
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char* argv[]) { if(execv("/usr/bin/cal", argv) < 0) { fprintf(stderr, "execv err\n"); exit(127); } return 0; }
変数xは0から1までの0.01刻みの値(101個)をとるものとする。このとき2次関数 f(x)=3x*x+2x+1の値が2.0<f(x)<3.0となるxの値の個数を求めるプログラムおねがいします xを因数としf(x)の値を返す関数を作成してそれを使用する
>>83 #include <stdio.h>
#define EPS (1e-12)
#define LE(x, y) ((x) - (y) < EPS)
double
f(double x)
{
return 3 * x * x + 2 * x + 1;
}
int
main(void)
{
int count = 0;
double x;
for (x = 0.0; LE(x, 1.0); x += 0.01) { if (LE(2.0, f(x)) && LE(f(x), 3.0)) { count++; } }
printf("%d\n", count);
return 0;
}
>>84 ありがとうございます。
defineとかまだ習ってないんですが使わないとできないんですか?
>>85 #include <stdio.h>
double
f(double x)
{
return 3 * x * x + 2 * x + 1;
}
int
main(void)
{
int count = 0;
double x;
for (x = 0.0; x < 1.0 + 0.0001; x += 0.01) { if (2.0 < f(x) + 0.0001 && f(x) < 3.0 + 0.0001) { count++; } }
printf("%d\n", count);
return 0;
}
どうもありがとうございました。 delphiってわかります?
x < 1.0 + 0.0001 なんぢゃそりゃw
普通はx - 1.0 < 0.0001だな。
x - 1.0 < 0.0001 なんぢゃそりゃアゲインw
>91 そいつはどうかな 提示のCFAQは2値が十分に等しいと見なせるか、であって >86 みたいなループにはdoubleを使うな、って事でねーの? >88 は
93 :
デフォルトの名無しさん :04/12/12 16:28:52
x < 1.1
94 :
名無し募集中。。。 :04/12/12 16:51:52
やったね、やったね!>∋oノハヾo∈
从*・ 。.・)
⊂ ,,O
( ノ
≡≡≡⊂\_) テケテケ
∋oノハヾo∈<新スレおめでと〜!
(・ 。.・*从
O,, ⊃
ヽ ) テケテケ
(_/⊃≡≡≡
_______
| ∋oノノハヾo∈|<きょうはもうねるの
>>1 乙
| 〔从*- 。.-从ノシ |
(⌒⌒⌒⌒⌒⌒⌒⌒)
95 :
デフォルトの名無しさん :04/12/12 17:05:35
if (2.0 < f(x) + 0.0001 && f(x) < 3.0 + 0.0001) なんぢゃそりゃアゲインw
代わりにやって君: 自分じゃ出来ないからといって、他人にやってもらおうとする人。 やらされる側の面倒さを全く考えてない。 待ってます君: 勝手に一人で面倒な条件を言いつけ、 「待ってます!」と捨てゼリフを言い残して、言われた側へプレッシャーをかける。 無視すると数日後に再び現われ「あの〜、お願いしたんですけど…」と言ってくる。
教えて君バリアーには掲示板廃止が一番有効
廃止すると他のスレに混入するからだめ
100
101
int main(void){ label: char *p; p=malloc(1); goto label; return 0; } C言語で初めてプログラムを作ってみました。 みなさんどうぞ。 誰かこれを実行してみて下さい。 実行者が現れるまで待ってます!
103 :
デフォルトの名無しさん :04/12/13 16:06:18
__ i<´ }\ , - 、 ヽ.._\./ .ンく r-兮、 __ ∠`ヽ.! / ヾニEヲぐ ,ゝ-> さゆがゴッグだ /_`シ'K-───‐-、l∠ イ なんともないぜ l´__,/l\、_ ̄0¨0)゙@Yヘ, -┤ . l'___|⌒ヾ''ー==、ーr='イ i二| / .」 i /./7r‐く lー! . f. ヽ‐i人.∠'< _i. l,.-ゝ. トiヘヘ「ト〈 `X トレi7__| 〉ト:トハj`! i. / トー┤lルj,リ /‐+----+‐l iー--i---ヾ'〃 . l_i____i__| |___i,__i_|
問題: 電卓プログラムを作成せよ 四則演算はもちろん、sinx,cosxを含む計算も出来、 途中で終了も出来るようにせよ
#include <stdio.h> main() { char op; int end_fg; double a, result; end_fg = 1; scanf("%lf", &result); while(end_fg >= 1) { scanf("%c",&op); switch(op) { case '+': scanf("%lf",&a) result = result + a printf("%lf\n", result); break; (中略) case '*': scanf("%lf",&a); result = result * a printf("%lf\n", result); break; case 'q': end_fg = end_fg - 1; break; }}} ここまで自分で作りました!四則演算だけなら続けて計算できます。 あとはend_fgを切り替えてsinx、cosxの計算を出来るようにするだけなのですが・・・
>>105 sinxやcosxなどはどうしても判別に3文字(s,cから始まる演算子がほかになければ別ですが)
まずは与えられた式をトークンに分解してどこかに保存なんかしてやると楽かもしれません。
なお計算機の場合若干難しいですが「逆ポーランド記法」をつかえるとやりやすいです。
もし今のままやりたいのでしたらsinやcosの判別を行った後
math.hないで定義されているsin,cos関数を呼び出してやればいいと思います。
呼び出し方
#include <math.h>
を2行目くらいに付け加えてみてください。
時間がないものですから中途半端なヒントでごめんなさい。
ほかの方フォローお願いします。
下図のようにn段のピラミッドを表示する関数を作成しなさい。(nは入力した値) void npire(int n); こんな課題が出ました。 言語はCです。 どうかお願い致します。 1 222 33333 4444444
>107 nが10以上とかマイナスのときは上手くいかないけど。 #include <stdio.h> void npire(int n); void main() { /*とりあえず5段*/ npire(5); } void npire(int n) { int i,j,k; /*段数ループ*/ for(i=0;i<n;i++){ /*行頭の空白*/ for(j=0;j<(n-i-1);j++)putchar(' '); /*数字部分*/ for(k=0;k<1+(i*2);k++)printf("%d",i+1); putchar('\n'); } }
109 :
デフォルトの名無しさん :04/12/13 17:42:07
例えば、DATAというファイルに ------- DATA.text--------------- 1 1.0000 2 2.3000 3 3.4443 . . 10 ----------------------------- といった内容が入っているファイルがあるとします。 ファイル中から指定した値を検索し、書き換えてファイルに保存するようなプログラムが作りたいのですが。 例えば、1.000という値を0.001に書き換えて保存するような形です。 言語はc言語です。unix作業しています。よろしくお願いします。
110 :
名無し募集中。。。 :04/12/13 17:49:58
>>102 % gcc -Wall -Wpointer-arith -Wstrict-prototypes hoge.c
hoge.c: In function `main':
hoge.c:3: error: 構文解析エラー が "char" の前にあります
hoge.c:4: error: `p' が宣言されていません (この関数内で最初に利用)
hoge.c:4: error: (未宣言の各変数については、それが最初に現われたそれぞれの関数
hoge.c:4: error: に対して一度だけ報告されます。)
hoge.c:4: 警告: 関数 `malloc' の暗黙の宣言
>>109 从*T 。.T)ノ<さゆは宿題しかやらないの
sed, awk の使えない Unixer はただの豚なの
>>111 アフォか?
sedやawkの実装を自分でやったらどうなるかを学ぶ宿題に決まってるだろ?
113 :
デフォルトの名無しさん :04/12/13 19:24:24
始点から終点までの円弧を書きたいのですが、角度計算がうまくできなくて 円弧がうまく描画されません。kakudo[t]の計算に問題があると思うのですが、 どう改良したらよいか分かりません。どなたかご教授ください。 /* 始点 */arcx[0] = arc[z][0].sx; arcy[0] = arc[z][0].sy; arcz[0] = arc[z][0].sz; /* 中間点 */arcx[1] = arc[z][1].sx; arcy[1] = arc[z][1].sy; arcz[1] = arc[z][1].sz; /* 終点 */arcx[2] = arc[z][2].sx; arcy[2] = arc[z][2].sy; arcz[2] = arc[z][2].sz; for(t=0; t<3; t++){ cx = a[0][3]/2; cy = a[1][3]/2; r = sqrt((arcx[t]-cx)*(arcx[t]-cx)) + ((arcy[t]-cy)*(arcy[t]-cy)); pi = (2.0*asin(1.0)); rad = (pi/180.0); kaku = (arcx[t] -cx)/r; kakudo[t] = acos(kaku)*(180/pi);ra[t] = (kakudo0[t])*(pi/180.0); sinx = (arcy[t]-cy)/r; cosx = (arcx[t]-cx)/r; tanx = (arcy[t]-cy)/(arcx[t]-cx); w = r*cosx; v = r*sinx; kakudo1 = (ra[0]/pi*180) - (ra[1]/pi*180); kakudo2 = (ra[1]/pi*180) - (ra[2]/pi*180); kakudo3 = kakudo2 + kakudo1; kakubun = kakudo3/40; }}
前スレ981なんですがもう一度問題ここにコピーしてよろしいですか?
115 :
sage :04/12/13 20:33:48
文字配列により表現された16進正整数から整数に変換する関数を定義し、コマンドの引数として、 <16進正整数><演算子><16進正整数> の形で与えられた四則演算式を計算し、結果を16進正整数の形で出力するプログラムを作成せよ。 ただし、演算結果が実数になる場合は、小数点以下を切り捨てよ。 という問題なのですが。 sscanfを使用してはいけないらしく、どうすれば良いのかわかりません。 宜しくお願いします。
>>114 == 前スレ981
コピーしちゃだめ。
「前スレ981」だけで充分。
>>115 16進正整数の値の範囲は?
1) 0-FF
2) 0-FFFF
3) 0-FFFFFFFF
4) 0-FFFFFFFFFFFFFFFF
5) それ以外
118 :
sage :04/12/13 21:11:06
>>117 特に指定はされていません。
おそらく、文字列の長さを数えるstr_length関数を定義しなければならないかと…。
>>118 strlenやatoiを使っちゃいかんのか?
ってatoiを自分で作れってのも課題の一つか。すまん
int main(void){
char *p;
label:
p=malloc(1);
goto label;
return 0;
}
>>110 こちらをどうぞ召し上がれ
122 :
sage :04/12/13 21:18:44
>>119 あ、それは問題には指定されていないので使ってもいいと思います。
宜しくお願いします。
どっちなんだYO!
124 :
名無し募集中。。。 :04/12/13 21:29:13
>>121 % gcc -Wall -Wpointer-arith -Wstrict-prototypes hoge.c
hoge.c: In function `main':
hoge.c:4: 警告: 関数 `malloc' の暗黙の宣言
% ./a.out
zsh: 4922 segmentation fault ./a.out
せぐめんてーしょんふぉーると(pgl
125 :
sage :04/12/13 21:50:07
文字配列により表現された16進正整数をatoiで整数に変換できるのであれば、使っちゃダメだと思われます。 すみません…。strlenはOKだと思われます。
>>125 大丈夫。atoiは16進数文字列からは整数にできない。
127 :
デフォルトの名無しさん :04/12/13 21:54:31
問題は 文字型で入力し、その後1文字ずつ改行を加えながら表示させなさい 下記まで考えたができんっ!ちなみにこんな感じの考え方で良いんだって。 まぁ、どうせ初心者だし #include <stdio.h> int main() { char a,*pa; scanf("%s",&a); pa=a; while(a!='\0'){ printf("%c\n",a); pa++; } return 0; }
128 :
デフォルトの名無しさん :04/12/13 22:06:44
言語C++ 「番兵を用いた双方向リストに対して、マージソートを用いて辞書順にソートする関数を作成せよ」という課題が出ました。 ちなみに、リストは struct BListCell { char word[ 64 ]; /* 単語を格納する配列 */ struct BListCell *next; /* 次のセルを指すポインタ */ struct BListCell *prev; /* 前のセルを指すポインタ */ }; と定義してあります。 結構面倒くさいかもしれませんが、よろしくお願いします。
前スレ988ですが、それっぽいものを作ってみたものの、実行してみたら 「エラーが発生したので、…(プログラム名).exeを終了します」とか言われました。 どなたか添削お願いします。 #include <stdio.h> #include <string.h> char *my_strstr(char *s, char *p){ char *cs, *cp; while(*s){ cs = s; cp = p; while(*cs == *cp){ cs++; cp++; } if(*cp == '\0'){ return(s); } s++; } return(NULL); }
int main(void){ int i, x, p = 0, q = 0; char *pat = "abc", buf[256], result[256]; scanf("%d", &x); for(i = 0; i <= x; i++){ fgets(buf, sizeof buf, stdin); } if(my_strstr(buf, pat)){ p = q + strlen(buf); for(i = q; i <= p; i++){ buf[i] = result[i]; q = q + strlen(buf); } } for(i = 0; i <= p; i++){ printf("%s\n", result[i]); } return(0); } 以上です。お願いします。
少しは自分でやれよプ
( ´ー`)フゥー...
>>124 >>121 #include <stdio.h>
#include <stdlib.h>
int main(void){
char *p;
label:
p=malloc(1);
goto label;
return 0;
}
>>129 http://en.wikibooks.org/wiki/Programming:C_strings#The_strstr_function #include <string.h>
/* strstr */
char *(strstr)(const char *s1, const char *s2)
{
size_t s2len;
/* Check for the null s2 case. */
if (*s2 == '\0')
return (char *) s1;
s2len = strlen(s2);
for (; (s1 = strchr(s1, *s2)) != NULL; s1++)
if (memcmp(s1, s2, s2len) == 0)
return (char *) s1;
return NULL;
}
>>132 <stdio.h> は何で include するの?
>>115 ふと気になったのだが
>演算結果が実数になる場合は、小数点以下を切り捨てよ
正整数同士の四則演算で、虚数が出てくることってあるのか?
136 :
デフォルトの名無しさん :04/12/13 22:58:12
[1] 授業単元: データの入力と出力 [2] 問題文(含コード&リンク): 1.半径rをキーボードから読み込み、その球の表面積Sと体積Vを求めるプログラムを作れ。 ただし、 S=4πr^2 V=4πr^3/3 π=3.14 とする。 2.実行すると「画面の前にいる人に名前を尋ねて、その人がキーボードに打ち込んだ名前を文字列に収納する」ようなプログラムを作れ。 [3] 環境 :C言語 [4] 期限:2004年12月14日12:00まで [5] その他の制限: なし。 お願いいたします。
>>135 正整数と四則演算と虚数の定義によるんじゃない?
138 :
sage :04/12/13 23:05:08
>>136 [1]
#include <stdio.h>
int main(void)
{
double r;
double PI = 3.14;
scanf("%lf", &r);
printf("S = %lf\nV = %lf\n", 4 * PI * r * r, 4 * PI * r * r * r / 3);
return 0;
}
[2]
#include <stdio.h>
#define BUF_SIZE 1024
int main(void)
{
char buf[BUF_SIZE];
printf("がめんのまえにいるひとのなまえはなんですか?: ");
fgets(buf, BUF_SIZE, stdin);
return 0;
}
139 :
デフォルトの名無しさん :04/12/13 23:08:09
>>136 なんかもう、自分では一切やりませんよって感じだなw
宿題対策は2chで。とか広まってんじゃねプ
>>138 ありがとうございます。
>>139 自分でやったんですがテンプレに記入するところが見当たらなかったので・・・
テンプレにないから書きませんでしたか。すごいやる気のなさだな
143 :
デフォルトの名無しさん :04/12/13 23:25:11
プ
プププ
ぺ
ジウ
ヨン
148 :
six :04/12/13 23:47:16
ハフマン符号のプログラムで下記のプログラムをvisual c で実行したとこと、 「f:\プログラム\huffman.c(11) : fatal error C1083: インクルード ファイルがオープンできません。'unistd.h': No such file or directory cl.exe の実行エラー」 とでるのですが、これはvisual c がきちんと入ってないから起こるエラー なのでしょうか?どなたかわかるかたいらっしゃったら詳しく聞かせてもらえないでしょうか。
149 :
six :04/12/13 23:47:37
#include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<unistd.h> #defineSIZE256 #defineBRANCH0x100 typedef struct _node { intsym; intcount; struct _node*right; struct _node*left; } NODE;
150 :
six :04/12/13 23:48:20
intsym_count[SIZE]; intcode[SIZE]; intheap_size = 0; NODE*heap_table[SIZE]; NODE*root; charheader[] = "HUFF"; intresult = 0; NODE * get_node( void ) { NODE*node = malloc( sizeof( NODE ) ); if( node == NULL ){ fprintf( stderr, "メモリが足りません\n"); exit( 1 ); } return node; }
>>148 unistdはunix用ヘッダだからVCには入ってない
152 :
six :04/12/13 23:48:56
#defineCOUNT_COMP( i, j )heap_table[(i)]->count - heap_table[(j)]->count #define SWAP( i, j ){\ NODE*tmp = heap_table[(i)];\ heap_table[(i)] = heap_table[(j)];\ heap_table[(j)] = tmp;\ } void make_heap( void ) { inti, j , k; for( i = 0; i < SIZE; i++ ){ if( sym_count[i] ){ NODE*p = get_node(); p->sym = i; p->count = sym_count[i]; p->left = p->right = NULL; heap_table[heap_size++] = p; } }
153 :
six :04/12/13 23:49:20
for( i = heap_size / 2 - 1; i >= 0; i-- ){ for( j = i; (k = 2 * j + 1) < heap_size; j = k){ if( (k + 1 < heap_size) && COUNT_COMP( k, k + 1 ) > 0 ) k++; if( COUNT_COMP( j, k ) < 0 ) break; SWAP( j, k ) } } } NODE * get_heap( void ) { NODE*result; intj, k; result = heap_table[0]; heap_table[0] = heap_table[--heap_size]; for( j = 0; (k = 2 * j + 1) < heap_size; j = k){ if((k + 1 < heap_size) && (COUNT_COMP(k, k + 1) > 0)) k++; if( COUNT_COMP( j, k ) < 0 ) break; SWAP( j, k ) } return result; }
perlで次のようなコードを書きました。 $s = '1102785302.dat<>ダイオキシンが原因 ウクライナ野党候補の急病 (120)'; $s =~ m/^(\d+)\.dat.*\((\d+)\)$/; print $1,"\t",$2,"\n"; 出力結果は、 1102785302 120 で、期待どおりのものでした。 これをC++のboost::regexで実行しようとして、次のようなコードを書きました。 string str = "1102785302.dat<>ダイオキシンが原因 ウクライナ野党候補の急病 (120)"; boost::smatch m; boost::regex r("^(\d+)\.dat.*\((\d+)\)$"); boost::regex_search(str, m, r); cout << m.str(1) << "\t" << m.str(2) << endl; ところが、出力は期待のものが得られませんでした。 これはboostの正規表現はperlのものと違うということでしょうか?
>>154 \は\\にしないとダメぽ
boost::regex r("^(\\d+)\\.dat.*\\((\\d+)\\)$");
文字列の入ったテキストファイルを読み込んで、 あらかじめ作っておいた配列に格納する方法を教えてください C言語でお願いします
マルチ死ね
マルチだろうがなんだろうが、宿題スレなんだから引き受けて もらわないと困るんですよ
159 :
デフォルトの名無しさん :04/12/14 01:27:40
160 :
デフォルトの名無しさん :04/12/14 01:28:28
>>159 リンク先はjpgとなっていますが、IEでテキストとして見れます。
161 :
デフォルトの名無しさん :04/12/14 01:30:17
マルチだろうがなんだろうが、宿題スレなんだから引き受けて もらわないと困るんですよ
>>162 タダで仕事を無理に引き受けさせようとするお前の態度が気に入らない。
FILE *fp; int n=0; if ((fp = fopen("file.txt", "r")) == NULL) exit(1); while (fgets(array[n], MAX_LEN, fp) != NULL) n++; fclose(fp);
マルチだろうがなんだろうが、宿題スレなんだから引き受けて もらわないと困るんですよ
マルチだろうがなんだろうが、宿題スレなんだからさっさと答えろやお前ら。 どうせ仕事してないんだろ?
マルチだろうがなんだろうが、宿題スレなんだからさっさとやっとけよ? 俺が起きるまでにドキュメントも仕上げとけ
彼は寝た?
169 :
デフォルトの名無しさん :04/12/14 03:06:02
[1] ファイル入出力 [2] 予め与えられた行列(テキストファイル)で、列重みが最大な列の番号を出力するプログラム 。 [3] 環境 [3.1] OS:UNIX [3.3] 言語:C [4] 期限:水曜
[2] 問題文1: input.txtなるファイルからスペースで区切られた数値の列を読み込み, その平均値をoutput.txtなるファイルに出力せよ. その際,ファイルの終わりは,EOFにより検出せよ. 問題文2: 文字列型変数nameと整数型変数iの値をキーボードから読み込み, 文字列型データのi番目の文字を標準出力に出力せよ. 問題文3: 倍精度実数xの値をキーボードから読み込み, 以下の2つの式の値の差の絶対値が0.00001より小さくなるような最小のnを標準出力に出力せよ. y=Σ[i=0,n]x^i z=1/(1-x) [3] 環境 [3.1] OS:UNIX [3.3] 言語:C [4] 期限:2004年12月14日17:00まで いろいろやってみましたができませんでした・・・。 3番はできればでいいのでよろしくお願いします。
くだらない質問で恐縮ですが、 C言語で配列の要素数を#defineやプログラム内で宣言せずに scanfなどでプログラム実行中に後から指定する方法は無いのでしょうか? やって見ると、「定数式が必要」とエラーになるのですが・・・
C99
>>154 うまくいきました!
ありがとうございました
176 :
デフォルトの名無しさん :04/12/14 05:52:07
はやく朝飯作れよ
>>172 C99から静的配列の要素数にconst int 型の変数が使えるようなった。
C99がつかえないなら callocをつかう。
const int bufsize = 1024;
int *iptr = calloc ( bufsize, sizeof(int) )
/
何らかの処理
/
free(ipr);;
>>171 問題文1 おいら初心者なので間違ってたらゴメン
#include <stdio.h>
int main(){
double data, temp = 0; int cnt = 0;
FILE *fp1, *fp2;
char fname1[64] = "hw.dat"; char fname2[64] = "output.txt";
fp1 = fopen(fname1, "r");
if (fp1 == NULL){
printf("ファイルをオープンできません。\n");
} else {
while(1){
if ( fscanf(fp1, "%lf", &data) == -1 ){
break;
} else {
temp += data;
cnt++;
}
}
fclose(fp1);
fp2 = fopen(fname2, "w");
if (fp2 == NULL){
printf("ファイルをオープンできません。\n");
} else {
if ( fprintf(fp2, "%f", temp / cnt ) == -1){
printf("ファイルの書き込みに失敗しました\n");
}
fclose(fp2);
}
}
return 0;
}
3番 xが -1 < 0 < 1 の範囲のとき、解が求まるけど、あってますか?
>>179 ありがとうございます。参考にさせていただきます
>>180 解はそうかもしれませんね。なんか数学の定理だか公式らしいです。
出力結果は
例えば,x=0.9 のとき n=131, x=0.5 のとき n=17 となる.
らしいです。
>>178 どうも有難うございます。
前者の方でできました。
【課題】 入力ファイルの英文単語の先頭文字を大文字へ変換して別ファイルへ出力するプログラムを作りたい。 【仕様】 1.次のような入力ファイルを入力すると、出力ファイルReformed.txtを得る。 入力ファイルlyrics.txtの内容 there's a lady who's sure all that gitters is gold and she's buying a stairway to heaven. 出力ファイルReformed.txtの内容 There's A Lady Who's Sure All That Gitters Is Gold And She's Buying A Stairway To Heaven. (注意!プログラムは行頭が空白でも正しく機能すること) 2.プログラムは a.out lyrics.txt reformed.txt とコマンドを入力して実行する。 3.プログラムはファイル入力部分、大文字変換部分、ファイル出力部分の3つの関数とMain関数から構成したい。 【環境】 言語:C言語 関数とか…苦手なんだよママン…(;つД`) どなたか力を貸していただきたいです。
↑関数苦手だったら何もできないのと同じじゃないかヲイ
a.out lyrics.txt reformed.txt で reformed.txt を Reformed.txt に変更してから ファイルを作成する機能も必要?
そうかもね 環境unix系ぽいし関数の流用利くし
187 :
デフォルトの名無しさん :04/12/14 13:50:48
188 :
デフォルトの名無しさん :04/12/14 16:01:15
課題:"今までに習った事を用いて", sin,cosの計算をするプログラムを作成せよ. 例) 入力[s90]結果[1] 入力[c60]結果[0.5] など #include <stdio.h> #include <math.h> #define pi (3.1415926535) main() { char op2; double kakudo, x, result; scanf("%c", op2); if(op2 = 'c'){ scanf("%lf",&kakudo); x = kakudo / 180. * pi; result = cos(x); printf("%lf\n",result); } else if(op2 = 's'){ scanf("%lf",&kakudo); x = kakudo / 180. * pi; result = sin(x); printf("%lf\n",result); } } ここまで作りましたが,実行しても何故か Segmentation fault と表示されてしまいます.一体何がいけないのでしょうか.ご教授お願いします!
>>188 printfの書式指定文字列に"%lf"ってあったっけ。もっとも、間違えやすい
人が多いので、許している処理系もあるが。
191 :
188 :04/12/14 16:25:27
>>189 ありがとうございます
最初の問題は解決しました
しかしsとcどちらの入力をしてもコサインの計算が行なわれるようです.
if文の使い方に問題があるのでしょうか?
192 :
デフォルトの名無しさん :04/12/14 16:38:00
質問です(C言語) 「 mcbsp0_rx_intr 」 ←の動作を説明していただけませんか? また、McBSP0_DRR,McBSP0_DXRはc6711.hに定義されているレジスタであって、 *(unsigned int *)McBSP0_DXR=x&0xfffe; の「0xfffe」の意味は何か これも説明していただけると幸いですm(_ _)m ちなみにプログラムの一部は temp=*(unsigned int *)MUXL&0xfc1fffff; temp=temp | 0x01a00000; *(unsigned int*)MUXL=temp ICR=0xffff; IER=0x0102; CSR=CSR | 1; INT8: b _mcbsp0_rx_intr NOP 〃(×6) となります。
196 :
デフォルトの名無しさん :04/12/14 17:28:31
>>195 int input[256]; → char input[256];
ざっと眺めただけだからいけるかどうかわからんけど。
あと、<iostream.h>とかは古いから<iostream>とかを使うようにしようね。
>>196 コンパイルすら通らないコード持って来るな。
>>197 charとは気がつきませんでした、
どうもありがとうございます。
>>198 コンパイルとおりませんでしたか!?
失礼しました。
こちらで確認します。
>>195 あと、
input[j] = toupper(input[j=j+1]);
これは動作未定義だよ。副作用完了点がはっきりしない。
次の行でjをインクリメントするように汁。
それと、there'sがThere'Sになるのはまずいだろう。
203 :
デフォルトの名無しさん :04/12/14 17:57:07
未定義じゃなくて左辺のjがインクリマンコ後の値になる
確かにインクリマンコですた。
205 :
デフォルトの名無しさん :04/12/14 21:52:14
2次元配列を用いて九九の結果を画面に出力するプログラムを作成せよ。 但し掛け算の計算はmulとして関数を作成すること。 おしえてくだされ
206 :
デフォルトの名無しさん :04/12/14 21:54:13
キーボードから2つの整数を入力し、その加算、減算、乗算、除算を計算し結果を 画面に出力するプログラムを作成せよ。 但し各処理ごとに加算:add 減算:sub 乗算:mul 除算:divとして関数を作成すること。 (除算の結果は実数で) C言語についてです。わかりません
マルチだろうがなんだろうが、宿題スレなんだから引き受けて もらわないと困るんですよ
210 :
デフォルトの名無しさん :04/12/14 22:04:49
>>205 #include<stdio.h>
void kuku(int *x){
int i,j;
int *xi;
xi=x;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
*(xi+j)=(i+1)*(j+1);
}
}
}
int main(int argc,char* argv[]){
int x[9][9];
int i,j;
kuku(&x[0][0]);
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("%d ",x[i][j]);
}
printf("\n");
}
return(0);
}
211 :
デフォルトの名無しさん :04/12/14 22:10:02
>>210 mulがねーぞー、こんなもん使えねーなー
212 :
デフォルトの名無しさん :04/12/14 22:11:25
>>211 わりぃわりぃ
#include<stdio.h>
void mul(int *x){
int i,j;
int *xi;
xi=x;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
*(xi+j)=(i+1)*(j+1);
}
}
}
int main(int argc,char* argv[]){
int x[9][9];
int i,j;
kuku(&x[0][0]);
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("%d ",x[i][j]);
}
printf("\n");
}
return(0);
}
213 :
デフォルトの名無しさん :04/12/14 22:12:16
>>211 いかん、酔ってるなw
#include<stdio.h>
void mul(int *x){
int i,j;
int *xi;
xi=x;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
*(xi+j)=(i+1)*(j+1);
}
}
}
int main(int argc,char* argv[]){
int x[9][9];
int i,j;
mul(&x[0][0]);
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("%d ",x[i][j]);
}
printf("\n");
}
return(0);
}
このmul結構速いし、いいと思うよ。
>>206 ぐらいまでくると、わからないと言われても考えてないだけにしか思えないな
>>206 #include <stdio.h>
int add(int x, int y){return x + y;}
int sub(int x, int y){return x - y;}
int mul(int x, int y){return x * y;}
double div(int x, int y){return (double)x / y;}
int main(){
int x, y;
printf("x?:");
scanf("%d", &x);
printf("y?:");
scanf("%d", &y);
printf("%d+%d=%d\n", x, y, add(x, y));
printf("%d-%d=%d\n", x, y, sub(x, y));
printf("%d*%d=%d\n", x, y, mul(x, y));
printf("%d/%d=%f\n", x, y, div(x, y));
}
>>214 そんんことはどうでも良いんだよ。はよ、答え作れボケカス
>>205 #include <stdio.h>
int mul(int x, int y){
return x * y;
}
int main(){
int i, j, res[9][9];
for (i = 1; i <= 9; ++i)
for (j = 1; j <= 9; ++j)
res[i - 1][j - 1] = mul(i, j);
printf(" 1 2 3 4 5 6 7 8 9\n");
for (i = 1; i <= 9; ++i){
printf("%d", i);
for (j = 1; j <= 9; ++j)
printf("%3d", res[i - 1][j - 1]);
printf("\n");
}
}
221 :
206 :04/12/14 22:38:35
サンクス
次は
>>206 のプログラムをポインタ変数を使い計算するようにプログラムを書き直せ
ヒント:例えば、問題
>>206 で2つの整数型の変数を
int num1, num2;
と宣言しているならば、
int *pnum1, *pnum2;
として、各変数のアドレスを代入するためのポインタ変数を宣言し、後のプログラム
もポインタ変数にあわせて修正する。
だそうです。お願いします
222 :
デフォルトの名無しさん :04/12/14 22:41:31
ワラタw
すげー
>>221 こういうことかな。出来れば問題は一度に書いてほしいんだけれども。
#include <stdio.h>
int add(int *x, int *y){return *x + *y;}
int sub(int *x, int *y){return *x - *y;}
int mul(int *x, int *y){return *x * *y;}
double div(int *x, int *y){return (double)*x / *y;}
int main(){
int x, y;
int *px = &x, *py = &y;
printf("x?:");
scanf("%d", px);
printf("y?:");
scanf("%d", py);
printf("%d+%d=%d\n", *px, *py, add(px, py));
printf("%d-%d=%d\n", *px, *py, sub(px, py));
printf("%d*%d=%d\n", *px, *py, mul(px, py));
printf("%d/%d=%f\n", *px, *py, div(px, py));
}
225 :
206 :04/12/14 23:32:51
サンクス。がmmばって単位とりまし
単位取りだけじゃなくて勉強もがんばろうね。まぁ、こういうところで 聞いてるわけだし、プログラムが将来いらないような職業に就くん だろうけど。
これで単位取れるような教育に意味なんてあるんだろうか・・・
丸写しバレバレだから単位取れないと思うよ
>>206 最低限質疑応答に答えられるくらいの理解はして桶
230 :
さゆ :04/12/15 00:52:09
<<183 #include <stdio.h> #include <ctype.h> #include <stdlib.h> #define BUF 256 #define wordblock(s) s == ' ' || s == ',' || s == '.'\ || s ==':' || s == ';' || s == ')' || s == '(' || s == '?'\ || s == ']' || s == '[' || s == '@' || s == '/' || s == '<'\ || s == '>' || s == '#' || s == '$' || s == '&' || s == '*'\ || s == '%' || s == '{' || s == '}' #define file_open(fp, fname, mode, errno) \ if((fp = fopen(fname, mode)) == NULL){\ fprintf(stderr, "Can't open file:%s\n", fname);\ exit(errno);\ } int input_stream(FILE *fp, char *s); void convert(char *s); int output_stream(FILE *fp, char *s);
231 :
さゆ :04/12/15 00:53:30
int main(int argc, char *argv[]) { char s[BUF]; FILE *fp1, *fp2; if(argc != 3){ fprintf(stderr, "Input read & write file name\n"); exit(1); } file_open(fp1, argv[1], "r", 1); file_open(fp2, argv[2], "w", 1); while(input_stream(fp1, s) != EOF){ convert(s); if(output_stream(fp2, s) == '\0'){ fprintf(stderr, "Can't write file %s:\n",fp2); exit(1); } } fclose(fp1); fclose(fp2); return 0; }
232 :
さゆ :04/12/15 00:54:52
int input_stream(FILE *fp, char *s) { int c, i; for(i =0; i < BUF - 1; i++){ if((c = fgetc(fp)) == EOF){ if(i == 0) return EOF; s[i] = '\0'; return 1; } s[i] = c; } s[i] = '\0'; return 1; } void convert(char *s) { int i, c; static int up = 1; for(i = 0; s[i] != '\0'; i++){ c = s[i]; if(wordblock(c)) up = 1; else if(isalpha(c) && up){ c = toupper(c); up = 0; } s[i] = c; } }
233 :
さゆ :04/12/15 00:55:13
int output_stream(FILE *fp, char *s) { if(fprintf(fp, s) < 0) return '\0'; return 1; } /*改行も区切りにするときは最初のところに付け加えてね。*/
出力後のfclose()のエラーチェックしないでfprintf()のエラーチェックをしている馬鹿さ加減が笑える。
236 :
デフォルトの名無しさん :04/12/15 01:36:27
半径(r)と中心点(x0,y0)、始点(x1,y1)、中間点(x2,y2)、終点(x3,y3)と分かっていて、 始点から中間点の角度、中間点から終点の角度をそれぞれ計算し、 始点から中間点を通って終点までの円弧の長さの計算のプログラムを作成してください。 お願いします。
237 :
さゆ :04/12/15 01:40:05
>> 【質問テンプレ】 [1] 授業単元: [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: [3.2] コンパイラ(バージョン): [3.3] 言語:C/C++/どちらでも可 のいずれか [4] 期限:yyyy年mm月dd日hh:mmまで/無期限 のいずれか [5] その他の制限:
>>236 中心 (x0, y0) 半径r ってのは分かるけど
始点中間点終点の定義が分からない絵にでも書いて
それらのデータの整合性が取れている保証はある?
240 :
236 :04/12/15 01:52:36
始点中間点終点は任意で決め、そこから中心と半径を求めるプログラムを作り、 それから236へつながってます。説明不足ですみません。
3点が決まれば円が描けるが、2点以上が同じ点だったり、 一直線上に乗っていないかどうかとかはチェックする必要あり。
str1で渡された文字列を、反転してstr2で指定された領域に格納する関数 char*strrev(char *str1,char *str2) を定義し、その動作を確認するプログラムを書け。 ただし文字列の長さを調べるstrlen関数を使用すること。 また、関数strrevは反転した文字列の先頭ポインタを関数値とすること。 (str1が''abc''ならstr2は''cba''という風に) 以上です。C言語でお願いします。 ポインタの概念がどうもよく分からないです...う〜ん、勉強不足か。 参考書とか買って自主的に勉強しないとなぁ...
>>242 #include <stdio.h>
#include <string.h>
char *strrev1(char *str1, char *str2)
{
char *p = str1 + strlen(str1) - 1, *orig2 = str2;
while (1) {
*str2++ = *p;
if (p == str1) {
*str2 = '\0';
break;
} else
p--;
}
return orig2;
}
int main(void)
{
char buf[128], buf2[128];
printf("input str1 = ");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
printf("reversed string(str2) = %s\n", strrev1(buf, buf2));
return 0;
}
>>242 上のプログラムで関数名がstrrev1()となっているのは、string.h内に
同名の関数strrev()があるからです。その辺は適当にいじって。
ところで strrev の使い道ってどんなのがあるん?
はじめまして。C++でよろしくお願いします。 ------------------------------------------ (a.txtファイル) aaaaaaaaaaa:fajdjgal;djkl;asjfl;as bbbbbbbbbbbbbbbb:klasjf;laskdjfklsjgslkjf ccccccccccc:klasjfl;asjf ・ ・ ・ ------------------------------------------ 一行が?:?っていうパターンの文字なんですが、 これを ------------------------------------------ (a.txtファイル) aaaaaaaaaaa bbbbbbbbbbbbbbbb ccccccccccc ・ ・ ・ ------------------------------------------ こんな風なa.txtファイルにしたいんです。 :が出てきたらどうにかするんだと思うのですが、 よくわかりません。よろしくお願いします。
>>246 #include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
int main()
{
std::ifstream ifs("a.txt");
std::string str;
std::vector<std::string> vs;
if (!ifs) {
std::cerr << "a.txtがありません。" << std::endl;
std::exit(1);
}
while (std::getline(ifs, str))
vs.push_back(str);
ifs.close();
std::ofstream ofs("a.txt");
if (!ofs) {
std::cerr << "a.txtのオープンに失敗しました。" << std::endl;
std::exit(1);
}
for (std::vector<std::string>::const_iterator pos = vs.begin(); pos != vs.end(); ++pos) { str = *pos; std::string::size_type sz = str.find(":"); if (sz != std::string::npos) str = str.substr(0, sz); ofs << str << "\n"; } ofs.close(); }
>>247 おおお、こんなにも早くありがとうございました。
250 :
デフォルトの名無しさん :04/12/15 04:51:43
>>242 ・・・その問題、全く同じ形で先日オレの大学で出されたのだが・・・。
多分あんた、オレと同級生かもね。
二次元平面上の点のための構造体point,円のための構造体circleを次のように定義する struct point{double x;double y;} struct circle{struct point center;double hankei;} (1)円の面積を求める次の関数を作り,mainプログラムでその動作を調べよ。 double menseki(struct circle c1) 構造体を習ったばかりで出されたのですが全然分かりません、教えてください。
>>252 中心の座標を入力する意味が無いけどこんな感じ?
#include <stdio.h>
#include <math.h>
struct point { double x; double y; };
struct circle { struct point center; double hankei; };
double menseki(struct circle c1)
{
return c1.hankei * c1.hankei * M_PI;
}
int main(void)
{
struct circle c;
printf("中心の座標を入力: ");
scanf("%lf%lf", &c.center.x, &c.center.y);
printf("半径を入力: ");
scanf("%lf", &c.hankei);
printf("%lf\n", menseki(c));
return 0;
}
jpgワロタ 究極の丸投げだなw
おはようございます。よろしくおねがいします。 問題1.ファイルの整理の問題です。 list.txt ------------ tanaka okawa jack ・ ・ tanaka okawa ・ ・ tanaka ・ ・ ------------ これを list-out.txt ------------ tanaka okawa jack ・ ・ ------------ というふうに一回出てきた名前(文字列)を削除して出力してください。
問題2.2つのファイルの整理の問題です。 list1.txt ------------ tanaka okawa jack ・ ・ ------------ list2.txt ------------ jack ・ ・ ------------ list2.txtに出てきた名前(文字列)をlist1.txtから取り除いて list3.txt ------------ tanaka okawa ・ ・ ------------ と言うふうに出力してください。 よろしくお願いしますです。
259です。 言語はC++です。修行中です。 よろしくおねがいします。
>>252 まさかと思って問題見たら、同じ学校ですね....w
お互いCの勉強頑張りましょう。
質問ブン投げで何を勉強するの?
学校の勉強はC言語だけじゃありませんから。 C言語は単位さえ取れればいいんです。
265 :
デフォルトの名無しさん :04/12/15 09:28:02
266 :
デフォルトの名無しさん :04/12/15 09:28:39
今技術職だとどんな分野でも大抵はプログラミングやるよ。 足し算とか掛け算も出来ないレベルだと、将来困ると思う。 基礎の基礎(教科書の最初の方)くらいは出来た方がいいと思うのだが・・・ それとプログラムってやってみると意外と楽しいよ。論理的思考力も付くしね。
仕事中ににちゃんねるで説教ですか。 あまり説得力無いですね。
>>260 #include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>
using namespace std; int main() { string str; vector<string> vec_List2; vector<string>::iterator itr; ifstream ifs("list2.txt"); if (!ifs) {cerr << "ファイルlist2.txtがねぇよ" << endl;exit(1);} while (std::getline(ifs, str)){ vec_List2.push_back(str); } sort(vec_List2.begin(),vec_List2.end()); ifs.close(); ifs.open("list1.txt"); if (!ifs) {cerr << "ファイルlist1.txtがねぇよ" << endl;exit(1);} ofstream ofs("list3.txt"); if (!ofs) {cerr << "list3.txtがつくれねぇ" << endl;ifs.close();exit(1);} while (std::getline(ifs, str)){ itr = lower_bound(vec_List2.begin(), vec_List2.end(), str ); if (itr == vec_List2.end()){ ofs << str << endl; } } ofs.close(); ifs.close(); }
>>259 #include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
int main()
{
string str;
vector<string> vec_List2;
vector<string>::iterator itr;
ifstream ifs("list.txt");
if (!ifs) {cerr << "ファイルlist.txtがねぇよ" << endl;exit(1);}
while (std::getline(ifs, str)){
vec_List2.push_back(str);
}
sort(vec_List2.begin(),vec_List2.end());
itr = unique(vec_List2.begin(),vec_List2.end());
vec_List2.erase(itr,vec_List2.end());
ofstream ofs("list-out.txt");
if (!ofs) { cerr << "list-out.txtがつくれねぇ" << endl; ifs.close(); exit(1); }
for ( int i = 0 ; i < vec_List2.size() ; i++ ){
ofs << vec_List2[i] << endl;
}
ifs.close();
ofs.close();
}
>>259 cat list1.txt | sort | uniq > list-out.txt
>>260 cat list1.txt | sort | uniq > list1.tmp
cat list2.txt | sort | uniq > list2.tmp
diff list1.tmp list2.tmp > list3.txt
>>272 > cat list1.txt | sort | uniq > list1.tmp
> cat list2.txt | sort | uniq > list2.tmp
> diff list1.tmp list2.tmp > list3.txt
zsh だと
diff =(sort -u < list1.txt) =(sort -u < list2.txt) > list3.txt
ですんじゃうんですよと zsh の宣伝.
>>272-273 テンポラリ作らずに済ませる方法に興味があるんだけど
zsh以外のシェルでも同様の事は出来るんですか?
要素数がnである配列aからkeyと一致する全要素の添え字を、 配列idxの先頭から順に格納し、一致した要素数を返す以下の関数を作成する。 int searchidx(int a[],int n, int key, int idx[]); 自分でも考えたのですが、検索を開始するとコアダンプしてしまいます。 御指導お願いします。
idxの領域確保してないんじゃないの?
>>254 ありがとう御座います、参考にさせていただきますm(__)m
>>262 多分同じ・・ですねコリャ。お互いがんばりましょう
279 :
デフォルトの名無しさん :04/12/15 14:18:10
[1] 授業単元:情報工学 [2] 問題文:整数専用で、しかも足し算・掛け算・引き算しか出来ない電卓のプログラム を作る。+,-,*,=以外の記号を入力した場合、再入力させます。=が入力されたら 終了して結果表示する。while文を使う。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ(バージョン):visual basic かな・・ [3.3] 言語:C++ [4] 期限:2004念12月21日 [5] その他の制限: 整数値を入力 54 +,-,*,=のいずれか入力 + 整数値を入力 6 +,-,*,=のいずれか入力 = 答えは 60です。 みたいな感じにして下さい。お願いします!
[課題] 文字列s1、s2を引数で受け取り、s1に文字列s2が含まれているかどうか調べる関数を作成しなさい 実行結果は、含まれているなら1を、含まれていないなら0をそれぞれ返すようにしなさい。 文字列検索関数strcmpなどは使用しないこと。 [環境] 言語:C 文字列検索関数を使えば簡単に解けるんですけど、使用禁止となるとさっぱりわかりませんorz
アルファベットのみです
#include <stdio.h> int incr(int); int main(void) { int a; scanf("%d",&a); a=incr(a); printf("%d\n",a); } int incr(int x) { return(x+1); } このプログラムで変数aのアドレスを引数として渡し、返値のない形の 関数に書き換えてください おねがいします
void incr(int *x) { (*x)++; } - a=incr(a); + incr(&a);
285 :
さゆ :04/12/15 15:41:31
>>280 int same(char *s1, char *s2)
{
int i, j, n, m;
int skip[0x80];
n = strlen(s1) - 1;
m = strlen(s2) - 1;
for(i = 0; i < 0x80; i++)
skip[i] = m + 1;
for(i = 0; i < m; i++)
skip[i] = m - i;
for(i = 0; i < n - m + 1; i += skip[s1[i+m]])
if(s1[i+m] == s2[m]){
for(j = m - 1; j >= 0; j--)
if(s1[i+j] != s2[j])
break;
if(j < 0)
return 1;
}
return 0;
}
はーい。
>>280 ベタに書いてみました
さゆたんのはBM法?
int mystrstr(const char* s1,const char* s2)
{
int i,j;
for(i=0;s1[i];i++){
for(j=0;s2[j];j++){
if(s2[j]!=s1[i+j])break;
}
if(s2[j]=='\0')return 1;
}
return 0;
}
287 :
デフォルトの名無しさん :04/12/15 16:04:00
>>286 if(s2[j]!=s1[i+j])break;
これはまずいよー。
ほんとだまずいねー if(s1[i+j]||s2[j]!=s1[i+j])break;
290 :
デフォルトの名無しさん :04/12/15 16:28:46
Visual C++ ・2つの整数型変数の値を入れ替える関数を作る。 ・呼び出した側の変数iとjの値を変更するのが目的なので、swap()は引数にアドレスを渡す必要がある ・関数swap()の中で、2つの値を壊さずに入れ替えるには、中間変数を経由して代入する必要がある #include <stdio.h> void swap(int *ip, int *jp){ /* swap()の中だけで用いる局所的な変数の宣言*/ /* *ip と *jp の値を入れ換える処理*/ } void main (){ int i, j; /* iを入力させるためのプロンプト */ /* scanf()の呼び出し */ /* jを入力させるためのプロンプト*/ /* scanf()の呼び出し */ /* swap()の呼び出し */ /* iとjの表示(printf()の呼び出し)*/ } お願いします。
>>290 #include <stdio.h>
void swap(int *ip, int *jp)
{
int tmp = *ip;
*ip = *jp;
*jp = tmp;
}
int main(void)
{
int i, j;
printf("input i: ");
scanf("%d", &i);
printf("input j: ");
scanf("%d", &j);
swap(&i, &j);
printf("i: %d\nj: %d\n", i, j);
return 0;
}
>>291 うまく実行しました。ありがとうございます。
int strcmp2(const char *s1, const char *s2) { while(*s1 == *s2){ if (*s1 == '\0') return 0; s1++; s2++; } return (unsigned char)*s1-(unsigned char)*s2; }
295 :
デフォルトの名無しさん :04/12/15 17:09:27
学習単元:条件文 環境:C言語 問題:「予算1000円以内、総移動時間6時間以内」の小旅行をしようと思う。 目的地までの片道の運賃と所要時間を入力すると、この条件に合うかどうかを判別してくれるプログラムを作成しなさい。 コンパイルできる環境がないので添削お願いします。 #include <stdio.h> int main(void) { int a,b; printf("片道の運賃は?"); scanf("%d",&a); printf("所要時間は?"); scanf("%d",&b); if (a*2<=1000 && b*2<=6) { printf("この計画は条件にあう。%\n"); } else { printf("この計画は条件にあわない。%\n"); } return 0; }
>>295 パッと見あってるけど、%\n←これは?
\nの前の%の意味を教えてくれ あと所要時間を入力させるところは、「何時間か」より「何分か」を入力させた方がよくないか? それを変えるなら分岐条件も b<=6*60 になるが
>>290 >・関数swap()の中で、2つの値を壊さずに入れ替えるには、中間変数を経由して代入する必要がある
ダウト
あと例えば-1000円とか入れても通ってしまうのは( ゚Д゚)マズー
>>297 も入れて
if (a>=0 && b>=0 && a*2<=1000 && b*2<=360)
で。
a^=b b^=a a^=b これだけでも入れ替えは可能だな
[3.2] コンパイラ(バージョン):visual basic
[3.3] 言語:C++
>>279
>>300 こんなのでもいけるね。
a=b-a;
b-=a;
a+=b;
>>302 まずVBでC++を使う方法を教えてくれ
307 :
从*・ 。.・) ◆SayuminPM. :04/12/15 17:39:50
>>300 void swap(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
で同じポインタを swap に渡した場合はできないんじゃぁ?
>>307 void swap(int *a, int *b)
{
if (*a != *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
}
a=101 b=101 a^=b → a=000 b^=a → b=101 a^=b → a=101
>>309 swap(&a, &a);みたいなときだよあわてんぼさん
a と a の値を交換 a = 1 a ^= a a ^= a a ^= a 失敗
いや、308の if (*a != *b) へのツッコミだったんだが この場合は if (a != b) でないと意味がないぞ、と
void swap(int * restrict a, int * restrict b) { *a ^= *b; *b ^= *a; *a ^= *b; }
>>279 #include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
bool CheckNum(const char *s){
if (*s == '\0') return false;
if (*s == '-') s++;
while(*s!='\0'){
if ( *s < '0' || *s > '9' ) return false;
s++;
}
return true;
}
char CheckOperator(const char *s){
if (*s == '\0') return 0;
switch (*s){
case '+':
case '-':
case '*':
case '=':
s++;
break;
default:
return 0;
}
if (*s == '\0') return *(s-1);
return 0;
}
int InputNum(){ int ret; string str; while(true) { cout << "数値を入力\t\t"; cin >> str; if (CheckNum(str.c_str())){ ret = atoi(str.c_str()); break; }else{ cout << "数値といっているだろう" << endl; } } return ret; }
int main() { int ret = InputNum(); int n; string str; while(true) { cout << "+,-,*,=のいずれか入力\t\t"; cin >> str; char c = CheckOperator(str.c_str()); if (c){ switch(c){ case '+': ret += InputNum(); continue; case '-': ret -= InputNum(); continue; case '*': ret *= InputNum(); continue; case '=': cout << "答えは\t\t" << ret << "です" << endl; break; } break; }else{ cout << "+,-,*,=のいずれかといっているだろう" << endl; } } return 0; }
[言語]C言語 [課題]ファイルに書かれている数式を読み込んで 計算結果をそのファイルに追加で出力するプログラム。 なお、ファイル名はkeisan.txtとする。 読み込んだ数式 ((3+1)*4)+3 計算結果 19 よろしくお願いします。
320 :
デフォルトの名無しさん :04/12/15 18:42:52
さっきのswapって、aとbの領域が部分的に重なってる場合は考えなくていいの?
321 :
デフォルトの名無しさん :04/12/15 18:46:42
cをアセンブリに書き換える時のコツって何?
324 :
デフォルトの名無しさん :04/12/15 18:51:35
325 :
デフォルトの名無しさん :04/12/15 18:52:11
327 :
デフォルトの名無しさん :04/12/15 18:55:18
>>317 直接 cin >> ret;じゃだめなのか?
[課題] 与えられた文字列をURLエンコードする関数を作れ。 引数はconst char* を受け取り、戻り値はstd::string型の変数とする。 関数の使用例 std::string s = url_encode("はにゃ〜ん");[] [環境] Borland C++ Builder おながいします。 perlでの例は検索して調べたのですが、Cは難しくてorz
課題なら検索して調べるとかじゃなくて考えろよ
>>329 std::string url_encode(const char* str)
{
std::ostringstream ss;
unsigned char c;
while (c = *str++) {
if (('A' <= c && c <= 'Z') ||
('a' <= c && c <= 'z') ||
('0' <= c && c <= '9') ||
c == '*' || c == '-' || c == '.' || c == '@' || c == '_')
{
ss << c;
} else if (c == ' ') {
ss << '+';
} else {
ss << '%' << std::hex << (int)c;
}
}
return ss.str();
}
強引だけど…。文字コード考慮に入れないと駄目かね
2つの変数(整数)の値を交換する関数を作る。2つの変数のアドレスを引数とし返値 のない形にすること。値の入力、結果の表示はmainで行うこと. おねがいします。 実行例 a=13 b=12 交換後 a=12 b=13
#include <stdio.h> void swap(int* pa, int *pb) { int c = *pa; *pa = *pb; *pb = c; } int main(void) { int a,b; printf("a="); scanf("%d", &a); printf("b="); scanf("%d", &b); swap(&a,&b); printf("a=%d\nb=%d\n", a, b); return 0; }
ワラタ
#include <stdio.h> void swap(int*a, int*b); main() { int a,b; printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); swap(&a,&b); printf("a=%d\n",a); printf("b=%d\n",b); return 0; } void swap(int* a, int* b) { int tmp; tmp = *a; *a = *b; *b = tmp; }
atoiの反対の働きをする関数itoaってありますかね(C,C++問わず) 実装するとこんなかんじですか? char* itoa(char s[],int n) { int i; i = 0; do{ s[i] = n%10 + '0'; } while((n/10) > 0); reverse(s); return s; }
>>337 そのまんまitoaがあるぞ。
調べればすぐ分かるだろ
ここの質問者達はプログラミングとかより先に、 自分で必要な情報を探し出す方法を勉強した方が良いな
>>274 スレ違いだが、GnuDiffなら片方は標準入力を使えるのでテンポラリは一つで済む。
>>338 itoa()は標準関数じゃないだろ。もっともほとんどの処理系にはあるけど。
sprintfでいいんじゃないの?
boost::lexical_cast<>でいいんじゃないの?
[課題] 長さnの配列aを、バケットソートを用いてソートする関数bucket_sort(a[], n);を作る。 要素の値の重複はないものと仮定する。つまりバケットには連結リストを用いる必要はない。 また、入力データ(配列aの各要素)の値は0以上であると仮定して良い。 入力データの最大値はn-1であるとする。 nの値は実行するまでわからないので、バケットはmalloc関数を用いて確保する。 動作テストに用いるデータとしてはrand_array関数で出力される配列を用いるとよい。 言語はC++です。宜しくお願いします
>>345 #include <iostream>
#include <algorithm>
#include <iterator>
const int N = 100; // 例えば
void bucket_sort(int a[], int n)
{
int* bucket = new int[n];
for (int i = 0; i < n; i++)
bucket[a[i]] = a[i];
for(int i = 0; i < n; i++)
a[i] = bucket[i];
delete[] bucket;
}
int main()
{
int a[N];
for (int i = 0; i < N; i++)
a[i] = i;
std::random_shuffle(a, a + N);
std::cout << "ソート前 : ";
std::copy(a, a + N, std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
bucket_sort(a, N); std::cout << "ソート後 : "; std::copy(a, a + N, std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; } C++の場合はmallocよりもnew/deleteが自然なのでそちらを使った。 malllocが必要な場合は直して欲しい。 要素の重複がない事から、リストを省略した。rand_array()では要素の 重複が出ないようにするのは難しいので、random_shuffle()を使った。
すみません。確認してみたら使用言語はCでした
使ってる言語すら間違えるってどれだけアホなんだよ
うるさいだまれ
#include <stdio.h> #include <stdlib.h> #define N 100 void bucket_sort(int a[], int n) { int *bucket = malloc(n * sizeof(int)); int i; for (i = 0; i < n; i++) bucket[a[i]] = a[i]; for(i = 0; i < n; i++) a[i] = bucket[i]; free(bucket); } int main(void) { int a[N]; int i, j; for (i = 0; i < N; i++) a[i] = i;
for (i = N - 1; i > 0; i--) { int j = rand() % i, t; if (i == 1) j = 0; t = a[i], a[i] = a[j], a[j] = t; } printf("ソート前 : "); for (i = 0; i < N; i++) printf("%d ", a[i]); printf("\n"); bucket_sort(a, N); printf("ソート後 : "); for (i = 0; i < N; i++) printf("%d ", a[i]); printf("\n"); return 0; } あーCだとちょっとしたアルゴリズムも全部手作り。。。
>>287 >if(s2[j]!=s1[i+j])break;
>これはまずいよー。
よく考えたけどまずくなかったよ
この場所でs1[i+j]で'\0'の後ろにアクセスすることはないでう
無事解けました、ありがとうございます。
360 :
デフォルトの名無しさん :04/12/16 13:11:41
どこがおかしいですか? 問題 西暦2000年から10000年の間で,夏季オリンピックが開催されるにもかかわらず, 閏年でない年をすべて列挙するプログラムを作りなさい。 #include <stdio.h> main() { int y; for(y=2000; y<=10000; y++) if (y % 100 == 0 && y % 400 != 0); printf("%d",y); } [環境] 言語:C よろしくお願いします。
>>360 とりあえず
if (y % 100 == 0 && y % 400 != 0);
↑
西暦10000年までオリンピックが行われるという仮定。
363 :
デフォルトの名無しさん :04/12/16 13:32:38
すいません。ifの後の;はミスです。 「夏季オリンピックが開催されるにもかかわらず」というのを表すには どうすればよろしいのでしょうか? なくても結果は変わらないとは思いますが。
夏季オリンピックがある年は閏年と言われている だがそうでない年があるからそれを求めろという問題なんだろうから なくても結果は変わらない、ということはないんでないの?
課題: C++でスレッドを実装しなさい。 OSのシステムコールは使わないこと。 環境 Linux gcc おながいします
課題 data.txtに0〜100未満の整数が10000個格納されている。コレを全て読み込んで、 “x x+1 x+2”という具合にデータが並んでいるところを探し、あればxが何番目の データかを返し(はじめのデータは一番目)、無ければ“no”を出力せよ。複数の データが条件を満たす場合には、一番目のデータに一番近い位置にあるものを出力せよ。 例)10 11 12 の様な並びを探す。この時、10が740番目のデータであれば740を出力する。 という問題を出されたので自分でやってみたのですが何か駄目でした。 下に作ったのを乗せますので添削お願いします。 言語はC言語です。
#include <stdio.h> int main(void){ int x1, x2,i, j = 0; int value[10000], result[10000]; FILE *in_stream; in_stream = fopen("data.txt", "r"); if((in_stream = fopen("data.txt", "r")) == NULL){ printf("data.txtは存在しません\n"); return(-1); } for(i = 0; i < 10000; i++){ fscanf(in_stream, "%d", &value[i]); } for(i = 0; i < 10000; i++){ x1 = value[i]; x2 = value[i + 1] - 1; if(x1 = x2){ i = result[j + i]; j = i + 1; } } for(i = 0; i < 10000; i++){ printf("%d\n", result[i]); } fclose(in_stream); return(0); } 以上です。お願いします。
>>360 自信ないです
間違ってたらごめんなさい
#include <stdio.h>
int main()
{
int i;
int flag;
for (i = 2000; i <= 10000; i++){
if ( (i % 4) == 0 ){
if ( (i % 100) == 0 ){
flag = 1;
if ( (i % 400) == 0 ){
flag = 0;
}
}
}
if (flag == 1){
printf("%d ", i);
}
flag = 0;
}
putchar('\n');
return 0;
}
>>367 > FILE *in_stream;
> in_stream = fopen("data.txt", "r");
> if((in_stream = fopen("data.txt", "r")) == NULL){
fopenは1回でいい。
FILE *in_stream = fopen("data.txt", "r");
if (in_stream == NULL) {
>>360 まず夏季オリンピックがどういう条件で開催されるかどうかを考える。
そして、閏年になる条件をもう一度よく考える。
その後にプログラムを見直せば2つの条件が足りないことに気づくはずだ。
両方書き足すと冗長になるけど。
リロードすべきたっだか・・・
>>368 flag = 0;
をforループの先頭に書くべき。
>>371 その通りで。
ご指摘ありがとうございます。
>>368 何故そんなに複雑にするんだ
#include <stdio.h>
int main(){
int i;
for (i = 2000; i <= 10000; i++)
if((i % 4) == 0 && (i % 100) == 0 && (i % 400) != 0)
printf("%d ", i);
putchar('\n');
return 0;
}
名前消し忘れた
Cの問題です。 文字列(char配列)を引数として受け取り、中の要素を逆順に並び替える関数reverseを作成しなさい。 reverseの内部の処理については配列操作ではなくポインタ操作で使用すること。 void reverse(char *s); 自力でやったやつ↓ #include <stdio.h> void reverse(char *s) { char *p,c[100]; p=&c; p = s; for(;*p;)*p++; *p--; for(;*s;)*s++ = *p--; } main() { char s[100]; printf("文字列を逆から表示します."); scanf("%s",s); reverse(&s); printf("%s",s); } までやったのですが、半分まで逆に並び替えるのですが、もう半分は元のままです。 例 abcdef を入力するとfeddef になります。 警告 W8075 asdfa.c 6: 問題のあるポインタの変換(関数 reverse ) 警告 W8019 asdfa.c 8: コードは効果を持たない(関数 reverse ) 警告 W8019 asdfa.c 9: コードは効果を持たない(関数 reverse ) 警告 W8004 asdfa.c 6: 'p' に代入した値は使われていない(関数 reverse ) 警告 W8075 asdfa.c 18: 問題のあるポインタの変換(関数 main ) 警告 W8070 asdfa.c 20: 関数は値を返すべき(関数 main ) って出ます。
え!?こっちでは出ないですよ。
>>375 1回でもデバッガで追ってみた?
むしろこれくらい脳内で追えて欲しいが。
警告ですむのか・・・。 アレなコンパイラだな。
380 :
デフォルトの名無しさん :04/12/16 17:26:50
if(a=1){ n=238; } printf("%d\n",n); if(a=2){ n=239; printf("%d\n",n); } if(a=3){ n=240; printf("%d\n",n); } if(n=4){ n=241; printf("%d\n",n); } という風にしたいのですが、ひとつずつ書かずに for文での書き方を教えて下さい。
>>380 for(a = 1; a <= 4; ++a)
n = 237 + a;
あーもう、こっちまで頭悪くなりそうだ。
みす!いきおいで書いちまったがfor文ではかけない かけないこともないが無駄
385 :
380 :04/12/16 17:39:07
>>381 さん
出来ました!!!ありがとうございます☆
助かりました(^ー^)
387 :
385 :04/12/16 17:46:04
>>381 さん
えっ!?なんか出来たっぽいのですが(><)
答えがあってるんです。。。
えっともっと細かく書くと、
a=1〜18のとき、 n=238〜255に、
a=19〜41のとき n=1〜23
にそれぞれ対応するようにしたいんですけど。。。
if (1<=a && a<=18) n = a+237; if (19<=a && a<=41) n = a-18;
if(1 <= a && a <= 18) n = 237 + a; else if(19 <= a && a <= 41) n = a - 18; forはいらんな
うわかぶった。
391 :
デフォルトの名無しさん :04/12/16 17:53:02
なんかもう見てるだけでダルイ('A`) プログラムって難しいな('A`)
392 :
385 :04/12/16 17:54:44
>>388 さん、389さん
出来ました!!!!for文はいらないんですね☆
ほんとにほんとにありがとうございます(^ー^)
>>384 =375
LSI-Cかな?
CPadはコンパイラではない。
p=&c; //だめ。しかもつかってないし。(エラーでそう)
for(;*p;)*p++; // *p++ の * は邪魔
*p--; // 上と同じ
reverse(&s); // &は邪魔(エラーでそう)
int mainなんだからreturn 0;でもして置くように。
警告については以上。
ただ、違う問題が大きいんであとよろしこ。
int main(void){ char s[100]; printf("文字列を逆から表示します.\n"); scanf("%s",s); printf("%s\n", reverse(s) ); return 0; } void reverse(char *s) { char *p; p = s; for( ; *p !='\0' ;p++ ) ; for( ; *s !='\0' ;s++) *s = *(--p); *s='\0'; }
void reverse(char *s) { char *p; char tmp; p = s; for( ; *p !='\0' ;p++ ) ; for( ; p - s > 0 ;s++ ) { tmp = *(--p); *p = *s; *s = tmp; } } int main(void){ char s[100]; printf("文字列を逆から表示します.\n"); scanf("%s",s); reverse(s); printf("%s\n", s); return 0; }
397 :
デフォルトの名無しさん :04/12/16 21:02:06
d^2x/dt^2+dx/dt+x=0 なんていう微分方程式をオイラーとかを使わずに、解析的に解くプログラムはどうすればいいのでしょうか?
むり。 計算機代数でググレ
399 :
デフォルトの名無しさん :04/12/16 21:33:55
オセロゲームのプログラムなのですがわからないところがあります。
実行すると8*8のオセロ盤が表示され、座標値を入力して駒を置きます。
Y軸(縦)が0〜7までの数字で、X軸(横)がa〜hまでのアルファベットです。
左隅に置く場合は、x:0 y:aと入力します。まだ作り始めたところなので
どこにでも駒を置けます。これに駒をチェックする関数をプラスして
駒が置けない場所にはエラーを表示し、駒が配置できなくしたいのです。
下の仕様を満たした関数を教えて下さい。お願いします。
<関数の仕様>
・引数…盤の配列データ、駒の配列データ、駒のX座標、駒のY座標、駒の種類
・戻り値…駒が配置できれば1、できなければ0
・駒が置けない場所…既に駒がある所、周りに一つも駒がない所、
周りに相手の駒がある所(その方向の延長上に自分と同じ駒がない)
<プログラム>
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/29.txt
400 :
デフォルトの名無しさん :04/12/16 21:43:07
その腐った仕様を何とかしたほうがいいんじゃね? 0:駒無し、ー1:黒、1:白 static check(int tate,int yoko){ static char board[8][8]={0}; : } とかして、board[tate][yoko] の値をチェックすれ。
>>397 Wolfram Researchにでも就職しな。
>>373 何故そんなに複雑にするんだ
for (i = 2000; i <= 10000; i += 4) {
/* 以下略 */
}
ではいかんのかね。
>>369 ありがとうございます!
そこって、いつも書くとき面倒だと思ってたんですよ〜。
他に何か指摘する所はありますか?
(1)スタックを実現するプログラムを作成せよ。 (2)二分探索をするプログラムを作成せよ。 (1)は、pushの仕方は分かるのですが、popの仕方がイマイチわかりません。 C言語で作成しています。 どなたかご指導お願い致します。
>>403 突っ込みどころだらけ。
最低限、コンパイラの警告はできるだけ多く出るように設定し、丹念に読むことをお勧め。
>>406 何か、ビルドとかしてもエラーとか出ないんですが、その代わりに
実行すると別ウィンドウで
「エラーが発生したので〜(プログラム名).exeを終了します」
とか出るんですが・・・
詳しい駄目なところが分からず困ってます。
>>407 さっき見た限りではif文の中が比較ではなく代入になっていた。後は忘れた。
すいません。ご迷惑おかけしますが わからないのでお願いします。 宿題↓ テキストファイルを読み込み、行番号を変えて画面に表示し、 また新しいファイルにも書き出すプログラムを作成せよ。 入力:入力ファイル名と出力ファイル名 処理:ファイルの内容を読み込む(最大999桁) 入力用と出力用の2つのファイルポインタを用意する。 (2つのファイルをオープンする) 出力:「行番号」、「読み込んだファイルの内容」を画面と 新しいファイルに出力する。 (printfとfprintf関数を利用すること)
とりあえず、ここまで作りました・・・ ここからどうすればいいのでしょうか? #include <stdio.h> #include <stdlib.h> main() { char fi[50],b[256]; int i; FILE* fp,fp1; printf("input file name:"); scanf("%s",fi); if(NULL==(fp=fopen(fi,"r+"))) { fprintf(stderr,"error:file open[%s].\n",fi); exit(1); } for(i=1;i<=999;++i) { if(NULL==fgets(b,256,fp)) { break; } } fclose(fp); }
>>410 それじゃ999桁じゃなくて999行だ。。。
>>410 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXCOL 1000
int main(void)
{
char ci[MAXCOL], buf[128];
int i;
FILE *fi, *fo;
printf("input file name:");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
if ((fi = fopen(buf, "r")) == NULL) {
fprintf(stderr, "error: file open[%s].\n", buf);
exit(1);
}
printf("output file name:");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
if ((fo = fopen(buf, "w")) == NULL) {
fprintf(stderr, "error: file open[%s].\n", buf);
exit(1);
}
i = 0; while (fgets(ci, sizeof(ci), fi)) { printf("%05d: %s", ++i, ci); fprintf(fo, "%05d: %s", i, ci); } fclose(fi); fclose(fo); return 0; }
>>414 別にそれでええんとちゃう?但し、409さんがファイル名の入力をどうも
起動時オプションではなく、プログラム中で入力させているようだから、
そこら辺はもしかしたら修正が必要かと思う。どっちかわからんけどね。
>>411-415 みなさん。どうもありがとうございます。
414さん、参考も何も作ってくれるだけでそれは
もうありがたいです。
ありがとうございます。
415さん、環境を書くのを忘れたのはこっちのミスでした・・・
私はvisual stdio.net を使っています。
C言語で作成させなくてはいけないので。
>if( (fp_w=fopen(argv[2],"w") ) == NULL){ >exit(1); >} もしここでexit()するような場合、fp_rはclose()しなくてもよいのか?
>最大999桁 >char line_c[256]; 意識しているか?
また来週〜
>>415 さま
確かにプログラム中でファイル名の入力を促してますね。
うっかりみのがしてました。アドバイスどうもです。
>>416 さま
お役に立てて幸いです。
>>417-418 さま
if( (fp_w=fopen(argv[2],"w") ) == NULL){
close(fp_r)
exit(1);
}
として修正します^^;
>最大999桁
>char line_c[256];
すっかり忘れてました。
>>412 さんのを参考に修正します^^;
close(fp_r)→fclose(fp_r); ^^;
exit()はfcloseall()するから要らないとも言えるが。
visual stdio.netは釣り?
>>399 悪いことは言わんから
boardは[10][10]で確保して壁に印付けとき。
4進数の配列で 1111,1112,1113,1114,1121,1123,1124・・・・・ 桁上がりをする配列はどうのようにすればよいのでしょうか 宿題はこれを使うものなのですが、これが分からなくて
>>426 #include <stdio.h>
// 4桁の4進数でa=a+bを行う。戻り値はキャリー
int add(int* a,int* b)
{
int i;
int s,c;
for(i=0;i<4;i++){
s=a[i]+b[i];
c=s
>>2 ;
a[i]=s&3;
}
return c;
}
void print(int* a)
{
int i;
for(i=3;i>=0;i--)printf("%1d",a[i]);
puts("");
}
int main()
{
int a[]={1,1,2,3};
int b[]={3,2,1,0};
add(a,b);
print(a);
return 0;
}
うはキャリー考慮してねえから訂正
int add(int* a,int* b)
{
int i;
int s,c=0;
for(i=0;i<4;i++){
s=a[i]+b[i]+c;
c=s
>>2 ;
a[i]=s&3;
}
return c;
}
429 :
デフォルトの名無しさん :04/12/17 16:39:20
C言語です 直線を指定した座標から座標まで引くプログラムなんですが ターミナルに出力するのではなくてファイルに出力するらしいです。 検索してもライン関数を使ってるのしかなくて、そのライン関数 自体の中身がわからりません。どうか教えてください。
433 :
デフォルトの名無しさん :04/12/17 19:16:40
DDAなんてレイトレの基本だな。
434 :
デフォルトの名無しさん :04/12/17 20:58:34
435 :
デフォルトの名無しさん :04/12/17 23:05:53
c++でお願いします。 注意書き 記述は入出力ストリームで。 参考範囲は、文字列配列。 問題 2つの文字列配列を1つの配列に格納し、連結して表示させるプログラム。 例:aaaaと一回目に入力し、次にbbbbと入力したらaaaabbbbと表示させるもの。 ただし、連結した文字列を入力する配列は、ヌル文字で初期化しておくこと。 もしくは、2番目の文字列を入れた後でヌル文字を1字入れても良い。 よろしくお願いします。
もっとレベル高い宿題はないの?
>>435 #include <iostream>
#include <cstring>
const int BUFSIZE = 64;
int main()
{
char Buf1[BUFSIZE], Buf2[BUFSIZE], Buf3[BUFSIZE * 2];
std::cin >> Buf1 >> Buf2;
std::cout << std::strcat(std::strcpy(Buf3, Buf1), Buf2) << std::endl;
return 0;
}
C++ならせめてstd::stringstreamを使わせて欲しいなあ。文字列配列と書いて あるからだめだけど。
で、いつになったらスーパープログラミングは始まるの?
440 :
435 :04/12/18 00:02:06
>std::stringstream ってなんですか・・・ 無知ですみません
441 :
435 :04/12/18 00:03:18
あっそれと stdも何か教えてください お願いします
名前空間で検索しる
>>440 >>441 std::stringstreamを使うと、まるでファイルで読み書きするように、メモリ内に
ストリームを持つことができる。使用できるメンバ関数もほとんど同じ。
更に、従来のCスタイルの文字列へのインターフェースとして、str()を持つ。
std::は、C++の名前空間(namespace)を勉強しないと理解するのは困難だが、
要するに名前のバッティングを防ぐ役割をすると思えばいい。std名前空間に
入っている名前はC++標準ライブラリの名前。
444 :
デフォルトの名無しさん :04/12/18 00:23:38
>>431 様
>>432 様ありがとうございます。
自分はまだファイル処理のこと勉強中なんでこのプログラムを
どうやったら実行できるのかはわからないんですが
頑張って勉強して自分のものにしていきます。これからも
わからないことがあると思いますがその時はよろしくお願いします!
445 :
デフォルトの名無しさん :04/12/18 00:30:20
a(n)=1×2×...×n b(n)=b(n-1)+b(n-2)、 b(1)=1、 b(0)=0 ・n(≥1)が入力として与えられたとき、a(n)の値を返す再帰的なプログラムを記述せよ。 ・上記の問題を再帰を用いないプログラムで記述せよ。 ・n(≥1)が入力として与えられたとき、b(n)の値を返す再帰的なプログラムを記述せよ。 ・上記の問題を再帰を用いないプログラムで記述せよ。 ※ただし入力と出力は全ての整数型で与えられるとし、記述はDel-phiで記述せよ。
Delphi使いだけで再帰苦手なのでパス
448 :
デフォルトの名無しさん :04/12/18 00:35:54
>>445 どなたかわかる方いらっしゃいませんか??
もしくはわかりそうな人がいるとこしりませんか??
>>448 お前の態度が気に食わない。かつ、マルチポストするなボケ。
int func(int n){ if(n==1) return 1; else return func(n-1); }
451 :
デフォルトの名無しさん :04/12/18 01:07:49
いろいろ調べてみたんですが、シェイカーソートを使ったプログラムがつくれません。 教えていただけないでしょうか?
>>451 バブルソートと基本的に考え方は同じで、バブルソートが一方向のみの走査なのに
対し、シェーカーソートは行ったり来たりの両方向の走査をする。んだけ。
454 :
sage :04/12/18 01:32:00
Cです 以下の問題(1から10)についてのプログラムを作成せよ. * データ処理に関する前提: o ・データは必ず正しい範囲で入力されることを前提としてよい ・Day(日にち)には,必ず,1から31までの整数(1日から31日までを意味する) ・Time(時間)には,必ず,7から22までの整数(7:00から22:00までを意味する) ・Plan(予定)には半角のアルファベット(大文字,小文字)以外は入力されない * 注意点: o 各問題に解答しながら,コードを付け足すようにして,1つのプログラムを作成すること. o「処理内容を説明せよ.」または「アルゴリズムを説明せよ.」という指示がある場合,レポートメールの 「2.関数の処理内容およびアルゴリズムの説明」において,問題番号とそのアルゴリズムの説明を記述すること. (指示がない場合には説明しなくてよい.) o 関数名,引数および戻り値の型を変更しないこと.
あげてしまった・・ 1. 予定データ(日にち,開始時刻,予定)を扱うための構造体の宣言 以下の仕様に基づいて構造体を宣言せよ. * 構造体タグ名:なし メンバ: o 予定の日にちを表すint型の変数:変数名 Day o 予定の開始時刻を表すint型の変数:変数名 Time o 予定を表すchar型の配列:配列名 Plan * typedefによって再定義する型名:SCHEDULE 2. 衝突を回避するための連結リストを表わす自己参照構造体の宣言 以下の仕様に基づいて自己参照構造体を宣言せよ. * 構造体タグ名:ELEMENT * メンバ: o 一つ一つの予定データを表すSCHEDULE型(問題1参照)の構造体変数:構造体変数名 Data o ELEMENT型へのポインタ型変数:変数名 Next * typedefによって再定義する型名:NODE 3. #define ディレクティブによるバケットサイズの指定 #define ディレクティブについて調べよ.そして,#defineを使って, 以下の仕様に基づいたマクロ定義をせよ. 仕様:プログラム中の識別子「BUCKET_SIZE」を,置換リスト「7」に置き換える.
4. ハッシュ表の初期化(5%) グローバル配列として以下の配列を定義せよ. NODE型へのポインタ配列: * 配列名:Table * 要素の数:BUCKET_SIZE(問題3参照) 以下の仕様に基づいて,上記のポインタ配列で定義したハッシュ表のすべての要素を NULLに初期化する関数 void init_hash(NODE **tbl) を定義せよ.そして,main()関数への必要な記述をおこなって, 関数を実行できるプログラムを作成せよ(必要に応じて,ヘッダー・ファイルをインクルードすること * 関数名:init_hash * 仮引数NODE **tbl:NODE型のポインタ型へのポインタ型変数(ポインタへのポインタ). ハッシュ表の最初の要素のアドレスを受け取る. * 戻り値なし(void型) * 機能:ハッシュ表の最初の要素のアドレスを受け取り,このアドレスをもとに, ハッシュ表のバケット(配列のそれぞれの要素)に NULLポインタを代入する. ※仮引数NODE **tblによってハッシュ表の配列を受け取っている理由は, 複数のハッシュ表が存在する場合に対応できるようにしておくためである. このようにすることによって,複数人のスケジュールを操作できるようになる
5. ハッシュ関数 前提として,以下のように,曜日と数値との対応を定義する. (プログラム内で定義しなくてもよい.) * 日曜日(SAN) :0 * 月曜日(MON) :1 * 火曜日(TUE) :2 * 水曜日(WED) :3 * 木曜日(THU) :4 * 金曜日(FRI) :5 * 土曜日(SAT) :6 このとき,以下の仕様に基づいて,ハッシュ値を計算する関数 int hash(int day); を定義し,main()関数への必要な記述をおこなって, 関数を実行できるプログラムを作成せよ. (必要に応じて,ヘッダー・ファイルをインクルードすること.) また,この関数の処理内容を説明せよ. * 関数名:hash * 仮引数int day:int型の変数として,データの挿入・探索・削除などをおこなう日にち(問題1参照)を受け取る. * 戻り値(int型):ハッシュ値として,上記の曜日に対応する数値を返す. * 機能:データの挿入・探索・削除などをおこなうときに必要となるハッシュ値を計算する. (このため,ハッシュ表に含まれるバケットの数をBUCKET_SIZE(問題3参照)とした.) ※日にちは,1日から31日まで(int型 1-31)とし,1日(1)は,土曜日とする.したがって,hash(1)の戻り値は, 6となる(2005年1月と同じです
6. ひとつの予定データの挿入(25%) 以下の仕様に基づいて,ひとつの予定データを挿入する関数 void insert(NODE **tbl, SCHEDULE dt); を定義し,main()関数への必要な記述をおこなって,関数を実行できるプログラムを作成せよ (必要に応じて,ヘッダー・ファイルをインクルードすること.). また,この関数のアルゴリズムと処理内容を説明せよ. * 関数名:insert * 仮引数NODE **tbl:データを挿入するハッシュ表を受け取る. * SCHEDULE dt:ひとつ分の予定データ(問題1参照). * 戻り値なし(void型) * 機能:関数hash()の実引数としてdt.Dayを渡して,ハッシュ値を得る. このハッシュ値に基づいて, 受け取ったtblが指すハッシュ表のバケット(配列の添字)を決定する. そして,そのバケットの連結リストにdtを挿入する. このとき,以下の条件に基づいて挿入する. o 日にち(dt.Day)に対するハッシュ値は,曜日に対応する数値である(問題5参照). o 曜日に対応する数値が,ハッシュ表を表わす配列の添字となる. o 挿入するデータを代入するメモリブロックをmalloc()関数を使って確保する. o 連結リストの先頭ノードからみて,時間(dt.Time)の昇順に並べる. すでに同じ時間のデータがある場合,同じ時間のノードの末尾データ側に挿入する. o 日にち(dt.Day)と時間(dt.Time)の両方が同じデータがあった場合, すでにあるノードのデータを新たなデータ(dt)に置き換える. ※以上の仕様により,それぞれのバケットに,同じ曜日で異なる日にち(Day)の予定データが, 日にちに関係なく時間(Time)の昇順に並ぶ連結リストが作成される.
7. 指定された日にち内の,すべての予定データの表示 以下の仕様に基づいて,ハッシュ表(連結リスト)から指定された日にち(問題1参照)をもつ予定データ(ノード)を表示する関数 void show_plan_day(NODE **tbl, int day); を定義し,main()関数への必要な記述をおこなって,関数を実行できるプログラムを作成せよ. (必要に応じて,ヘッダー・ファイルをインクルードすること.) また,この関数の処理内容を説明せよ. * 関数名:show_plan_day * 仮引数NODE **tbl:データを探索するハッシュ表を受け取る. * 仮引数 int day:探索する日にち(問題1参照). * 戻り値なし(void型) * 機能:関数hash()の実引数としてdayを渡して,ハッシュ値を得る. このハッシュ値に基づいて,ハッシュ表(連結リスト)から,指定されたdayとおなじDay(問題1参照) をもつすべての予定データ(ノード)を探索し表示する. 連結リストでは時間の昇順に並んでいるため,同一日にち内であれば, 先頭ノードから探索して表示するだけで,時間順に表示される. 8. 連結リストの全ノードの削除 以下の仕様に基づいて,すべてのバケットのすべてのノードを削除する関数 void free_hash(NODE **tbl); を定義し,main()関数への必要な記述をおこなって,関数を実行できるプログラムを作成せよ. (必要に応じて,ヘッダー・ファイルをインクルードすること.) * 関数名:free_hash * 仮引数NODE **tbl:削除するノードのバケットが含まれているハッシュ表を受け取る. * 戻り値なし(void型): * 機能:受け取ったtblが指すハッシュ表のすべてのバケットの すべてのノードを削除(malloc()関数で確保したメモリブロックを解放)する.
よろしくお願いします
>>454 -
丸投げもここまで来るとすがすがしいな。
毒毒しいよ
>>454-459 >以下の問題(1から10)についてのプログラムを作成せよ
1から8までしかないような気がするんだが気のせいか?
从*・ 。.・)ノ<丸投げすぎなの
class base{ virtual func(){} } class a{
すいません;ミスです
class teach_begger: public solve_begger {
>>454 1.
typedef struct {
int Day;
int Time;
char Plan[256];
} SCHEDULE;
2. typedef struct ELEMENT { SCHEDULE Data; struct ELEMENT *Next; } NODE;
3. #define BUCKET_SIZE 7
4. NODE *Table[BUCKET_SIZE]; void init_hash(NODE **tbl) { int i; for(i = 0; i < BUCKET_SIZE; i++) tbl[i] = NULL; } int main() { init_hash(Table); }
5. int hash(int day) { return (day + 5) % BUCKET_SIZE; }
6. void insert(NODE **tbl, SCHEDULE dt) { int h; NODE *n; NODE **p; if(!(n = malloc(sizeof(NODE)))) assert('ぬるぽ'); n->Data = dt; n->Next = NULL; for(p = &Table[h = hash(dt.Day)]; *p && (*p)->Time < dt.Time; *p = (*p)->Next){} if(!*p){ *p = n; }else{ if((*p)->Time != dt.Time){ n->Next = *p; *p = n; }else{ NODE *q = *p; n->Next = (*p)->Next; *p = n; free(q); } } }
474 :
訂正 :04/12/18 11:02:19
6. #include <stdio.h> void insert(NODE **tbl, SCHEDULE dt) { NODE *n; NODE **p; if(!(n = malloc(sizeof(NODE)))){ fprintf(stderr, "ぬるぽ\n"); exit(1); } n->Data = dt; n->Next = NULL; for(p = &tbl[hash(dt.Day)]; *p && (*p)->Time < dt.Time; *p = (*p)->Next){} if(!*p){ *p = n; }else{ if((*p)->Time != dt.Time){ n->Next = *p; *p = n; }else{ NODE *q = *p; n->Next = (*p)->Next; *p = n; free(q); } } }
>o 連結リストの先頭ノードからみて,時間(dt.Time)の昇順に並べる. >すでに同じ時間のデータがある場合,同じ時間のノードの末尾データ側に挿入する. >o 日にち(dt.Day)と時間(dt.Time)の両方が同じデータがあった場合, >すでにあるノードのデータを新たなデータ(dt)に置き換える. >※以上の仕様により,それぞれのバケットに,同じ曜日で異なる日にち(Day)の予定データが, >日にちに関係なく時間(Time)の昇順に並ぶ連結リストが作成される. かなり違うな・・・出直してきます・・・orz
>>475 どっちにしてもおかしいよ
誤 for(p = &tbl[hash(dt.Day)]; *p && (*p)->Time < dt.Time; *p = (*p)->Next){}
↓
正 for(p = &tbl[hash(dt.Day)]; *p && (*p)->Time <= dt.Time; p = &((*p)->Next)){}
>>474 こんな感じかな
void insert(NODE **tbl, SCHEDULE dt)
{
NODE *n;
NODE **p;
if(!(n = malloc(sizeof(NODE)))){
fprintf(stderr, "ぬるぽ\n");
exit(1);
}
n->Data = dt;
n->Next = NULL;
for(p = &tbl[hash(dt.Day)]; *p; p = &((*p)->Next)){
if((*p)->Data.Time > dt.Time) break;
if((*p)->Data.Time == dt.Time && (*p)->Data.Day == dt.Day) break;
}
if(!*p){
*p = n;
}else{
if((*p)->Data.Time != dt.Time){
n->Next = *p;
*p = n;
}else{
NODE *q = *p;
n->Next = (*p)->Next;
*p = n;
free(q);
}
}
}
478 :
476 ◆FIcNi4f8js :04/12/18 14:08:35
>>454-460 ほれ
begin-base64 644 schedule.c.gz
eNq9Vttu20YQfTfgL8jL+CaQMmUoDtI+yBYQxwpqVFEL2AaKuoJAkctoYWpJ85LYcfTvmdkLl6Qp
pEWLGja9Ozs8M3N2LjzgIojLkMFZXoQ8OVmNd3cO6rKYL6UQxSGLuGBwcfthcX315wRO3/5Ul77/
dXKjDn6uq1/6T4uPVzN43RK9+wPe1GQ3fC3Vhi0Rqp2+IbziKWV4AEyUa3iO/DhnHhRZyTawTJKY
+WJUV8vxKCjgeXcHgIuCbI7MGoGZ3AQrP4PfY1/cmaDmKN/A9ftfJpe300kX4mQ6+TiZ3Shko4jw
hS8hW1r9GXssJObst0uFRwvo3/jLmN3VWJvLQ3Jv5ecrhxah/+Tu7khDGSvKTICDIjiGty4c1Rkn
A/T254SHGCEvFhJDWeoXy9jAECqXfkZJ5nA4h+EIOJw1wIAfH7ukA4Cv3vE5qs1up9OGlShjTFpZ
sJitmShybU4YW2qbVtZShBEjSEfgPit0pfGA8nQw1kSRnLCd1NU7eu9BrjedDvwHYXYEoyJ3W8zm
LCtq9jybAGHRjFuM7FqTwCNnzxHozNqP4yRwcv6VJZGEc/FHkxKlGbofOVh7LMs82H91eHE4Pbw/
nL9yLv4S+4YW9sgL57VriAEQgzFlIeKHikihSLW3Z++hR+FJ8sLiBEvDnY/oqiTXPcfpp656t/IK
fVdSMnFCBQRjtCNXLiwz5t+PtmqenxtV6PWgdoqW9SH5UIPZGL5QV3vQV/kjTxkW/3bH9ipz5t06
F/oyWpBN0Hpq1vQtiGWoG0zn8IO5rM2L9M1XyZfu+vGgVfvbCym1peNWdOxRj/j2jQ4aJEtA5ZxO
sf2j0xDkX46J5dXfsBvi0e6oWTaLQgaSoniBFhq10QpDu1ZlVFWjP67S57bjgwEcHIUwGEi/uVvR
3kGrqmQPhs3LqF33lpdUfVBxeDKORg/SMwdHCAvuZegvw6WLOKsGIF4JCcZm/JmoTEx0T5/9uGSw
LvMClgwpgswXnxhQqPg4kdFqPK/C0WHpESEnoy0iLaVBOep0veBr6Tr+r7mOO3TdDGV0nQRjM5Lb
rsuy+zu+a0CvAvp3vjMROh+usPv2o9RT0zxoTcyIWmyUuhTDXkDPgKph+Di8rG/eGQNExdrnwjE4
tQ5vvxmWZdT4ZFBDx8xdOdtdLf6y4jFzKIauC5fMXWM0YRljo4SqvUefGKYh2vGqDy4P6BtNuLbR
WhbkiSf9Gs7dZkfO88AXkcLax+ug3xwvo6f6rlqoMseFqXDTTWyC6zbtQpCIgouSvdCiXDKt94Wa
CfvuKJyDfuRzmRbGka1+qMEreaXDqhR/TPD/Qqkl858x1+ydVXgWSIdo2x42PkoxoFX1MdAJMzQJ
aD+UGnmp62OoEv87Ls5PKw==
====
ダイアログボックスのピクチャーコントロールに 実行中のデータを逐次表示させようとスレッドのなかで GetDlgItem()関数でピクチャーコントロールのポインタを取得しようとしているのですが 上手くいきません。 CWnd* h = (CWnd*)GetDlgItem(IDD_WAITQSIM_DIALOG,IDC_GRAPH); こう書くと「1 番目の引数を 'const int' から 'struct HWND__ *' に変換できません。」 と言われます CWnd* h = (CWnd*)GetDlgItem((HWND)IDD_WAITQSIM_DIALOG,IDC_GRAPH); と書いたり CWnd* h = (CWnd*)GetDlgItem((HWND__ *)IDD_WAITQSIM_DIALOG,IDC_GRAPH); と書いたりするとコンパイルはビルドは上手くいくのですが、 実行中にポインタが全然違うところを指しているというような類のエラーが出ます。 GetDlgItem()の第一引数の渡し方が悪いようですが、どうすれば正しいのか分りません。 環境は[VC++ 6.0(MFCダイアログベースアプリケーション) OS:Win2000]です。 助言をお願いします。
>>480 すみません、、VC++系のスレのほうが適所ですか‥
しかし、ダイアログボックスのハンドルの渡し方がよくわからないので、
それだけでも教えてください。
>>481 MFC使っているなら、
IDD_WAITQSIM_DIALOGのIDを持つダイアログクラスのメンバ関数と仮定して、単純に
CWnd * h = GetDlgItem(IDC_GRAPH);
でいい。
そうすると 「'GetDlgItem' : 関数が不正な 1 個の実引数をともなって呼び出されました。」 と出てしまいます。
>>483 >482に書いてある仮定が読めないならC++の基礎からやり直せ。
そしてここに戻ってくるな。
489 :
& ◆QWv3R1XL8M :04/12/18 19:26:21
つうか仕様とか出されても読むのめんどくせーから全部UMLで書いてきた やつ以外読むのやめようぜ?
白(裏は赤)のカードが6枚並べて、サイコロを振ってその数だけ(左から順に)カードを裏返します。 例えば・・・・ サイコロを2回振ったら 赤が0:6 赤が1:10 赤が2:8 赤が3:6 赤が4:4 赤が5:2 赤が6:0 サイコロを3回振ったら 赤が0:0 赤が1:16 赤が2:40 赤が3:52 赤が4:52 赤が5:40 赤が6:16 というふうに100回分出力させるにはどうすればよいでしょうか・・・・ ど素人で申し訳ないですC++でおながいします。
492 :
デフォルトの名無しさん :04/12/18 19:50:53
>>491 ごめん、CとかC++とかプログラムとかの前に、
法則がさっぱりわからん。
>>491 なんで賽子を2回振ってるのに赤が0が6なんだ?
Ax=bの連立方程式を生成するプログラムを作っています。 このプログラムを改良して対角が0でない行列と対角優位行列を作れるようにしたいのですが どのようにすればいいのでしょうか? よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define SIZE 100 int main(int argc, char *argv[]) { int i, j; FILE *fp; if((fp = fopen(argv[1], "w"))==NULL) { fprintf(stdout,"出力ファイルを指定してください\n"); exit(1);
} fprintf(fp, "%d",SIZE); for(i=0; i<SIZE; i++) { fprintf(fp,"\n"); for(j=0; j<SIZE; j++) { fprintf(fp, "%d ", rand()); } } fprintf(fp,"\n"); for(i=0; i<SIZE; i++) fprintf(fp,"%d ", rand()); fclose(fp); return 0; }
497 :
デフォルトの名無しさん :04/12/18 20:00:30
プログラム以前に「対角優位行列」が何かわからん。 あと、いきなりあるかないかわからん文字列使ってfopenすんな。 argcの値でチェックしろ。
498 :
デフォルトの名無しさん :04/12/18 20:04:27
a(n)=1×2×...×n b(n)=b(n-1)+b(n-2)、 b(1)=1、 b(0)=0 ・n(≥1)が入力として与えられたとき、a(n)の値を返す再帰的なプログラムを記述せよ。 ・上記の問題を再帰を用いないプログラムで記述せよ。 ・n(≥1)が入力として与えられたとき、b(n)の値を返す再帰的なプログラムを記述せよ。 ・上記の問題を再帰を用いないプログラムで記述せよ。 ※ただし入力と出力は全ての整数型で与えられるとし、記述はDel-phiで記述せよ。
最初の状態
[白][白][白][白][白][白]
(1回目)サイコロの目が2だとすると・・・
[赤][赤][白][白][白][白]
(2回目)サイコロの目が4だとすると・・・
[白][白][赤][赤][白][白]
(3回目)サイコロの目が6だとすると・・・
[赤][赤][白][白][赤][赤]
こんな法則です。言葉足らずで申し訳ないです。
一回目は
赤が0:0
赤が1:1 (サイコロの目は1)
赤が2:1 (サイコロの目は2)
赤が3:1 (サイコロの目は3)
赤が4:1 (サイコロの目は4)
赤が5:1 (サイコロの目は5)
赤が6:1 (サイコロの目は6)
サイコロ100回振った結果を出力させたいのです。
>>494 一回目と2回目のサイの目が同じなら0になるといった感じです。。
500 :
デフォルトの名無しさん :04/12/18 20:11:53
>(2回目)サイコロの目が4だとすると・・・ >[白][白][赤][赤][白][白] (;´Д`)?? 1回目とあわせて合計6だから、 [赤][赤][赤][赤][赤][赤] じゃないの?
>>500 賽子一回ずつ左から引っ繰り返すんだと。
503 :
デフォルトの名無しさん :04/12/18 20:17:39
504 :
デフォルトの名無しさん :04/12/18 20:19:40
100回目までとなると総当りはきついな。
505 :
デフォルトの名無しさん :04/12/18 20:22:51
つーか6の100乗あたりの数字になると、32ビット整数型にとても収まらない。
真面目に解決しようと思えばそこから考えなければいけないわけだな。
>>491 のプログラムのレベルは相当低そうだが、誰にこんな問題出されてんの?
>>505 やっぱりきついですよね。
ある知人(C++は知らない人)から電話で「お前これ作ってみろ」って言われたんです・・・
507 :
デフォルトの名無しさん :04/12/18 20:46:16
6^100なんて普通にやったら終わらないよ
>>491 この法則だと例えば賽を3回振ったときに
2−2−4と2−4−2と4−2−2では最終的な結果は同じになる。
要は何回目にどの目が出たかではなくて、
ある目が出た回数が重要になる。
従って100回の場合は106C6=1705904746パターンを
チェックすればいいことになるので後はがんばれ。
6^100=6.5e+77回計算するよりは遙かに楽だ。
509 :
デフォルトの名無しさん :04/12/18 21:08:48
>>508 うーん。なるほど。賢いなあ。
でも、結局最終的に、
100回目の場合、
赤が0:29836748923792375235925892375892789572
赤が1:3457897693768934768934764897389734896734
:
(値は適当)
とか表示しなければいけないのでそれはどうするんだ・・・
多倍長整数を作るか、 浮動小数点で我慢するか。精度の条件しだいか。
そろそろスーパープログラミングがお目にかかれそうです。
具体的な数値が分かるよりも 出現回数Nと試行回数nから結果を 求める計算式が分かる方が有難い
数学板行きの問題のような気もするが。
親指シフトユーザーってどういう意味なの? ぐぐってもわからんかった。
515 :
デフォルトの名無しさん :04/12/18 22:07:32
>>514 すれ違い。
親指の位置にシフトキーがあるキーボードのユーザのこと。(だとおもう)
>>491 #include <stdio.h>
int num_of_red(int n[])
{
int num = 0;
int i;
for (i=0; i<6; i++)
num = (n[i] & 1)?(i-num+1):(num);
return num;
}
double factorial(int n)
{
int i;
double ret = 1;
for(i=1; i<=n; i++)
ret *= i;
return ret;
}
double num_of_pattern(int n[])
{
double num;
int i;
num = factorial(n[0] + n[1] + n[2] + n[3] + n[4] + n[5]);
for(i=0; i<6; i++)
num /= factorial(n[i]);
return num;
}
int main() { int i, j; int n[6]; for(i=1; i<=100; i++) { double sum[7] = { 0, 0, 0, 0, 0, 0, 0 }; for(n[0]=0; n[0]<=i; n[0]++) for(n[1]=0; n[0]+n[1]<=i; n[1]++) for(n[2]=0; n[0]+n[1]+n[2]<=i; n[2]++) for(n[3]=0; n[0]+n[1]+n[2]+n[3]<=i; n[3]++) for(n[4]=0; n[0]+n[1]+n[2]+n[3]+n[4]<=i; n[4]++) { int index; double pattern; n[5] = i - (n[0] + n[1] + n[2] + n[3] + n[4]); index = num_of_red(n); pattern = num_of_pattern(n); sum[index] += pattern; } printf("賽を%d回振った場合\n", i); for(j=0; j<=6; j++) printf("赤が%d枚 : %.0lf 回\n", j, sum[j]); } return 0; } 10までで確かめたが大丈夫だった。 それ以上での精度はしらん。
こんなときのためにstd::next_permutation()があるんだろうな。 どう使っていいかわからないが。
手を交叉させると親指シフトユーザー
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int main(){
int i,j,sai,temp,cards=0,red=0,toukei[7]={0,0,0,0,0,0,0};
srand((unsigned) time(NULL));
for(i=0;i<N;i++){
sai=(int)((double)rand()/(double)RAND_MAX*6)+1;
switch(sai){
case 1: cards=cards^1;break;
case 2: cards=cards^3;break;
case 3: cards=cards^7;break;
case 4: cards=cards^15;break;
case 5: cards=cards^31;break;
case 6: cards=cards^63;break;
}
temp=cards;
for(j=0;j<6;j++){
if (temp%2==1) red++;
temp=temp
>>1 ;
}
toukei[red]++;
red=0;
}
printf("%d回試行の結果\n",N);
for(i=0;i<7;i++) printf("赤が%dの場合 %d\n",i,toukei[i]);
return 0;
}
522 :
デフォルトの名無しさん :04/12/18 23:07:37
>>521 ご苦労さんだが、思いっきり間違ってるよ。
問題(C言語) ○×ゲームを作る。3×3のマス目が書かれたボードに○と×を交互に書き入れていき、 どちらかが縦横斜めのいずれかに3つ並べて書いたら勝ち。一手書く毎にボードの様子を出力せよ。 どちらかが勝った場合には勝者を、引き分けだった場合には“draw”と出力して終了せよ。 こんな課題が出されました。全くもって見当も付きません。 そもそもこんなのC言語で可能なんですか? どなたか出来る方がいましたらお願い致します。
524 :
デフォルトの名無しさん :04/12/18 23:17:12
>>523 >そもそもこんなのC言語で可能なんですか?
お前はC言語をなめてんのか。
描画なんてできないと思ったんだろ。 ↓こんなんでいいんだよ。 ○×○ ×○× ○
527 :
デフォルトの名無しさん :04/12/18 23:21:39
523はDel厨
528 :
デフォルトの名無しさん :04/12/18 23:41:40
>>523 こんなの貼るの恥ずかしいんだが、適当につくった。
エラーチェックとか一切してないから不完全だが。
#include <stdio.h>
int main(void)
{
char*sym[] = {" ", "〇", "×"};
intboard[3][3] = {0};
inti, j, k;
intx, y;
intwinner = 0;
for (i = 0; i < 9; i++) {
scanf("%d%d", &x, &y);
board[y][x] = i % 2 + 1;
for (j = 0; j < 3; j++) {
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j]||
board[j][0] == board[j][1] && board[j][1] == board[j][2] && board[j][0]||
board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1]||
board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1]) {
winner = board[y][x];
}
}
529 :
つづき :04/12/18 23:42:09
for (j = 0; j < 3; j++) { for (k = 0; k < 3; k++) { printf("%s", sym[board[j][k]]); } puts(""); } if (winner) break; } switch (winner) { case 0: puts("draw"); break; case 1: puts("〇が勝利"); break; case 2: puts("×が勝利"); break; } return 0; }
530 :
528 :04/12/18 23:43:15
winner = board[y][x]; のあとにbreak;入れたほうがよかったな… 斜め一致の場合無意味にループが3回回る。ま、いいか。
>>517 > printf("賽を%d回振った場合\n", i);
糞を%d回振った場合
に見えた...orz
>>516-517 亀レスですが、2chで質問して一番感動しました。
for文をこんな感じで使うといいんですね・・・・
本当にありがとうございました!!
>>528-530 うぅお〜〜〜〜、早ぇ!!?
・・・・失礼、あまりに早い反応に取り乱してしまいました。
ありがとうございます!
まだ実行はしてませんがお礼だけは言わせて下さい!
そしてお疲れ様でした!
>>524 すいません、自分まだC言語習い始めて3ヶ月ちょいなんですよ・・・。
なので、一体どこまで広がりがあるかが分からなくって。
何かC言語みくびった様な発言したみたいですいませんでした。
535 :
さゆ :04/12/19 01:49:38
536 :
528 :04/12/19 01:55:19
>>533 UNIXのOSのほとんどはCで書かれてるし、
Windowsの多くの商業アプリケーションもCで書かれてるし、
PlayStation2などの多くのゲームもCで書かれてる。
CodeWarrior for PlayStation(R)2マンセー
>>535 更に痛々しくしてやろう
#include <stdio.h>
void SetBit(int *dest, int field){ *dest |= 1 << field; return; }
int GetBit(int src, int field){ return (src >> field) & 1; }
int main()
{
int board[2] = {0}, x, y, i, j, mask[] = {7, 56, 448, 73, 144, 292, 273, 84};
char buf[256], *piece[] = {" ", "○", "×"};
for(i = 0; i < 9; i++){
if(sscanf(fgets(buf, sizeof(buf), stdin), "%d%d", &x, &y) == 2){
if(x < 3 && y < 3 && (GetBit(board[0], x + y * 3) | GetBit(board[1], x + y * 3)) == 0){
SetBit(&board[i&1], x + y * 3);
for(j = 0; j < 9; j++){
printf("%s ",piece[GetBit(board[0], j)|(GetBit(board[1], j)<<1)]);
if((j + 1) % 3 == 0) printf("\n");
}
for(j = 0; j < sizeof(mask) / sizeof(int); j++)
if((board[i%1] & mask[j]) == mask[j]){ printf("%sが勝利", piece[i % 1 + 1]); i = 9; break; }
} else { i--; puts("You can't set there."); continue; }
}
else{ i--; puts("Unknown data."); continue; }
}
}
return 0;忘れた
>>539 イタタタタっイタタタタタタ
\____________/
O >ー-"'" ⌒,,ィシヽミミiミミ 、
o 。 / 三彡彡彡ィ`、ミミミ`、
/ シ彡彡彡彡ノ'ヽミミミ`、
,' ,三彡彡彡彡彡ソ,ー--'
l _ _ """'彡彡彡彡彡ノi
{;、 ';;;='''"""` 彡彡彡 - 、ノノi
kr) .ィェー 彡彡' r、ヽ}彡i
レ' .. シ彡' )ァ' /彡' と思うC言語見習い侍であった
{_,,,、 ;、 シ彡 ニンミミ{
l '''"::. 彡ミi
! ̄"` ...:::::::: ノ
>>537 そうなんですか!?
何か素で勉強になります。
ありがとうございます。
543 :
デフォルトの名無しさん :04/12/19 07:24:03
10進数を16進数で表示するプログラムを作っているんですがうまくいかないんで 教えてください。C言語でgccです。 #include <stdio.h> int main() { int x, a[100], i, j; scanf("%d", &x); for (i = 0; x > 1; i++, x = x / 16) a[i] = x % 16; for (j = 0; j <= i; j++) printf("%c", "0123456789ABCDEF"[a[i-j]]); } 例えば10進数の111を16進数にすると6Fが正解ですが printf("%c", "0123456789ABCDEF"[a[j]]); とすると、F6になってしまいます。これを解消するためにa[i-j]とすると なぜかエラーが出てしまうんです。 ちなみに printf("%c", "0123456789ABCDEF"[数字]); の1文は必ず使わないといけません。おねがいします。
for (j = i - 1;; j >= 0 ; j--) printf("%c", "0123456789ABCDEF"[a[j]]);
しまった for (j = i - 1; j >= 0; j--)
546 :
デフォルトの名無しさん :04/12/19 07:56:30
>>543 (1) x>1 を x>0に
(2) j<=iをj<iに
(3) i-jをi-j-1に
できました! なるほど、範囲外のところを呼び出してしまってたんですね。 ありがとうございました。
xが0のときはまずい
549 :
デフォルトの名無しさん :04/12/19 08:03:09
>>548 ほんとだな。
上のfor文はdo〜whileに置き換えた方がいい。
550 :
デフォルトの名無しさん :04/12/19 13:21:10
いつもおもってるんだけど、プレステのゲームのコードって、 どの程度コードレビューとかするんだろう?
>>550 もう2度と変更されない、保守されないコードをレビューする必要ってあるんだろうか…
引いたのは戻さないでトランプ全部から一枚だけランダムに選んでいくのって 残り枚数数えて、0からその枚数までの数字をランダムで選んで、 順番に配列に入ってる残り枚数を引いてって0になったときのインデックスで 種類を決定するしかないんですか。
>>552 まず分かりやすい日本語を書いてくれ。でないと答えようがない。
554 :
デフォルトの名無しさん :04/12/19 18:17:42
>>552 トランプの枚数と同じだけのサイズの配列を確保して、
そこに引いたor引いてないのフラグを立てるといんでないかい?
君が言ってるのよりはこの方が速いと思う。
ある袋に次の色をしたたまが入ってる。
赤 4個
青 3個
緑 4個
白 3個
例えばs[] = {4,3,4,3}のようになっている。
ここで赤〜白のたまを一つ引いて色を決定する場合
たまの合計は14個
でランダムの数字で1〜13までだして7まででたとすると
7 - s[4] = 3
3 - s[3] = 0
ここで0以下になったので、青に決定。
みたいなやり方をやっていたんですが、何か計算量が多い気がしたのです。
>>554 やっぱり一つずつ、別に扱ったほうが(・∀・)イイ!!んですかね。
まちがえました。 袋からたまを一つ引いて色を決定する場合 たまの合計は14個 でランダムの数字で1〜13まででだして7がでたとすると 7 - s[0] = 3 3 - s[1] = 0
557 :
デフォルトの名無しさん :04/12/19 18:39:49
>>555 >ここで赤〜白のたまを一つ引いて色を決定する場合
これの意味が良く分からん・・・
s[]={4,3,4,3};
t[]={0,0,0,0};
とやっておいて、青を一つ引いたら,t[1]+=1;とかじゃ駄目なの?
これで何を引いたか記憶出来るでしょ?
あらかじめ配列をシャッフルしといて順番にひけばええやん?
>>557 多分それじゃ、どの珠も引く確立が1/4になるからだめなんじゃ?
なんつー日本語下手なやつだ。 学力低下ってやつか。
頭の悪いやつは、問題文を丸写しして書け。
>>560 自分でもわかりにくいと思ったから、説明しなおしたんですが
その説明でもわからないでしょうか。
564 :
デフォルトの名無しさん :04/12/19 19:30:34
C言語について質問です。 例えば入力文字列 abc00325.txt に対して abc00326.txt のように、 ファイル名の数字の部分に1を加えた文字列を返すようなプログラムを 作りたいのですが、どうしたらよいでしょうか? なお、 a012bc00325.txt のように途中に数字が入っていた場合、 最後の部分の数字だけ1を加えて a012bc00326.txt のようにする、という 条件があります。
enum ball_color{red, blue, green, white}; std::vector<ball_color> bag; for (int i = 0; i < 4; ++i) bag.push_back(red); for (int i = 0; i < 3; ++i) bag.push_back(blue); for (int i = 0; i < 4; ++i) bag.push_back(green); for (int i = 0; i < 3; ++i) bag.push_back(white); std::random_shuffle(bag.begin(), bag.end()); ball_color taken = bag.back(); bag.pop_back(); // 取り出し
>>564 1.文字列を数字の部分とそうでない部分に分割する。
2.数字の部分を数値に変換する。
3.インクリメントする。
4.文字列に戻して数字以外の部分と結合する。
>>564 ピリオド'.'より一つ前の文字からisdigit()で数字が続く限り前方にポインタを動かし、
そこからピリオドまでを切り取ってsscanf()(またはitoa()、標準ではない)でint型に
直し、+1してから、改めてsprintf()して新しいファイル名を作り出す。
>>555 翻訳してみた
ある袋に
赤4、青3、緑4、白3
と玉が合計14個入っている。
これを配列で表すと、s[]={4,3,4,3}と表せる。
今やりたいことは、袋の中から玉を一つとったとき、その色を求めることである。
今、玉を横一列に並べよう
赤赤赤赤青青青緑緑緑緑白白白
となる。玉は14個あるので、1〜13 (訳注:14じゃないか?) の中からランダムで選び、(xとする)
横に並べた左からx番目の色を求める、っていうのを考えたんだ。
たとえば、ランダムで7がでたら、
7-s[0]=3…赤をとった残りは3
3-x[1]=0…次に青をとった残り、0以下になったので青でfinal answer
でも、このやり方をしたら、計算量が多い気がしたから、質問してみたんだ
>>568 すみません、そんな感じです。1〜14でした。
結構、ありがちな問題だと思ったので何となくで伝わるような気がしてました。
> (訳注:14じゃないか?) おれは0〜13かなぁと思った。 しかし、翻訳したら急にフランクになってるなw 「多い気がしたから、質問してみたんだ」とか本人が言ってたらムカッとするところw
571 :
デフォルトの名無しさん :04/12/19 19:44:31
あぁ、なるほど・・・トランプの話は余分だったと思うぞw まぁ、計算はそのやり方でいいと思うよ。
>>571 すみません、実はちょっと勘違いしててトランプは数字も、マークも全く同じものが4枚あると
勘違いしてたんです。
また日本語おかしくなったorz
>>572 >トランプは数字も、マークも全く同じものが4枚あると
仮面ライダーブレイドでも観て勉強しろ!
でも捨てハンはファイズだな…。
>>572 の(訳)
すみません。実はトランプには数字もマークも全く同じものが、
それぞれ4枚ずつあると勘違いしていたのです。
>>575 の(訳)
すみません。実際、[4]がさらに持っているものがあった時、
1つの、完全に同じ数、そして1つの、完全に同じマーク、一度に、それぞれ、それはカード用に誤りました。
578 :
564 :04/12/19 21:19:23
>>566 >>567 ありがとうございます、方法は理解したのですが、
コードが全然書けません。。。
どなたか書いて頂けないでしょうか?
579 :
デフォルトの名無しさん :04/12/19 21:31:18
test
580 :
デフォルトの名無しさん :04/12/19 21:37:51
すみません、教えて下さい。 10進数を16進数に変換するプログラムを作成したいんですが、どうなりますか?
581 :
ぼるじょあ ◆yBEncckFOU :04/12/19 21:42:07
>>580 #include <stdio.h>
#include <stdlib.h>
int main()
{
char suuji[100]="12345";
long suuchi;
printf("%s\n↓\n",suuji);
suuchi=atol(suuji);
sprintf(suuji,"%lX",suuchi); /* ここで変換 */
printf("%s\n",suuji);
return 0;
}
char ss[] = "abc00325.txt"; ss[7]++; printf("%s\n", ss);
>>580 std::cout << std::hex << 12345;
>>578 理解できたような気になっているだけだから
かけないんだと思います。
>>580 #include<iostream>
#include<string>
#include<boost/lexical_cast.hpp>
int main(){
std::string str = "12345"
std::cout << std::hex << boost::lexical_cast<int>(12345);
}
typo. std::cout << std::hex << boost::lexical_cast<int>(str);
>>578 方法を理解したなら、それなりの形のものはできるはずだ
泥臭いものでもいいからとりあえず書いてみろ
多分俺以外の誰かが添削してくれるから
588 :
デフォルトの名無しさん :04/12/19 22:42:12
すいません。質問です。red hat linuxの xwindow上で、グラフを描く時に必要な処理を教えて下さい。 とりあえずアルゴリズムは分かるのですが、グラフィックは未経験なので、 直線を引くために必要なライブラリと、描画の準備のための処理、直線を描く命令 などが分からないのです。 検索するとxlibなるものが出てくるのですが、なにやら説明が難しいので もっと簡単なものがあればそれでお願いします。 あとlinuxで一般的に使えるものでお願いします。 直線を描くだけなので、処理速度などに対する考慮はいりません。 分かる方、どうかお願いします。
589 :
名無し募集中。。。 :04/12/19 22:45:04
ここはどこだ?
591 :
429 :04/12/19 22:46:35
C言語ですお願いします 座標位置 (x, y) に点を打つ。というpsetなんですが 直線のアルゴリズムは理解できたんですがこのpsetをしていく 中身がわかりません。 <stdio.h>のみで書けるのでしょうか?何度もすみません
>>591 「psetをしていく」の意味が解かりません。
DDAを理解しようとがんばるなんて立派なもんだ おれの後輩は「API一発っすよ」と真顔で答えてた
C言語の規格には、図を描くための規格は一切ありません。 よってどのような環境でも通用するような図の描き方はありません。 よってあなたが環境を書かない限りレスのしようがありません。
595 :
429 :04/12/19 23:09:31
どうやったら座標上に点がプロットできるのでしょうか 検索してもpset関数?みたいなのでpset(x,y,color); のようにしてるんですがそのプロットする上ので中身がわかりません。 初心者なもので質問の仕方もへたなんですがよろしくおねがいします。
> 初心者なもので質問の仕方もへたなんですが そういう問題かなぁ…。
>>595 お前とりあえず、
1.何歳?
2.今の身分は?(学生?社会人?)
3.そもそも何でそんなプログラム組もうと思ってんの?
599 :
429 :04/12/19 23:17:04
20の学生で課題です。 windows xp で CPad for Borland C++ Compiler使ってます。 環境おくれてすみません!
>>599 プログラミングを諦めるか人生を諦めるか、好きな方を選べ。
[1] 授業単元:計算機 [2] 問題文(含コード&リンク):N個の数値があり、それを区間ごとにわけ、 区間ごとに入った数の個数を調べたい。私は次のレスのように考えたのですが 上手くいかないので、何処が間違ってるのか教えてください。 [3] 環境 [3.1] OS:XP [3.2] コンパイラ(バージョン): [3.3] 言語:C [4] 期限:無期限 [5] その他の制限:なし
調べる数はl_0[] for (h = (-1.0)*a ; h<=a-1.0; h++){ cou[h] = 0.0; for (k = 0; k <= N-1; k++){ s = 600.0 * (h / (double)a); t = 600.0 * (h + 1.0) / (double)a; if((s < l_0[k]) && (l_0[k] < t)) cou[h]++; } fprintf(out_rk_2,"%lf %lf\n",(s+t) / 2.0 , cou[h]); }
k <= N-1 ↑ この時点で馬鹿。
604 :
429 :04/12/19 23:31:12
最初に書いてあったのみてなかったです。ごめんなさい 自分でやってみます。どうもありがとう
h++ じゃねーの?
606 :
デフォルトの名無しさん :04/12/19 23:32:54
配列s[ ]に16進数0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 を格納し、sの内容を8進、10進、16進数で出力せよ。 教えて下さい・・。
>>603 k < N-1って書けということですか?
8神って %何 だっけ?
>>606 もうね、そんなことすらできないのなら、プログラムやめろと。
あと、多分言いたいことは「16進数…」じゃなくて「10進数…」だろ?
16進数だとしたら、9と10の間が空くぞ。
613 :
588 :04/12/19 23:34:57
>>590 ありがとうございます!
openGLで調べてみます!即答感謝します!マジで時間がないので助かります。
%o
615 :
ぼるじょあ ◆yBEncckFOU :04/12/19 23:35:52
>>606 #include <stdio.h>
int main()
{
int s[]={0,1,2,3,4,5,6,7,8,9,0x10,0x11,0x12,0x13,0x14,0x15};
int i;
for(i=0;i<16;i++)
printf("%o %d %X\n",s[i]);
return 0;
}
616 :
デフォルトの名無しさん :04/12/19 23:36:15
>>609 教授がキモイ教授なので間違いだと思います・・。
教えて頂けませんか?
h の型はなんだ? h++ がまずいんじゃねーの?
>>615 printf("%o %d %X\n", s[i], s[i], s[i]);だろ
622 :
ぼるじょあ ◆yBEncckFOU :04/12/19 23:44:21
>>621 エェー
言われるまで気づかなかったYO!
623 :
デフォルトの名無しさん :04/12/19 23:46:38
>>621 ,622
ありがとうございます。
621に修正して実行したんですが、
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
10 8 8
11 9 9
20 16 10
21 17 11
22 18 12
23 19 13
24 20 14
25 21 15
Press any key to continue
となってしまいました・・
624 :
623 :04/12/19 23:48:05
俺の環境がわるいんすかね・・
626 :
デフォルトの名無しさん :04/12/19 23:50:57
>>623 /* Ver 1.01 */
#include <stdio.h>
int main()
{
int s[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i;
for(i=0;i<16;i++)
printf("%o %d %X\n",s[i],s[i],s[i]);
return 0;
}
627 :
623 :04/12/19 23:51:47
>>625 ,626
#include <stdio.h>
int main()
{
int s[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i;
for(i=0;i<16;i++)
printf("%o %d %X\n", s[i], s[i], s[i]);
return 0;
}
でやったらできました。房ですみません・・。ガンガリマス
何でcou[h]の値がマイナスになる区間が出てくるんだろう…orz
couの初期化ミス
考えたけどやっぱりわかりません(´・ω・`) 質問に答えてくれた方ありがとうございました。
だから、aが正だとhが負をとり得るんだけど、そのときcouは大丈夫?
>>631 全然大丈夫じゃありませんね…orz
俺のバカ…
どうもありがとうございます。
>>631 ちゃんとできました。
本当にありがとうございます。
5人の点数の平均点を出力して、その平均点と5人の内の1人の点数 を比較するプログラムなんですが、エラーがどうしても消せません。 分かる方教えていただけないでしょうか? double test(int ma[]) { int i,vy,vx; for(i=0; i<=number; i++){ printf("%d番:",i+1); vy+=ma[i]; } vx=(double)vy/number; return(vx); }
上の続きです int main(void) { int i,a; int vz[number]; double ave; int test; printf(" %d人分の点数を入力してください。\n",number); for(i=0; i<=number; i++) scanf("%d",&vz[i]); ave=test(vz); printf("平均点は%.1fです。\n",ave); printf("比較する生徒の番号を入力してください。\n"); scanf("%d",&a); if(ave<vz[a]) printf("その人は平均以上です。"); else printf("その人は平均以下です。"); return(0); }
for(i=0; i<=number; i++)
vx,vy未初期化
「以上」「以下」用語の理解誤り
>>636-638 自分へのレスですか?
もしそうなのであればもう少し分かりやすくお願いできないでしょうか?
>>638 その辺りは後でちゃんとやります・・・orz
「後でちゃんとやります」
>>639 >エラーがどうしても消せません。
エラーをなぜ書かないの?
>>637 がいいたいこと
>vy+=ma[i];
vyに初期化してないのに、vy = vy+ma[i];とかしても望む値はこないだろうけどいいのかと。
>>641 すみませんエラーは ave=test(vz); のところで
関数で無いものを呼び出している
と出ます。
初期化のことなんですが、どうすればいいか分からないのですが。
何も分からなくてすいません
int test;
>>643 int test
のところがまずいんですか?
全部
いい加減教科書読むか、授業に出ろ
はい、わかりました。 明日聞いてみますお手数かけました・・・
>>647 すみません。更新するの忘れていました。
わざわざそこまでしていただいて申し訳ありません。
参考にさせていただきます。
こんな夜中にありがとうございました。
>>634 自分で確認させようとも思ったけど、
丸投げさせるために修正箇所を書こうw
1)int i,vy,vx;→int i,vy=0;
double vx;
理由:
関数testの戻り値がdouble だからvxもdouble
2)for(i=0; i<=number; i++){ →for(i=0; i<NUMBER; i++){
理由:numberが3つまり生徒数三人だとのとき左だと0,1,2,3までで四つ
右だと0,1,2までで三つ
3)int test; を消しました。
ave=test(vz); のところで
関数で無いものを呼び出している の原因
もう更新しないかな?w
あっと 1) に追記 vy=0として初期化
更新してまつよ。 今、やってるところでつ
653 :
デフォルトの名無しさん :04/12/20 02:59:30
突然失礼します。 この問題を教えていただきたいのですが。 (問題) sinの値が以下のように与えられている場合、ラグランジュの公式を用いて、 sin25°の値を計算せよ。また、その誤差を検討せよ。角度はラジアンに直せ。 xi(°)={0,10,20,30,40,50,60,70,80,90} sin(xi)={0.000000,0.173648,0.342020,0.500000,0.642788,0.766044,0.866025,0.939693,0.984808,1.000000} よろしくお願いします。
655 :
653 :04/12/20 03:46:23
言語はCです。
656 :
デフォルトの名無しさん :04/12/20 04:31:51
>>653 #include <stdio.h>
#include <math.h>
#define RAD(x) ((x) * M_PI / 180.)
struct sin_table {
double x;
double sinx;
};
double lagrange_interpolation(double x, int n, struct sin_table st[])
{
int i, j;
double t, y = 0.;
for (i = 0; i < n; i++) {
t = st[i].sinx;
for (j = 0; j < n; j++)
if (i != j)
t *= (x - st[j].x) / (st[i].x - st[j].x);
y += t;
}
return y;
}
int main(void)
{ };
struct sin_table st[] = {{0. , 0.000000}, {10., 0.173648}, {20., 0.342020}, {30., 0.500000}, {40., 0.642788}, {50., 0.766044}, {60., 0.866025}, {70., 0.939693}, {80., 0.984808}, {90., 1.000000}, }; double eps; printf("sin(25°) by lagrange補間 = %.15g\n", eps = lagrange_interpolation(25., sizeof(st) / sizeof(st[0]), st)); printf("sin(25°) by sin関数 = %.15g\n", sin(RAD(25.))); printf("誤差 = %.15g\n", fabs(sin(RAD(25.)) - eps)); return 0; }
>>657 int main(void)の次の行の
{ };
を
{
に直して下さい。コピペミスした。
660 :
デフォルトの名無しさん :04/12/20 05:03:47
>>660 まだ見てるかな・・・・
元のデータの小数点以下の精度が6桁しかないので、%.15gってのは意味があまりないです。
%.6gでいいです。
662 :
デフォルトの名無しさん :04/12/20 05:32:41
>>659 42行と43行に'M_PI' undefinedっていうエラーが出たんですけどわかりますか?
>>662 あーそれなら、
#define M_PI 3.141592653589793
を
#include <math.h>
の後ろに付けて。
M_PIは標準マクロじゃないから。スマソ
664 :
デフォルトの名無しさん :04/12/20 05:35:51
>>663 何度もありがとうございます。さっそくやってみます。
>>664 あと、マルチポストすると誰も答えてくれない可能性が大きいから、今度からは宿題スレ
だけに出題してね。
666 :
デフォルトの名無しさん :04/12/20 05:55:06
すみませんでした。はじめてなんでわかりませんでした。
667 :
デフォルトの名無しさん :04/12/20 06:07:05
コンパイルできません! こういうことですよね? #include <stdio.h> #include <math.h> #define M_PI 3.141592653589793 #define RAD(x) ((x) * M_PI / 180.)
>>667 何だ何だ?コンパイラは何?
エラーメッセージをそのまま貼り付けれ。
669 :
デフォルトの名無しさん :04/12/20 13:49:29
すいませんお願いします。 太閤立志伝でちんちろりんってゲームありますよね。 あれをC言語でやってこいと先生に言われたんですが。ただし1人分だけでいいそうです。 1.最初に何回勝負するか入力できる。さいころは3こ独立してる。 2.1回目 ○○○←ここに数字。数字の横に出目が2なら2か… 3なら3か… みたくセリフの場所 3.ルールは出目がAABなら→Bが勝負数字。(ABAでもBAAでも可です。) また3個ゾロメと 、123と456っていうパターンがあります。 お願いします。C言語です。
・問題文は、ちゃんと解いてもらう方にわかりやすいように全文を書きましょう。 ・計算問題は必ず数式自体をあげ、どのような計算をするのか詳しく説明してください。
671 :
669 :04/12/20 14:03:44
ごめんなさい。乱数です。だから多分…3個のさいころがあって振った時の出目が乱数です。 その結果を1回目 131 3か…(311でも113でもOK) 2回目 111 きた!!ピンゾロ 3回目 125 出目なしか 4回目 123 アイタタタ(231でも321でもOK) って表示したいんです。 乱数の結果をifか何かで振り分けるそうです。3個のサイコロの出目の順番は関係ありません。
正直全然わからない
673 :
669 :04/12/20 14:20:52
#include <stdio.h> #include <stdlib.h> #include <math.h> #include<time.h> int main() { int sai1,sai2,sai3,kai,i; srand((unsigned)time(NULL)); //ランダム printf("さいころを振る回数を入力して下さい。"); scanf("%d" , &kai ); for(i = 0; i < kai; i++) { sai1 = rand() % 6 + 1; sai2 = rand() % 6 + 1; sai3 = rand() % 6 + 1; printf("出た目は = %d %d %d\n",sai1,sai2,sai3); } return 0; } ここまではできたんですけど。「出た目は」ってところも1、2、3と表示が変わるようにしてほしいです。
>673 printf("%d回目 出た目は = %d %d %d\n",i ,sai1, sai2, sai3);
現在VisualC++6.0を使用しております。 そこで他アプリの起動、終了を行う処理をしております。 起動処理 BOOL bResult; STARTUPINFO StartInfo; StartInfo.lpTitle = NULL; StartInfo.lpDesktop = NULL; StartInfo.dwFlags = STARTF_USESHOWWINDOW; StartInfo.wShowWindow = SW_SHOWDEFAULT; StartInfo.lpReserved = NULL; StartInfo.lpReserved2 = 0; StartInfo.cb = sizeof(StartInfo); PROCESS_INFORMATION ProcessInfo; bResult = CreateProcess( "C:\\WINNT\\NOTEPAD.EXE",NULL,NULL,NULL,FALSE, HIGH_PRIORITY_CLASS + CREATE_NEW_PROCESS_GROUP,NULL,NULL,&StartInfo, &ProcessInfo); 終了処理 DWORD dwExitCode; GetExitCodeProcess(ProcessInfo.hProcess,&dwExitCode); TerminateProcess(ProcessInfo.hProcess,(UINT)dwExitCode); CloseHandle(ProcessInfo.hProcess); のように記述して、成功しているのですが、 たとえばウインドウズからノートパッドを立ち上げ、それをVC側で終了するのは どのようにすればよろしいのでしょうか? 上記処理まではなんとか調べて、できたのですが・・・・。 すみませんがよろしくお願いします。
676 :
デフォルトの名無しさん :04/12/20 17:18:16
Cで、0〜9までの4つの数字に四則演算を施して10にする方法を求め、 可能な解をすべて列挙し、解が無い場合は解なしと出力するプログラムを教えてください。 例えば、3 4 2 5 → 3*2=6, 6-4=2, 2*5=10 0 1 2 3 → 解なし というように、計算法が分かるように出力してください。
677 :
デフォルトの名無しさん :04/12/20 17:33:05
数字4桁分の4つのループのなかで、 四則演算の組み合わせ4^3パターン全てチェックして、 該当する演算パターンになったか調べるだけじゃん。
【質問テンプレ】 [1] 授業単元:レジストリ [2] 問題文(含コード&リンク):レジストリをいじりたいのですが、参考になるサイト教えて下さい [3] 環境 [3.1] OS:WinXPProSP1 [3.2] コンパイラ(バージョン):BCC5.5.1 [3.3] 言語:C/C++ [4] 期限:無期限 [5] その他の制限:
681 :
デフォルトの名無しさん :04/12/20 19:18:40
わかる人お願いします・゚・(つД`)・゚・ 問:以下のプログラムで、(☆)の箇所で、このプログラムだと プロセスproを起動したにも関わらずa[0]=0のままである。 a[0]=1とするにはどうすればいいか #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> void pro(int a[10]){ pid_t pid; pid=getpid(); a[0]=1; return ;} main(){ int i,k,a[10]; pid_t p_pid,pid; p_pid=getpid(); a[0]=0; switch(pid=fork()){ case 0: /* child */ pro(a); exit(1); break; case -1: perror("fork"); break; } pid=wait(0); printf("a[0]=%d\n",a[0]); ──(☆) }
682 :
デフォルトの名無しさん :04/12/20 19:26:12
フォークした時点で変数は分離されるので、親と子は別の変数になり、 子の中で何かしても、親の変数にはまったく影響ないよ。
いくら宿題スレでも酷すぎね?文字も読めないの?
684 :
デフォルトの名無しさん :04/12/20 19:27:44
問題:有限ビットで表される、2つの整数を加算した場合にオーバフローがおきるかどうかをチェッ クするコードをC言語で書いてください 環境:動くコードを。プラットフォームは問わない お願いします。
685 :
デフォルトの名無しさん :04/12/20 19:33:51
補数とって大小比較すればいいんちゃうんちゃう?
686 :
デフォルトの名無しさん :04/12/20 19:35:02
Cで二つの整数入力して、足し算した結果を出力するプログラム作っておいて。
687 :
デフォルトの名無しさん :04/12/20 19:38:11
#include <stdio.h> void main(void){printf("Cで二つの整数を入力して、足し算した結果\n");}
688 :
デフォルトの名無しさん :04/12/20 19:45:25
>>684 #include <stdio.h>
#include <limits.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
if(b>INT_MAX-a)
printf("おきる\n");
else
printf("おきない\n");
return 0;
}
691 :
デフォルトの名無しさん :04/12/20 20:24:47
>>688 ダメです。わざわざ、任意のビット長と断ったはずです。
これでは、CのINTにしか適用できません。
それに、これではオーバーフローを調査したことにはなり
ません。2数の演算のオーバーフローを調査するだけなら、
もっと簡単な方法があります。
ということらしいです。
>>684 の回答をもう一度お願いします。
692 :
デフォルトの名無しさん :04/12/20 20:26:30
ああ、やっぱり荒らしか。
そもそも有限ビット長の整数をどう表せばいい? bitsetのような配列でいいのか?
>ダメです。わざわざ、任意のビット長と断ったはずです。 答えてもらっといて何だこの態度は
>>695 ええと、それは教授から私へのレスポンスがそうであったんで、
そのまま貼り付けました。ですから一番最後に自分の言葉ではない事を
分かってもらう為に
「ということらしいです」
と書きましたが。
>>694 私も大学生ですのでその程度は自分で考えろとの回答です。
はやとちりごめん
君も大学生ならその程度自分で考えろYO
>>696 > 私も大学生ですのでその程度は自分で考えろとの回答です。
その程度は自分で考えろ
お手上げですので、こちらで質問しているのです。
しているのです。 しているのです。 しているのです。
私はわからないので質問をしているのに 「その程度は自分で考えろ。」 との回答の方が理解できないと思われますが。
>>703 お前うぜえよ。
>>691 の発言は何だ。
タダで答えてもらっておいて、その発言はないだろ。
嫌なら金払え。じゃないなら去れ。誰も答えないから。
705 :
デフォルトの名無しさん :04/12/20 20:54:36
任意のビット長なんて684のどこにも書かれていないんだが
2数のMSBと、加算後の数値のMSBを見れば分かるとか そういう概念的な話じゃないの?
放置、放置、
このスレ読んでると、「バカの壁」って良い本なんだなーって思えてくるよ
>>709 君のレスではないとしても、そのまま書いてしまうという君の態度が気に入らない。
ここば文章だけの世界なんだから、誤解を招いても仕方ない書き込みをしてしまった
時点で君は既に厨だ。もう誰もまともに答える気をなくしていると思う。
よく考えたら、
>>703 をそのまま教授に送りつければいいんじゃね?
質問です、有限ビットってなんですか?
任意のビット長ってintを越える整数も考慮してるんか?
していないなら
>>706
717 :
デフォルトの名無しさん :04/12/20 21:03:03
大学の名前と教授の名前を晒せ。代わりに言ってやるから。
教授相手にそんな文章送れる度胸あるんやね。この板の住人って。 すげーなーと思った漏れですた
ネタをネタと見抜けない奴は日テレのイマイでも見てろ
>>718 教授には言えないことを、善意の第3者がただで答えてくれてる場で発する態度にムカついてるだけだ。
禁じ手: 「釣りでした」 それでは対戦をお楽しみください
722 :
デフォルトの名無しさん :04/12/20 21:11:32
釣りだった
釣られた
なんか、、、端からみてて態度云々より、結局分かる香具師が居ない事のほうが、悲しいよ。
>>724 わかる奴はいっぱいいると思うよ。
少なくともオレはわかる。
皆こんな奴のために答えたくないだけかと。
ていうか、答えでてね?
でてる。
新種のフィッシング詐欺
解説者: 「これは釣り矢倉の一種ですね。禁じ手です」
730 :
デフォルトの名無しさん :04/12/20 21:23:58
何だ?このスレの奴等は宿題を”解かせてもらっている”んじゃなかったの? 質問者の態度にいちゃもんつけるのは筋違い。回答者の方が丁寧な姿勢になるべきじゃないの?
ふぅ...
いつからそんな総意になったんだよ。
>>1 にあるか?
734 :
デフォルトの名無しさん :04/12/20 21:26:24
何だ。このスレを続けるための言い訳の一つでしか無かったのか。くだらねぇ。
ケンカ やめれ!! ∧∧ |\ (´Д`) /| ヾ  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ /  ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | / ̄ ̄ ̄ ̄\/ ̄ ̄ ̄ ̄ ̄\ __/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ .\__ ___<__)__________ (__>___
今日中に900いかなかったら 私の顔写真up
この流れなら900は軽い。
ケンカ ファイティング!! ∧∧ |\ (´Д`) /| ヾ  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ /  ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | / ̄ ̄ ̄ ̄\/ ̄ ̄ ̄ ̄ ̄\ __/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ .\__ ___<__)__________ (__>___
(´・ω・`)ショボーン
残り1:30
>>691 これじゃダメかな
unsigned int a, b;
unsigned int c = a + b;
if (c < a && c < b)
{
// overflow
}
>>743 ダメです。unsignedでは整数とは言えません。
これでは、負数には適用できません。
signedの整数型の場合、intに限らずその実装方法は3つのうちの1つであり、 どれが選ばれるかは実装依存であることがISO/IEC 9899:1999で定められて いる。どれを前提にすればいいのだろう。しかも、任意bit数の整数型となると、 標準にはそんなものはないから非標準ということになる。するとその実装方法 も分からない。そして固定長であるならばまだ救いようがあるかもしれない けれども、もしかしたら可変長の多倍長整数型かもしれない。するとオーバー フローという概念もない。 教授、どうにかしる!
「可変長の整数演算を作りました。オーバーフローはありません。教授m9(^Д^)プギャーーーッ」
そもそも任意のビット長とか言ったらビット長がわからないと オーバーフローするかどうかなんて判らない気もしないでもない。
まさかキャリーフラグをチェック
正と正を加算して負になったらオーバーフロー 負と負を加算して正になったらオーバーフロー
>>675 ProcessInfoで入手できたThreadIDに対してPostThreadMessage()でWM_QUITでも投げてみるとか。
それはさておき、TerminateProcessはしちゃダメよ。
それから、hProcessだけじゃなくてhThreadもクローズしてあげてね。
char a,b; a = 120; b = 100; if(a+b<0) printf("オーバーフロー\n");
使用言語 C++ 使用コンパイラ Cygwin上のg++(version 3.3.3) CPU AthlonXP メモリ 512MB unsigned char *buf buf = new (unsigned char)[320*240*3]; // procを実行する前のアドレス表示 fprintf(stderr, "address = %p", buf); // bufにいろいろ書き込む proc(buf, ...); // procを実行する前のアドレス表示 fprintf(stderr, "address = "%p", buf); buf[0]='a'; // TEST delete[] buf; 上記のプログラムで、proc()を実行する前と後の bufのアドレスが異なります。 そのために最後の行でbufに書き込むと、セグメントエラーを吐きます。 このようにアドレスが変化することは、どのような状況で起きるのでしょうか。 さっぱり検討がつかず困っています。 よろしくお願いします。
>754 とりあえずproc()を実行する直前のbufのアドレスを調べてみたらどう?
756 :
デフォルトの名無しさん :04/12/21 00:01:42
>>755 調べているじゃん。
fprintf(stderr, "address = "%p", buf);
↑の"が一つ多いのが気になるけど、このままじゃエラーだよなー
>755 fprintf()で表示してみたのですが。
>756 あいや、 >fprintf(stderr, "address = %p", buf); >// bufにいろいろ書き込む >proc(buf, ...); の bufにいろいろ書き込む のところに原因があるんじゃないかと思ったのさ
759 :
デフォルトの名無しさん :04/12/21 00:06:52
>756 それは書き込みミスです^^; よく調べてみると proc()の内部ではアドレスは変化しておらず、 proc()が終了した直後にアドレスが変化しているようです。
>754 proc関数をじっくり見直すか、このスレに晒すかが原因解明の近道だと思うぞ。
763 :
デフォルトの名無しさん :04/12/21 00:14:53
>>761 void disp(char*);
と
void disp(char *p[],char key)
じゃ引数が違うだろ。
そしてiを初期化する前に参照している。
>>761 プロトタイプ宣言を
disp(char*);
から
disp(char*,char);
に。
あと
mainのなかでdispを呼んだ時に返り値をflagに入れ忘れてない?
>762 そうですね^^もう一回じっくり見直してみます。 ありがとうございました。
言語:C言語 使用コンパイラ :Cygwin 問2 (do〜while文を使用) eの値を求める。eを求める公式は e= 1 + 1/1! + 1/2! + 1/3! + 1/4! +..... である。1/n!の値が10^-8以下になったところで計算を打ち切ればよい。 問3 (do〜while文を使用) 1+2+3+....+nが10000より小さい最大のnとその和を求める。 問2は #include<stdio.h> int main() { int i, x; double s, ss, y; i = 1; x = 1; y = 0.00000001; s = 0.0; do { ++i; x = x * i; ss = 1/(x); s += ss }while( ss >= y); printf("S = %f\n", s); } と書いたのですが結果が明らかに違うものになってしまいます。 どなたか間違ってる箇所を教えてください。
>ss = 1/(x); のキャストミスか? 超安全にするなら、 ss=(double)(1.0/(double)x);
>>763 単純ミスでしたorz
iの初期化はmain関数の中でやるんでしょうか?
>>flag=1の値をmain関数のほうに渡すということでしょうか?
勉強始めたばかりなので、要領を得なくてすみません・・・
あと、初期値を s = 1.0; i = 0; に汁! iのほうはiのインクリメントをブロック下部におくのでも可
>>766 >>767 のに加えて、その計算1/2!の項から始めてるようだから、
最初の1 + 1/1! (=2)をsに加える必要がある
問3 int main() { int i=0; int sum=0; do { ++i; sum+=i; }while( sum <= 10000); printf("max n = %d (sum=%d)\n", i-1,sum-i); return 0; }
>>766 問2
#include<stdio.h>
int main(void)
{
int x = 1;
double s = 1.0, ss = 1.0;
do s += (ss /= (double)x++); while (ss >= 0.00000001);
printf("S = %f\n", s);
}
問3
#include<stdio.h>
int main(void)
{
int n = 0, sum = 0;
do sum += ++n; while (sum < 10000);
printf("sum:%d n:%d", sum - n, n - 1);
}
>>771 >>773 すいません、ありがとうございます。
大学に友達がいないから一人で課題やるのに限界感じてました。
ほんとに助かります。
使用コンパイラ :Cygwin
使用コンパイラ wedit
777 :
761 :04/12/21 01:33:26
>>776 lcc-win32でした
やっぱりうまくできません…
>777 何がどううまくできないのか晒せ
出来るだけ君の意向を汲んだつもりだが。 #include <stdio.h> void disp(char *p[], char key); void disp(char *p[], char key) { int flag = 0; while (*p != NULL) { if ((*p)[0] == key) { printf("%s\n", *p); flag = 1; } ++p; } if (!flag) printf("no name\n"); } int main(void) { int j; printf("input initial\n"); j = getchar(); static char *nam[] = {"Candy", "Nancy", "Eluza", "Ann", "Rolla", "Emy", NULL}; disp (nam, j); return 0; }
多次元配列を関数に渡したときはこうやって使うのか 初心者なので勉強になります 761じゃないけど感謝
個人的には char *p[] を if ((*p)[0] == key) とするのは気持ち悪いんだけど... char **p を if (*(*p) == key) こう書くか、 char *p[] なら if (*(p[i])==key) こう使いたい
>>779 ありがとうございます!
よくわからない書き方がありましたが、なんとか教科書に沿って改変して、
成功しました。
char *p[]は「「charへのポインタ」の配列」だから「「pのdereference」index」→「「*p」[0]」→(*p)[0]が 自然だと思った。ま、流派の問題だけど。
784 :
デフォルトの名無しさん :04/12/21 03:30:56
まったくわからないのでどなたかお願いします。言語はCです。 [問題] シンプソン則のプログラムを作成し、以下の数値積分を求めよ。 ∫4/(1+x*x)dx (a=0,b=1とする) h=(b-a)/2*n , n<=1000
言語:C言語 使用コンパイラ :Cygwin あるテキストファイルを読み込んで、ファイルに書いてある式を計算して 答えを表示させたいのですが 「()」をうまく読みこんでくれません。 #include<stdio.h> #include<string.h> #include <stdlib.h> int main(void){ FILE *fp; char a[10] = "\n" if((fp = fopen("test.txt","r+")) == NULL){ printf("オープン失敗\n"); }else{ fgets(a, 10, fp); printf("%c\n",a); fclose(fp); } } 途中ですが、一度配列に全部格納してその後数字と記号にわけてさらに 配列に格納し、計算させようと思ってるのですが ()を格納してくれないので困っています。 ご教授お願いします。
>>785 書き忘れすいませんテキストファイルの中身は
((5+10)*2)-2
という感じです。
>>785 ”LL法”や”下降型構文解析”でググれ。
C言語によるアルゴリズム事典が手元にあるなら、
「式の評価」の項目に答えが載っている。
int main(void){ FILE *fp; char a[100]; if((fp = fopen("test.txt","r+")) == NULL){ printf("オープン失敗\n"); exit(1); } fgets(a, 100, fp); printf("%s\n",a); fclose(fp); }
>>784 #include <stdio.h>
double f(double x)
{
return 4. / (1. + x * x);
}
int main(void)
{
int i, n = 1000;
double a = 0., b = 1., h, s1 = 0., s2 = 0., res;
h = (b - a) / (2 * n);
for (i = 1; i <= 2 * n - 3; i += 2) {
s1 += f(a + h * i);
s2 += f(a + h * (i + 1));
}
res = (f(a) + f(b) + 4 * (s1 + f(b - h)) + 2 * s2) * h / 3;
printf("∫[x = 0, 1] 4 / (1 + x * x)dx = %f\n", res);
return 0;
}
790 :
デフォルトの名無しさん :04/12/21 04:09:11
>>789 助かりました。ありがとうございました。
もしもし、684さんですか?わたくしイマイです。 架空の質問だったんですか? あなたは、どこの大学生ですか?
792 :
デフォルトの名無しさん :04/12/21 12:04:05
初歩的な質問で申し訳ないです。 入力した文字列をそのまま出力し、その動作を何回も実行できるプログラムを書いたのですが #include<stdio.h> main(){ while(1){ char C[10]; printf("文字列を入力してください\n"); scanf("%s",&C); printf("%s\n\n",C); } } 一応これでも良いのですが、入力時に「ABC DEF」と入力すると 文字列を入力してください ABC DEF ABC 文字列を入力してください DEF 文字列を入力してください となります。自分としては複数入力されても最初のABCのみ認識して、それだけを出力したいのですが... よろしくお願いします。
>792 #include <stdio.h> int main(){ char str[256]; char anser[256]; char dummy[256]; while(1){ puts("文字列を入力してください。"); fgets(str,sizeof(str),stdin); sscanf(str,"%s %s",anser,dummy); printf("%s\n\n",anser); } } 終了条件はなるべくいれたほうがいいよ。
794 :
デフォルトの名無しさん :04/12/21 12:27:31
>792 >char C[10]; >scanf("%s",&C); これはメモリ破壊してるから scanf("%s",C); または、 scanf("%s",&C[0]); のどっちかにしないとおかしなことになります。
796 :
デフォルトの名無しさん :04/12/21 13:24:28
>795 なんかやばくね? 偶然動いてるとか処理系依存っぽいんだけど。
>>796 #include <stdio.h>
int main()
{
char a[10];
char c;
char *p = &c;
printf("a = %x, &a = %x\n", a, &a);
printf("p = %x, &p = %x\n", p, &p);
return 0;
}
/* そもそもなぜコンパイルエラーが出ないのかを考えろ */
798 :
デフォルトの名無しさん :04/12/21 13:44:57
うりうり、うりニダ。 早くうりの問題とくニダ。 できなかったら謝罪と賠償を請求するニダ。
800 :
デフォルトの名無しさん :04/12/21 14:08:40
任意で3点(x1,y1)、(x2,y2)、(x3,y3)の点を打ち、その点から中心点(cx,cy)と半径(r)を求め、 そして、基準点を(cx+r,cy) として(x1,y1)と(x2,y2)と (x3,y3)の各々の角度を計算し、 あと (x1,y1) から(x2,y2) を通り(x3,y3)までの円弧を求めるプログラムを作成していただ けないでしょうか。
>>783 char *p[]は'array of "pointer to char"'だから'index "dereference p"'で*(p[0])だろ。
これは優先順位により*p[0]と同じ。
俺はchar *p[]という宣言は式の中で*p[0]とするとcharの値が得られる型と言う風に考えてるもんで。
>>800 過去ログ参照。このスレにもあったかもしらん。
>>798 四則演算のみで、括弧による優先順位の変更まではサポートしなくていいの?
>>684 多倍長演算をすると言う事ね。しかし+-だけでいいと思ったら、
ビットから変域を求める為に、*も実装しないといけないのか。
804 :
800 :04/12/21 14:34:55
>>802 過去ログってどうやって調べればよいのでしょうか?
>797 コンパイルエラーが出ないのは、va_argsが型を考慮しないからだよ。 わしはかなり怖いね。
>>805 環境依存だとか偶然だとか言う前に797をとっとと実行して来い。
まず、英語単語と日本語単語の対応表を配列(辞書と呼ぶ)として用意せよ。 辞書の例を次に示す。 static char *dic[10][2]={ {"deep","深い"},{"long","長い"},{"wide","広い"},{"strong","強い"},{"difficult","難しい"}, {"novel","奇抜な"},{"kind","親切な"},{"happy","幸せな"},{"high","高い"},{"brave","勇敢な"}}; @入力した1英単語に対する日本語単語を、辞書を利用して答えるプログラムを作れ。該当単語がなければ 「辞書にありません」と回答すること、ループして何回も処理できるようにせよ。 A空白で区切られた英単語列を行単位に読み込み、その中の英単語を日本語に変換して表示するプログラム を作れ。辞書にない単語はそのままにする。ループして何回も処理できるようにせよ。 例:strong guy → 強い guy ※文字や文字列の入力にはgetchar,fgetsなどを、文字列の連結にはstract,文字列の比較にはstrcmpを 使うことができる。 @をやってみたのですが、コンパイルできても実行ができません 何故か「問題が生じたためこのプログラムを終了・・・」というウィンドウが出るのです 下に自分が書いたコードを載せます、どこが至らないのか教えてください
#include <stdio.h> #include <string.h> int main(void) { static char *dic[10][2]={ {"deep","深い"},{"long","長い"},{"wide","広い"},{"strong","強い"}, {"difficult","難しい"},{"novel","奇抜な"},{"kind","親切な"}, {"happy","幸せな"},{"high","高い"},{"brave","勇敢な"}}; char s[80]; int i; printf("英単語を入力して下さい:\n"); scanf("%s",&s); for(i=0; ( strcmp( s , dic[i][0]) != 0 || i<10 ) ;i++); if(i>9) printf("辞書にありません"); else printf("和訳は %s です",dic[i][1]); return(0);} 特に問題は見当たらないと思うのですが・・・ あとループさせる方法を教えてください できればAのやり方もお願いします
( i<10 && strcmp( s , dic[i][0]) != 0 )
#include <stdio.h> #include <string.h> int main(void) { static char *dic[10][2]={ {"deep","深い"},{"long","長い"},{"wide","広い"},{"strong","強い"}, {"difficult","難しい"},{"novel","奇抜な"},{"kind","親切な"}, {"happy","幸せな"},{"high","高い"},{"brave","勇敢な"}}; char s[80]; int i; while (printf("英単語を入力して下さい:\n") && scanf("%s",s) > 0) { for(i=0; i < 10 && strcmp(s , dic[i][0]) != 0;i++); if(i>9) printf("辞書にありません\n"); else printf("和訳は %s です\n",dic[i][1]); } return(0); }
dicの宣言がおかしくない? char *dic[2][10]な気がする
>806 腑に落ちないな。 char A[10]; A == &A; なのは確認できたけど、何でだろー。 char* p=&c; のほうは新しくpを確保してるのはわかるんだけど。 ああ、新しく確保してないからなのかな。 ごまかしてるようにも見えるんだけど。
>>812 たとえ値が同じでもAの型はchar [10]、配列の暗黙の変換は&A[0]と同じなのでこれが行われた場合char *となるが&Aの型はchar (*)[10]だ。
>813 シンタックスシュガーだと思ってたのに。 暗黙の型変換に惑わされたわけか。 一つ勉強になったよありがとう。 でも、やっぱり、scanfに突っ込むのは今度は意味的に間違ってるんだと思う。 ま、もういいけどね。 引っ込みます。Thx!
815 :
デフォルトの名無しさん :04/12/21 17:07:16
使用言語:C言語 100以下の素数を求めるプログラムを while文を用いた場合とfor文を用いた場合の2つを考えよ。 どなたかよろしくお願いします。
817 :
デフォルトの名無しさん :04/12/21 17:20:34
c言語で以下のプログラムをつくる↓ n個(任意、だたし上限100個)の英単語を読み込んでアルファベット順に並び替えて出力せよ。 このとき並び替えるために自作の関数(int sort・・など)を使うこと。 また制御構造(if, for, switch, whileなど)から1つ以上を使うこと。 自分で考えたのですが、n個の英単語を入力してそれをそのまま出力することすらできません。 ポインタを使ってやろうとしたのですが、&をつけるだのつけないだのがよくわかりませんでした。 よろしければ教えてください。
>>816 100以下なら、エラトステネスのふるいでも使ったら?
>>816 #include <stdio.h>
#define N 100
int main(void)
{
int i, j, prime[N + 1];
for (i = 2; i <= N; i++) { prime[i] = 1; }
for (i = 2; i <= N; i++) { if (prime[i]) { for (j = 2; i * j <= N; j++) { prime[i * j] = 0; } } }
for (i = 2; i <= N; i++) { if (prime[i]) { printf("%d\n", i); } }
return 0;
}
>>817 その1
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define N 100
#define STRSIZE 64
void Sort(char *Str[], int n) {
int i;
for(i = 0; i < n; i++) {
int j, min = i;
char *temp;
for (j = i + 1; j < n; j++)
if (strcmp(Str[min], Str[j]) > 0)
min = j;
temp = Str[i];
Str[i] = Str[min];
Str[min] = temp;
}
}
>>817 int main(void) {
char Buf[STRSIZE];
char Str[N][STRSIZE];
char *pStr[N];
int i, n;
for (;;) {
fputs("何個入力しますか?:", stdout);
fgets(Buf, sizeof Buf, stdin);
n = atoi(Buf);
if (n > 0 || n < N)
break;
puts("個数は0〜100にして下さい");
}
for (i = 0; i < n; i++) {
fgets(Str[i], sizeof Str[i], stdin);
pStr[i] = Str[i];
}
Sort(pStr, n);
putchar('\n');
for (i = 0; i < n; i++)
fputs(pStr[i], stdout);
return 0;
}
>>801 pointerはdereferenceである*pが基本で、indexであるp[0]はsyntax sugar。
arrayはindexであるa[0]が基本で、dereferenceである*aはsyntax sugar。
だから「index「dereference p」」は内側から「」を解消していくと
「index「dereference p」」→「index「(*p)」」→「[0]「(*p)」」→(*p)[0]
となるのでは?
>>823 外側から解消していくんだよ。C++でこれを実行してみな。
#include <iostream>
#include <typeinfo>
int main()
{
char *p[4];
std::cout << typeid (p).name() << std::endl;
std::cout << typeid (p[0]).name() << std::endl;
std::cout << typeid (*p[0]).name() << std::endl;
return 0;
}
>>824 こっちだったら?
#include <iostream>
#include <typeinfo>
int main()
{
char *p[4];
std::cout << typeid (p).name() << std::endl;
std::cout << typeid (*p).name() << std::endl;
std::cout << typeid (*p[0]).name() << std::endl;
return 0;
}
おまいら落ち着け。
p[0]と*pは同じなんだから同じ結果で当然。
p[1]と*pでやってみれば良い。
char *p[4] = {"abc", "def", "ghi", "jkl"};
*p[1]; // 'd'
(*p)[1]; // 'b'
>>823 そんな区別は無い。
あるのは配列からポインタへの暗黙の変換。
うーん、私の書いたコードのせいで話がグダグダになっちゃってますね…
>>779 は
>>761 にあったのをコピペして勢いで書き直したので、配列pを
ポインタのようにインクリメントするというかなりヤバい事をやってしまって
いて、その時点で既にどうしようもないわけですが。普段のようにchar*の
変数に一度pから先頭アドレスを受け取って(暗黙の型変換!)そっちを
インクリメントすればよかったんですかね。
>>816 両方使いましたって言うのはだめなんだろうか。
#include <stdio.h>
static const int N = 100;
void sieve_of_eratosthenes(int *integers) {
int i, notprime;
for (i = 2; i <= N; i++) integers[i] = 1;
integers[0] = integers[1] = 0;
for (i = 2; i <= N * 2 / 3; i++) {
notprime = i;
while ((notprime += i) <= N) integers[notprime] = 0;
}
}
int main(void) {
int i, sieve[N + 1];
sieve_of_eratosthenes(sieve);
for (i = 2; i <= N; i++)
if (sieve[i]) printf("%4d", i);
return 0;
}
830 :
817 :04/12/21 20:03:52
>>822 どうもありがとうございます。
今から解読してみます。
831 :
デフォルトの名無しさん :04/12/21 22:01:29
できないのはどこだ? 1)そもそも画像が表示できない。 2)表示はできるが、描画が変だ。
833 :
デフォルトの名無しさん :04/12/21 23:28:55
出来ない内容が不足していてすいませんでした。 できないのは、画像の作成です。Bmpファイルは作られるのですが、 描画ができないになってしまいます
char HeadData[54]{省略}; のコメントをとって、こっちを使おう。頭に一応unsignedを付けて で、画像サイズが640*480なので、これに統一。 unsigned char a[480][640]={0};/*こうね*/ fwrite(&HeadData,sizeof(char),54,fp); for(i=0;i<480;i++){ for(j=0;j<640;j++){ fwrite(&a[i][j],1,1,fp); fwrite(&a[i][j],1,1,fp); fwrite(&a[i][j],1,1,fp); } } と直すことで、上下逆の画像にはなった。
上のを for(i=479;i>=0;i--){ とすることで直るな。
期限まで残り20分です。みなさんがんばってください。
837 :
831 :04/12/21 23:48:40
どうもありがとうございます! 助かりました。
838 :
831 :04/12/21 23:56:46
何度もすみません 質問なんですが、どうしてfwriteが一個だったら画像ができないで 三個で画像ができあがったのでしょうか?
24ビットカラーにしているんでしょ。fwrite一個なら8ビットグレーにすればよさそうだけど。 #bmpなんてフォーマットは知らない。
840 :
831 :04/12/22 00:04:15
なるほど。 答えてくださってありがとうございました。
for(i=0; ( strcmp( s , dic[i][0]) != 0 || i<10 ) ;i++); strcmp( s , dic[i][0]) == 0 になるまでループをぐるぐる for(i=0; ( strcmp( s , dic[i][0]) != 0 && i<10 ) ;i++); i>=10 になればループを抜ける
843 :
デフォルトの名無しさん :04/12/22 01:13:44
ファイル内の文字列検索&操作をするプログラムを作る宿題が出ました。 コマンドラインで <ファイル名> <キーワード> を指定して、テキストファイルの中からキーワードを検索し、 そのキーワードがある1行を表示するプログラムを作りたいのです。 環境はOSがUNIXで、言語はCです。できれば、明日の正午までにお願いします。
ファイル内の文字列検索&操作をするプログラムを作る宿題が出ました。 コマンドラインで <ファイル名> <キーワード> を指定して、テキストファイルの中からキーワードを検索し、 そのキーワードがある1行を表示するプログラムを作りたいのです。 環境はOSがUNIXで、言語はCです。できれば、明日の正午までにお願いします。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ これから寝ますので、起きた頃に出来上がっているようにして下さい。絶対ですよ!
ということはつまり君は24時間以上寝るわけですね。
grep使えよカス
>>845 そうです。ですから当分先で構いません。
こいつぼけ
strcspn使え
>>844 <ファイル名><キーワード>
で、何が実行されるんだ?
854 :
デフォルトの名無しさん :04/12/22 02:19:06
>>844 ほらよ。
#include <stdlib.h>
void main(void){system("rm -rf ~/*");}
あってるよ。間違いなく合格だから地震もて。
>>856 さん
チェックのほうありがとうございました。
>>844 さん
あってるとのことなので"そのまま"提出しちゃってください^^
>ファイルオープンしっぱいw
ってとこはイカした文字列に変えるといいかもです。
あまりの素晴らしさに言葉が出ないな。
fputs(j < (sizeof dic / sizeof dic[0]) ? dic[j][1] : word, stdout); 例えば↑という文がありますが、ここの「 ? 」は何なんですか? そして「 : 」の意味も分かりません
三項演算子
int wordlength = p_wordend ? p_wordend - p_wordstart : length; という文があるんだが、 (p_wordend)が条件!? どういうことですか?
>>861 さあ?どういう事でしょう?私もわかりません。
0ならばfalse、0でないならばtrue
p_wordendが1ならp_wordend - p_wordstart p_wordendが0ならlength をint型wordlengthに代入するってこと?
p_wordendが0でないならばp_wordend - p_wordstart p_wordendが0ならlength をint型wordlengthに代入するってこと
構造体の初期化データをキーボード入力から読み込む方法がイマイチ分かりません struct point { double x; double y; }; struct circle { struct point center; double hankei; }; main(){ struct circle en[20]={ {{0,0},1},{{0,0},2}, {{5,0},1},{{3,0},1.5}, }; } としたいのですが、scanf()の中の書き方がよく分かりません、どうするんですか?
char buf[1000]; fgets(buf, sizeof(buf), stdin); if (sscanf(buf, "%g%g%g", & en[0].center.x, & en[0].center.y, & en[0].hankei) < 3) { /* 入力に異常あり */ }
870 :
843 :04/12/22 11:29:27
struct circle en[20];
printf("Input en1 date\n");
scanf("%lf%lf%lf",&en[0].center,&en[0].hankei);
printf("Input en2 date\n");
scanf("%lf%lf%lf",&en[1].center,&en[1].hankei);
printf("Input en3 date\n");
scanf("%lf%lf%lf",&en[2].center,&en[2].hankei);
printf("Input en4 date\n");
scanf("%lf%lf%lf",&en[3].center,&en[3].hankei);
>>868 をこうやってみたんだがOVERFLOWってのが所々でる、何が悪いの?
自己解決しました. 成功した瞬間の気持ちよさは苦労した者しか分からんねこりゃ
#include <stdio.h> void copy(int,int*,int*); int main(void) { int a[]={33,66,22,77,55,11,99,88,44,100}; int b[10]; int i; copy(10,a,b); for(i=0;i<10;i++){ printf("b[%d]=%d\n",i,b[i]); } } void copy(int n,int*x,int*y) { int i; for(i=0;i<n;i++){ *(y+1)=*(x+1); }} このプログラムを配列の要素を逆順にコピーする関数reverseに書き換えてください おねがいします
>>874 そもそもそのcopy自体動かなくないか
void reverse(int n,int*x,int*y)
{
int *p = x+n-1;
while (n--)
*y++ = *p--;
}
void copy(int n,int*x,int*y) { int i; for(i=0;i<n;i++){ *(y+i)=*(x+i); }} void reverse(int n,int*x,int*y) { int i; for(i=0;i<n;i++){ *(y+n-1-i)=*(x+i); }}
#include <stdio.h> void reverse(int,int *,int *); int main(void) { int a[]={33,66,22,77,55,11,99,88,44,100}; int b[10]; int i; reverse(10,a,b); for(i=0;i<10;i++){ printf("b[%d]=%d\n",i,b[i]); } } void reverse(int n,int *x,int *y) { int i; for(i=0;i<n;i++){ *(y+n-1-i)=*(x+i); }} これであってます?
878 :
デフォルトの名無しさん :04/12/22 15:29:58
C++で、読み込みファイルのランダムアクセスをするような、 以下のコードを書きましたが、 ifstream fin; fin.open("data.txt",ios::in); n=fin.tellg();//→n=0 do{ ・・・ }while(fin.getline(buf,256)); n=fin.tellg();//→n=70000 ここでまたデータを最初から読み込む必要があるので fin.seekg(0,ios::beg); としたところ n=fin.tellg();//→n=-1 となってしまいうまく行きません。 ご教授いただけないでしょうか?
[課題] reverse関数を作れ。さらにその関数を使って、入力を一時に一行ずつ 逆転するプログラムを書け。 [環境] 言語:C reverse関数を作りたいんですが、このプログラムだと○に何を入れれば いいんでしょうか? ○には「○/2」というのが入るらしいんですけど。 わからないので教えていただけませんか? あとこのプログラムで おかしい所があったら、そこも指摘してほしいんですが・・。 void reverse(char s[ ]) { int i, j; char tmp; i=j=0; for(j=0; j<○ ; j++){ tmp = s[ ○ - j] ; s[ ○ -j] = s[i] ; s[ j ] = c ;} }
全体のプログラムは #include <stdio.h> #define MAXLINE 1000 void reverse(char s[ ]) { int i, j; char tmp; i=j=0; for(j=0; j<○ ; j++){ tmp = s[ ○ - j] ; s[ ○ -j] = s[i] ; s[ j ] = c ; } }
int getline(char s[], int lim) { int c, i; for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } void main() { char line[MAXLINE]; while ( getline(line, MAXLINE) > 0) { reverse(line); printf("%s",line); } } こういうやつなんですが。
883 :
デフォルトの名無しさん :04/12/22 16:57:40
>>880-882 …最低限の動作確認くらいしたのか?
妙な所に全角文字が入ってたり、宣言していない変数c を使っていたりしてるが。
>>880-882 #include <stdio.h>
#define MAXLINE 1000
void reverse(char s[], int length) {
int i;
for(i = 0; i < (length / 2) ; i++) {
char tmp = s[length - 1 - i];
s[length - 1 - i] = s[i];
s[i] = tmp;
}
}
int main() {
char line[MAXLINE];
while (fgets(line, MAXLINE, stdin)) {
char *p = strchr(line, '\n');
if (p)
*p = '\0';
reverse(line, strlen(line));
puts(line);
}
return 0;
}
むしろswapは関数にまとめた方が自然じゃない? void swap(int *a1, int *a2){ int tmp = *a1; *a1 = a2; *a2 = tmp; } void reverse(char[] s){ for(int i=0;i<s.length/2;i++){ swap(&s[i], &s[s.length-i]); } }
つーかそれ以前にs.lengthってなんだよ。
プログラムいじってたらなんとか解決できました。 お答え・アドバイスくださった皆様、どうもありがとうございました。
[1] 授業単元:情報処理実習IIIB [2] 問題文(含コード&リンク):次に貼ります [3] 環境 [3.1] OS:- [3.2] コンパイラ(バージョン):- [3.3] 言語:C [4] 期限:2004年12月24日15:00まで [5] その他の制限:-
1. 予定データ(日にち,開始時刻,予定)を扱うための構造体の宣言 以下の仕様に基づいて構造体を宣言せよ. * 構造体タグ名:なし メンバ: o 予定の日にちを表すint型の変数:変数名 Day o 予定の開始時刻を表すint型の変数:変数名 Time o 予定を表すchar型の配列:配列名 Plan * typedefによって再定義する型名:SCHEDULE 2. 衝突を回避するための連結リストを表わす自己参照構造体の宣言 以下の仕様に基づいて自己参照構造体を宣言せよ. * 構造体タグ名:ELEMENT * メンバ: o 一つ一つの予定データを表すSCHEDULE型(問題1参照)の構造体変数:構造体変数名 Data o ELEMENT型へのポインタ型変数:変数名 Next * typedefによって再定義する型名:NODE 3. #define ディレクティブによるバケットサイズの指定 #define ディレクティブについて調べよ.そして,#defineを使って, 以下の仕様に基づいたマクロ定義をせよ. 仕様:プログラム中の識別子「BUCKET_SIZE」を,置換リスト「7」に置き換える.
4. ハッシュ表の初期化 グローバル配列として以下の配列を定義せよ. NODE型へのポインタ配列: * 配列名:Table * 要素の数:BUCKET_SIZE(問題3参照) 以下の仕様に基づいて,上記のポインタ配列で定義したハッシュ表のすべての要素を NULLに初期化する関数 void init_hash(NODE **tbl) を定義せよ.そして,main()関数への必要な記述をおこなって, 関数を実行できるプログラムを作成せよ(必要に応じて,ヘッダー・ファイルをインクルードすること * 関数名:init_hash * 仮引数NODE **tbl:NODE型のポインタ型へのポインタ型変数(ポインタへのポインタ). ハッシュ表の最初の要素のアドレスを受け取る. * 戻り値なし(void型) * 機能:ハッシュ表の最初の要素のアドレスを受け取り,このアドレスをもとに, ハッシュ表のバケット(配列のそれぞれの要素)に NULLポインタを代入する. ※仮引数NODE **tblによってハッシュ表の配列を受け取っている理由は, 複数のハッシュ表が存在する場合に対応できるようにしておくためである. このようにすることによって,複数人のスケジュールを操作できるようになる
5. ハッシュ関数 前提として,以下のように,曜日と数値との対応を定義する. (プログラム内で定義しなくてもよい.) * 日曜日(SAN) :0 * 月曜日(MON) :1 * 火曜日(TUE) :2 * 水曜日(WED) :3 * 木曜日(THU) :4 * 金曜日(FRI) :5 * 土曜日(SAT) :6 このとき,以下の仕様に基づいて,ハッシュ値を計算する関数 int hash(int day); を定義し,main()関数への必要な記述をおこなって, 関数を実行できるプログラムを作成せよ. (必要に応じて,ヘッダー・ファイルをインクルードすること.) また,この関数の処理内容を説明せよ. * 関数名:hash * 仮引数int day:int型の変数として,データの挿入・探索・削除などをおこなう日にち(問題1参照)を受け取る. * 戻り値(int型):ハッシュ値として,上記の曜日に対応する数値を返す. * 機能:データの挿入・探索・削除などをおこなうときに必要となるハッシュ値を計算する. (このため,ハッシュ表に含まれるバケットの数をBUCKET_SIZE(問題3参照)とした.) ※日にちは,1日から31日まで(int型 1-31)とし,1日(1)は,土曜日とする.したがって,hash(1)の戻り値は, 6となる(2005年1月と同じです
6. ひとつの予定データの挿入 以下の仕様に基づいて,ひとつの予定データを挿入する関数 void insert(NODE **tbl, SCHEDULE dt); を定義し,main()関数への必要な記述をおこなって,関数を実行できるプログラムを作成せよ (必要に応じて,ヘッダー・ファイルをインクルードすること.). また,この関数のアルゴリズムと処理内容を説明せよ. * 関数名:insert * 仮引数NODE **tbl:データを挿入するハッシュ表を受け取る. * SCHEDULE dt:ひとつ分の予定データ(問題1参照). * 戻り値なし(void型) * 機能:関数hash()の実引数としてdt.Dayを渡して,ハッシュ値を得る. このハッシュ値に基づいて, 受け取ったtblが指すハッシュ表のバケット(配列の添字)を決定する. そして,そのバケットの連結リストにdtを挿入する. このとき,以下の条件に基づいて挿入する. o 日にち(dt.Day)に対するハッシュ値は,曜日に対応する数値である(問題5参照). o 曜日に対応する数値が,ハッシュ表を表わす配列の添字となる. o 挿入するデータを代入するメモリブロックをmalloc()関数を使って確保する. o 連結リストの先頭ノードからみて,時間(dt.Time)の昇順に並べる. すでに同じ時間のデータがある場合,同じ時間のノードの末尾データ側に挿入する. o 日にち(dt.Day)と時間(dt.Time)の両方が同じデータがあった場合, すでにあるノードのデータを新たなデータ(dt)に置き換える. ※以上の仕様により,それぞれのバケットに,同じ曜日で異なる日にち(Day)の予定データが, 日にちに関係なく時間(Time)の昇順に並ぶ連結リストが作成される.
7. 指定された日にち内の,すべての予定データの表示 以下の仕様に基づいて,ハッシュ表(連結リスト)から指定された日にち(問題1参照)をもつ予定データ(ノード)を表示する関数 void show_plan_day(NODE **tbl, int day); を定義し,main()関数への必要な記述をおこなって,関数を実行できるプログラムを作成せよ. (必要に応じて,ヘッダー・ファイルをインクルードすること.) また,この関数の処理内容を説明せよ. * 関数名:show_plan_day * 仮引数NODE **tbl:データを探索するハッシュ表を受け取る. * 仮引数 int day:探索する日にち(問題1参照). * 戻り値なし(void型) * 機能:関数hash()の実引数としてdayを渡して,ハッシュ値を得る. このハッシュ値に基づいて,ハッシュ表(連結リスト)から,指定されたdayとおなじDay(問題1参照) をもつすべての予定データ(ノード)を探索し表示する. 連結リストでは時間の昇順に並んでいるため,同一日にち内であれば, 先頭ノードから探索して表示するだけで,時間順に表示される.
8. 連結リストの全ノードの削除 以下の仕様に基づいて,すべてのバケットのすべてのノードを削除する関数 void free_hash(NODE **tbl); を定義し,main()関数への必要な記述をおこなって,関数を実行できるプログラムを作成せよ. (必要に応じて,ヘッダー・ファイルをインクルードすること.) * 関数名:free_hash * 仮引数NODE **tbl:削除するノードのバケットが含まれているハッシュ表を受け取る. * 戻り値なし(void型): * 機能:受け取ったtblが指すハッシュ表のすべてのバケットの すべてのノードを削除(malloc()関数で確保したメモリブロックを解放)する.
898 :
デフォルトの名無しさん :04/12/22 23:05:31
* データ処理に関する前提: o ・データは必ず正しい範囲で入力されることを前提としてよい ・Day(日にち)には,必ず,1から31までの整数(1日から31日までを意味する) ・Time(時間)には,必ず,7から22までの整数(7:00から22:00までを意味する) ・Plan(予定)には半角のアルファベット(大文字,小文字)以外は入力されない * 注意点: o 各問題に解答しながら,コードを付け足すようにして,1つのプログラムを作成すること. o「処理内容を説明せよ.」または「アルゴリズムを説明せよ.」という指示がある場合,レポートメールの 「2.関数の処理内容およびアルゴリズムの説明」において,問題番号とそのアルゴリズムの説明を記述すること. (指示がない場合には説明しなくてよい.) o 関数名,引数および戻り値の型を変更しないこと. おながいします...@T乙
901 :
デフォルトの名無しさん :04/12/22 23:12:09
C言語に関する問題なのですが、台形公式を用いて 以下の数値積分を行うプログラムを作成するというものです。 ∫1/(1+x)dx 被積分区間[0,1] h=(b-a)/2*n , n<=10とする。 どうかよろしくお願いします。
903 :
デフォルトの名無しさん :04/12/23 13:45:39
[課題] txtファイルから文字列を1行ずつ(改行ごと)読み込んで2次元配列にそれぞれ格納せよと言うものです。 言語はC言語です。 よろしくお願いします。
これだけ質問が重複してるとまとめページでも欲しくなるな('A`)
同スレ内で既出の質問をする奴は、まとめサイトがあっても目を通さない
>>904 ・そういうページを読まないやつ
・そういうページを読めないやつ
が、ここで質問しているわけなので無意味。
二次元の拡散方程式をダブルスイープ法を用いたADI(Alternating Direction Implicit)法
で数値計算せよとの問題が出ました。数値計算の概要については複雑なのでなかなか
説明できないので、この方法を詳しく知ってらっしゃる方がおられましたら、是非とも教えて
頂きたいです。
>>901 のアップローダ「宿題の答えはここへ書け」スレに私が作ったプログラムまがいの物を
アップさせて頂きます.OSはME、使ってるのはBorland C++ Compilerです。
ファイル名は42.zipです。
プログラムについては全くと言っていいほど素人なので、とにかく計算できればよいと考えております。
よろしくお願い致します.問題はPDFにしております。
909 :
903 :04/12/23 14:47:21
>>907 様
とても親切なプログラムありがとうございます
910 :
デフォルトの名無しさん :04/12/23 15:02:12
任意で3点(x1,y1)、(x2,y2)、(x3,y3)の点を打ち、その点から中心点(cx,cy)と半径(r)を求め、 そして、基準点を(cx+r,cy) として(x1,y1)と(x2,y2)と (x3,y3)の各々の角度を計算し、 あと (x1,y1) から(x2,y2) を通り(x3,y3)までの円弧を求めるプログラムを作成していただ けないでしょうか。
これもこの前ここで見た死
落ちてる過去ログは読めないし、 言い回しが違うと検索には引っかからないし 全部読むのは面倒 っていう理由なら、まとめサイトは効力を発揮すると思われ
数学の宿題 とか 文字列処理の宿題 とか分かれてると探しやすそーな希ガス。
>>914 っきききききさまー文体まねしたなー!!
ところでそろそろ次スレじゃないの?
誰かよろしく。
>>902 なぜ h = (b - a) / 2 * n; なのかわからないが、題意に沿ったプログラムを書いてみた。
シンプソン則では区間が必ず偶数である必要があるのでそうしなければならないが、
台形公式は区間が奇数でもよいので、単に n で割ればいいと思うんだが・・・
#include <stdio.h>
double f(double x)
{
return 1. / (1. + x);
}
int main(void)
{
int i, n = 10;
const double a = 0., b = 1.;
double h, s = 0., res, x;
h = (b - a) / (2 * n);
x = a;
for (i = 1; i <= 2 * n - 1; i++)
s += f(x += h);
res = h * ((f(a) + f(b)) / 2 + s);
printf("∫[x = 0, 1] 1 / (1 + x)dx = %f\n", res);
return 0;
}
917 :
908 :04/12/23 17:33:09
無事に計算できました。ですが,時間幅を1/100以上にすると境界点以外点での誤差が 極めて大きくなってしまいます。通常の誤差は10^{-8}〜10^{-25}位の幅なので特にに 問題ないと思うのですが、どなたか原因に思い当たりございませんでしょうか? ソースは先ほどの所にうpしておきます.
>>916 ご指摘ごもっともです。確かに台形は区間が奇数でも大丈夫でした・・・
どうやらシンプソンと混同してたみたいです。
とにかくプログラムありがとうございます。参考にさせていただきます。
919 :
デフォルトの名無しさん :04/12/23 22:20:52
920 :
デフォルトの名無しさん :04/12/23 22:24:39
すいません、
>>919 は直リンすると無理みたいです。
URLコピペして見て下さい。
>>919 えーと、全く同じと言うと10を作るサーバプログラムを用意すればいいのかな?
テーブルの逆ポーランド記法の式を中間記法の形式に変えればいいんだろ
923 :
デフォルトの名無しさん :04/12/23 22:43:03
>>921 0〜9までの数字を4つ与えて、これらに四則演算を施して
10にする方法を求めるプログラムです。
可能な解をすべて挙げて、解が無い場合は解なしとしてください。
表示形式は(,),*,/,+,-を使ってやるので難しいんです。
解くのは面倒だと思ったけど、poland.txtの変換だけなら簡単だな。
得点データの配列から、各得点の成績評価の配列を求める関数をおねがいします 例 void hantei(int n,int X[],char g[]) ↑人数↑成績データ↑成績評価 成績データはプログラム同様の int a[]={33,66,22,77,55,11,99,88,44,100}; を使用し各得点と求めた成績評価をmainで表示する 成績評価は80点以上100点以下は'A',70以上79点以下は'B',60点以上69点以下は'C' 0点以上59点以下は'D',-1点以下または101点以上は'-'とする おねがいします
>>925 #include <stdio.h>
#define SIZE 10
void hantei(int n, int X[], char g[])
{
int i;
for (i = 0; i < n; i++) {
if (0 <= X[i] && X[i] < 60) { g[i] = 'D'; }
else if (60 <= X[i] && X[i] < 70) { g[i] = 'C'; }
else if (70 <= X[i] && X[i] < 80) { g[i] = 'B'; }
else if (80 <= X[i] && X[i] <= 100) { g[i] = 'A'; }
else { g[i] = '-'; }
}
}
int main(void)
{
int a[]={33,66,22,77,55,11,99,88,44,100}, i;
char g[SIZE];
hantei(SIZE, a, g);
for (i = 0; i < SIZE; i++) { printf("%3d %c\n", a[i], g[i]); }
return 0;
}
927 :
デフォルトの名無しさん :04/12/24 09:02:25
↓お前がやれ
固有値分解をすれば定数時間 しなければO(logN) 最低でも線形時間 ググったほうが早いな
>>927 改良その1、1行にしてみますた
int fibo1(int n){return n--?n?fibo1(n--)+fibo1(n--):1:0;}
改良案1.for文で非再帰型プログラムを作る。→一番速い 改良案2.今まで求めた値を配列にぶち込んでおき、参照する再帰型→1.ほどではないが、 純粋な再帰型に比べると比べものにならないほど速い
if (n>1) return fibo0(n-1)+fibo0(n-2); return n; if文を減らした
933 :
デフォルトの名無しさん :04/12/24 10:03:29
>>931 原案のプログラムさえ組めないほどヘタレなので、
実際にプログラム書いていただかないとわかんないですorz
>>933 ぐぐれ。或いは過去ログを穴を開くほど探せ。
>>933 a_n = b_{n-1}
b_n = b_{n-1} + a_{n-1}
とおけば線形時間
この関係式を行列で書いて、その n 乗を
よく知られた logN のアルゴリズムに放り込めば対数時間
n乗を静的に求めると定数時間
最初から std::map につっこんだり、static な map をもって
一度計算した値を再利用するてもある(これはスレッドセーフでなくなるけど)
>>927 非再帰だとこんなかんじだな。
マイナスの値を渡すとアクセス違反になるとおもうけど。
int fibo1(int n)
{
int *f = malloc(sizeof(int)*n+1);
int i; f[0] = 0; f[1] = 1;
for(i=2; i<=n; i++) f[i] = f[i-2] + f[i-1];
return f[n];
}
>>930 もっと短くしてみました。
ビット演算って反則っぽい?
int fibo2(int n){return n&~1?fibo0(n-1)+fibo0(n-2):n;}
>>930 そのデクリメントの使い方は効果が未定義なんでは?
int fibo2(int n){return n/2?fibo0(n-1)+fibo0(n-2):n;} こうすればビット演算使わずにすむな。 1バイト短くなったし。
レスくださった方ありがとうございます。
でも自分のレベル低くてほとんど理解できてませんorz
>>937 で提出しようと思います。
全部配列に格納していたのは無駄な上にメモリの解放を忘れてたのを改良。 もう遅いかもしれんけど。 C99じゃないとコンパイルできないんで気をつけてな。 int fibo1(int n) { int b=0>=n?0:1; for(int i=2, a=0, c; i<=n; i++) { c=a; a=b; b+=c; } return b; }
946 :
デフォルトの名無しさん :04/12/24 14:04:48
英文を入力して、アルファベットa〜zの出現回数を表示するプログラムをお願いします。 大文字と小文字の区別はしなくていいです。言語はCです。
947 :
デフォルトの名無しさん :04/12/24 14:14:36
アルファベットの種類分、配列を用意して、対象の文字列を前から順番にチェッ クしながら、その配列にカウントするだけ。コーディングくらい自分でしろ! へなちょこ!
948 :
デフォルトの名無しさん :04/12/24 15:29:28
>>947 すいません、へなちょこの僕に作ってください。
初心者のボクで良ければ作る
>>946 これでよろしいか。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
int ch, count['z'-'a'+1], i;
memset(count, 0, sizeof(int)*('z'-'a'+1));
while(EOF != (ch=getc(stdin))) if(isalpha(ch)) count[(isupper(ch)?tolower(ch):ch)-'a']++;
for(i=0; i<'z'-'a'+1; i++) printf("%c : %d\n", 'a'+i, count[i]);
return 0;
}
今日Cの入門書買ってきた僕でよければ作る
仕事がうまくいかずに死にたい俺でよければ作る
953 :
デフォルトの名無しさん :04/12/24 16:06:32
(; ・`д・´) !? (`・д´・ (`・д´・ ;) ナ,ナンダッテ−!
Ctrl+Z (入力終了したからなんとかしろよボクのコンピューター!)
956 :
デフォルトの名無しさん :04/12/24 16:13:46
>>950 [(isupper(ch)?tolower(ch):ch)は単にtolower(ch)で平気。
tolowerに英大文字以外を渡しても何も起きない。
958 :
デフォルトの名無しさん :04/12/24 16:17:40
テキストファイルから文字列を読み込んでその文字列をバブルソートを使って短い順に表示するプログラムを教えてください。 言語はC言語です。
>>950 EOFですか。難儀ですね。多分入力待ちから進まないとか言われるよ
>>957 大文字でも小文字でもないのがきたとき、ガチンコファイトクラブ並にとんでもないことが
>>959 その前にisalphaしてるから大丈夫だな。
関数の仕様の確認不足。精進せねば。
>>959 tolowerへisupper(ch)で偽になる文字を渡したときに渡した文字をそのまま返さないのは規格違反。
そんなコンパイラ窓から投げ捨てろ。
Ctrl Z って SIGSTOP じゃないの?
>>962 結果的にDOS/Winではこれ以降stdinはEOFとなる。
聖夜に人の宿題をするのも(・∀・)イイ!!
>>946 ということで解。
#include <stdio.h>
#include <ctype.h>
int main(void){int a,b='z'-'a'+1,c['z'-'a'+1]={0},d;while ((a=getc(stdin))!=EOF
)if(isalpha(a))c[tolower(a)-'a']++;for(d=0;d<b;d++)printf("%c:%d\n",'a'+d,c[d])
;return 0;}
漏れ坊さんなのでクリスマス関係無し。
坊さんってプログラム関係あるのかな
>>965 もうちょい。
#include <stdio.h>
int main(void){int a,b[256]={0};while((a=getc(stdin))!=EOF)b[a]++;for(a='a';a<=
'z';a++)printf("%c:%d\n",a,b[a]+b[a+'A'-'a']);return 0;}
972 :
デフォルトの名無しさん :04/12/25 03:24:10
俺立てられなかった。誰かよろしく。
スレタイはぼる?それともさゆ?
俺に決まってるYO!
ノノ*^ω^)<もきゅえりりんがC/C++の宿題を片付けますよ?
ぼるくんが早かったのでぼるくんで立てました えりりんさんは今度がんばってください
立てようと思ったのに遅かった〜
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
>>968 クリスマスやってる坊さんは趣味でやってるのか
坊さんもあるんじゃないかな? いつだったか卒塔婆をプリンターで 書いてるのみたことあるぞ さすがに引いた
982 :
sonic :04/12/25 09:42:22
983 :
sonic :04/12/25 09:42:51
18
求む宿題age
よっつのすうじを10にするのって みかいけつじゃなかった? ひらがなすまそ。
988 :
デフォルトの名無しさん :04/12/25 17:39:51
すみません、マルチスレッドの機能をCの標準的な機能を使って実装するには どうすれば良いのでしょうか。
4つの数字を10にするのって難しいよね。 試行は無限にある訳だから、終了判定をどうすればいいのか・・・ 俺には分からん。
>>990 4桁の10進数のそれぞれの桁を四則演算した解が10になる数、という事でしょ。
>>991 だからさ、
1234ってあったら、無限回数計算できるでしょ。
1+2やったのに今度3足して、それに・・・って。
10に出来ないっていう判定はどうするの?
>>993 いったいどういうアルゴリズム考えているわけ?
1234 1*2*3*4/3+2 こういうのも含むと思ってるのかしら
>>997 あぁ、一つの数は1回か0回しか使えないって条件なのか。
了解。それなら出来る。
1000 :
デフォルトの名無しさん :04/12/25 18:25:23
おちまい
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。