C言語なら俺に聞け(入門篇) Part 20
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/10/15(月) 22:34:33・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 19
http://pc11.2ch.net/test/read.cgi/tech/1190342593/
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 97代目
http://pc11.2ch.net/test/read.cgi/tech/1191937213/
0002デフォルトの名無しさん
2007/10/15(月) 22:35:19Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1190331997/
0003デフォルトの名無しさん
2007/10/15(月) 22:37:06乙
>>2
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
0004デフォルトの名無しさん
2007/10/15(月) 22:48:13行数はいくつかの行数の違うファイルを取り入れるので
違いますが、列数は同じファイルです。Mとでもしましょうか
996 :デフォルトの名無しさん:2007/10/15(月) 21:50:49
ファイルから数値を読み取るとき、
その数値をに二次元配列にいれるとして
そこの二次元配列の最初の領域確保はどうするべきですか?
できるだけ領域を使わないとすると。
0005デフォルトの名無しさん
2007/10/15(月) 22:55:37ファイルのサンプルうp!
0006デフォルトの名無しさん
2007/10/15(月) 22:57:13最後にreallocで縮小すれば
0007デフォルトの名無しさん
2007/10/15(月) 22:58:48その数値は整数?小数?
それととりうる値の範囲がわかればどの型を使えばいいか決まる
あとファイルの先頭に列数や行数が書かれていれば領域確保が楽になるけどそういうのは無いんだよね?
00084
2007/10/15(月) 23:08:180.322 -0.025 -0.120 0.521 0.237 0.490 -0.202 -2.928 -4.003 1.254
0.634 -1.119 1.177 0.601 -0.482 -0.007
1: -18.858 1.046 -1.616 4.023 1.857 4.207 6.451 0.989 -3.807 0.744
2.020 -0.532 -0.124 0.566 0.415 0.174 -0.942 -3.092 -3.921 0.331
0.705 0.091 0.528 -0.378 -0.225 -0.009
2: -19.319 0.295 1.983 4.715 -2.581 -3.939 5.541 -1.169 -3.084 1.723
2.476 -2.182 -0.151 0.387 0.489 0.140 -0.311 -1.611 -3.145 -2.083
-0.260 0.625 -0.204 -0.429 0.494 -0.009
こういうファイルを取り入れて
小数点だけ取り入れる。「1:」とか「2:」とかが行の番号にしてるつもり
1行ごとに26個の数値がある。
ちなみにこのファイルは横に広げれば26個小数点の数値が並んでます
00094
2007/10/15(月) 23:09:2726というのは変わりません
0010デフォルトの名無しさん
2007/10/15(月) 23:10:4100114
2007/10/15(月) 23:15:29正直floatは使う価値なしだと思います
0012デフォルトの名無しさん
2007/10/15(月) 23:16:420013デフォルトの名無しさん
2007/10/15(月) 23:20:48float の有効桁数を知っているの?
できるだけ領域を使わないんじゃないの?
0014デフォルトの名無しさん
2007/10/15(月) 23:20:5600154
2007/10/15(月) 23:21:57とも思うんですけど。
一般的に>>8みたいな数値多いファイルは
どのように取り込むのがいんでしょうか?
0016デフォルトの名無しさん
2007/10/15(月) 23:26:55ほう
理由言ってみ?
00174
2007/10/15(月) 23:29:21検算するときには少数で計算するんだがその時に
floatでは表せなくなるから
00184
2007/10/15(月) 23:33:300019デフォルトの名無しさん
2007/10/15(月) 23:35:200020デフォルトの名無しさん
2007/10/15(月) 23:39:0700214
2007/10/15(月) 23:44:030022デフォルトの名無しさん
2007/10/15(月) 23:46:060023デフォルトの名無しさん
2007/10/15(月) 23:51:23計算途中や計算結果を入れる変数までfloatを使えとは言って無いだろうが。
それはdoubleでやればいい。
今問題になってるのはファイルから読み込んだ値を保持する方法だろ。
0024デフォルトの名無しさん
2007/10/16(火) 00:04:0900254
2007/10/16(火) 00:04:22まーfloatを使ってあるアルゴリズムの処理をしてて
その計算をfloatじゃ表示できなくなるのでdoubleで計算してたんすよ。
あとでその計算はlogでやるんだと聞かされて。
検算のためにdouble、logで処理するから処理はfloatで行えるように
変更してみます。
0027デフォルトの名無しさん
2007/10/16(火) 00:08:150028デフォルトの名無しさん
2007/10/16(火) 00:12:07できるだけ計算速度が欲しいって場合は、float型を取り扱う
float型を使う理由は、ズバリいってメモリの節約です。
また、メモリ転送量が少なくすむので、データ量が膨大なときは高速になることもあります。
と書いてある
0029デフォルトの名無しさん
2007/10/16(火) 00:13:50floatの計算はdoubleに変換される 計算後元に戻すから鈍い
利点は半分のメモリで住む
0030デフォルトの名無しさん
2007/10/16(火) 00:17:39そんなの鵜呑みにせず実測しろ
したのなら環境とソースコードを晒せ
0031デフォルトの名無しさん
2007/10/16(火) 00:18:420032デフォルトの名無しさん
2007/10/16(火) 00:19:49ということで自分の環境で測れ>>4
0033デフォルトの名無しさん
2007/10/16(火) 00:25:05ただ扱うファイルが非常に多いからfloatでいいかなー。
あるファイルを入力
2500個のファイルで検査、その出力結果が一番高いものが
入力のファイルと一致するかを見る。
それを3000回だよ。
ちなみに2500個のファイルの中身にまたファイル名が書かれてて
その中身のファイルの数値を取り入れるんだけどね。
0034デフォルトの名無しさん
2007/10/16(火) 00:27:450035デフォルトの名無しさん
2007/10/16(火) 00:36:12make,make,make,make
0036デフォルトの名無しさん
2007/10/16(火) 00:40:280037デフォルトの名無しさん
2007/10/16(火) 00:50:31かかれているという罠があるのは有名な話だな……
Cのfloatは遅いという話の出所。
もう昔の話だったか……
0038デフォルトの名無しさん
2007/10/16(火) 01:06:31C++ではルールが違うけれども。
0039デフォルトの名無しさん
2007/10/16(火) 01:08:06最近C言語をやりはじめたんだが、gccを入力するとバッチファイルとして認識されてないって出るんだ
環境変数もいじってみたがよくわからない
教えてくださいエロい人
0040デフォルトの名無しさん
2007/10/16(火) 01:13:220041デフォルトの名無しさん
2007/10/16(火) 01:14:40あれがちょっといや。
コンパイルされたのはわかったけどダラダラと書きやがってと。
エラーでるときはcc -c file.cとかと一緒にでるし。
0042デフォルトの名無しさん
2007/10/16(火) 01:15:24環境変数PATHを直せば良いんじゃないか?
0043デフォルトの名無しさん
2007/10/16(火) 01:17:450044デフォルトの名無しさん
2007/10/16(火) 01:22:06ttp://ja.uncyclopedia.info/wiki/%E3%82%B0%E3%82%B0%E3%83%AC%E3%82%AB%E3%82%B9
0045デフォルトの名無しさん
2007/10/16(火) 01:23:05詳しいこと書かなくてごめん
OSはWindowsXP
gccはそのままだよ。コマンドプロンプト開いて、gccでファイル実行しようとすると
“gcc”は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。ってでる
そんでググってみて環境変数のpathに含まれてないからってでたからちょこちょこ環境変数いじってみたけど駄目だった
説明下手くそですまん
0046デフォルトの名無しさん
2007/10/16(火) 01:26:170047デフォルトの名無しさん
2007/10/16(火) 01:26:46ちょこちょこじゃなくてしっかりいじってこい
そうしてhelloworldくらい実行できるようになってからこのスレにこい
0048デフォルトの名無しさん
2007/10/16(火) 01:29:5710GB削ってLINUXいれたら
すぐ使えます
0049デフォルトの名無しさん
2007/10/16(火) 01:34:58そうだよな…ありがとう
でもググッてみてもいじり方がよくわからないんだ
何十回も変更してみたけど駄目だった
もうちょっと頑張ってみる
>>48
ありがとう
それも試してみる
0050デフォルトの名無しさん
2007/10/16(火) 01:36:580051デフォルトの名無しさん
2007/10/16(火) 01:55:130052デフォルトの名無しさん
2007/10/16(火) 03:43:10@echo off
del /F /Q %*
0053デフォルトの名無しさん
2007/10/16(火) 03:44:27もしかしてUNIXバイナリをWindowsに持って来て動かそうとしてないか?
Windowsネイティブでgcc動かすのは結構敷居が高いぞ?
おとなしくCygwin使うか、Windows限定で良いならMSVC++2005Expressやbccのほうがラク。
0054デフォルトの名無しさん
2007/10/16(火) 11:06:11>floatの計算はdoubleに変換される 計算後元に戻すから鈍い
>>38
>Cには暗黙の昇格ルールというものがあってだな。float=float+floatはfloadt=(float)((double)float+(double)float)なのよ。
真っ赤な嘘乙。
整数型の場合と違って、実数型は(c89ですら)単精度同士の演算が認められている。
>>34
>floatの方がSSEの最適化が効く
常にそうではないが、可能性が高いとはいえるね。
>37
>C言語の浮動小数点はライブラリの関数がすべてdoubleで
>かかれているという罠があるのは有名な話だな……
C99にはmath.hの全ての関数にfloat版が用意されている。そのお蔭か、本来ない筈のC++でも使えることが多い。
>Cのfloatは遅いという話の出所。
いや、藤原の翁によると、あくまで関数は副次的としていて、実数演算がdoubleで実装されているのが理由だとしているようだ。
0055デフォルトの名無しさん
2007/10/16(火) 12:10:15#include<stdio.h>
#include<time.h>
#define N 50000000
floatloop(){
int i,c=clock();float r=1.0;
for( i=0 ; i<N ; i++ ){r *= 2.5;r/=2.5;r+=1.001;r-=1.001;}
c=clock()-c;printf( "float %dmsec value %f\n", c ,r);}
doubleloop(){
int i,c=clock();double r=1.0;
for( i=0 ; i<N ; i++ ){r *= 2.5;r/=2.5;r+=1.001;r-=1.001;}
c=clock()-c;printf( "double %dmsec value %f\n", c, r);}
main(){ floatloop();doubleloop();}
0056デフォルトの名無しさん
2007/10/16(火) 12:16:41#include<stdio.h>
#include<time.h>
#include<math.h>
#define N 5000000
floatloop(){
int i,c=clock();float r=10.0;
for( i=0 ; i<N ; i++ ){r=log(r);r=exp(r);r=pow(r,2);r=sqrt(r);}
c=clock()-c;printf( "float %dmsec value %f\n", c ,r);}
doubleloop(){
int i,c=clock();double r=10.0;
for( i=0 ; i<N ; i++ ){r=log(r);r=exp(r);r=pow(r,2);r=sqrt(r);}
c=clock()-c;printf( "double %dmsec value %f\n", c, r);}
main(){ floatloop();doubleloop();}
0057デフォルトの名無しさん
2007/10/16(火) 12:19:160058デフォルトの名無しさん
2007/10/16(火) 12:21:45すると今のCPUは、doubleもfloatも入っているのか?
0059デフォルトの名無しさん
2007/10/16(火) 12:42:15素朴な疑問だが、最適化掛けるとループの中身が消えそうだがコンパイラとオプションは?
# まぁ、floatが速いと言うことには同意だが。
>>56
うーん、こっちは辻褄が合わないなあ。コンパイラとオプションはどうなっている?
# 関数を適切に呼び出しているなら、float ⇔ doubleの変換が頻繁に入るから遅くなる筈なんだ。
>>57
大丈夫、今時のCPUはfloatでも計算可能だ。
>>58
そそ、そういうこと。
実際、加減算、乗算は速度的にビット幅は余り影響しない。まして除算はビット幅が広いほど確実に遅くなる。
0060デフォルトの名無しさん
2007/10/16(火) 13:08:44それならそれで、floatの方が速いのも納得。尤も、初期のXeonでは有意差が得られなかったけれど。
# gcc(3.4.6)使用。オプションは -O3 -msse2 -lm、-msse2は事実上影響なかった。
0061デフォルトの名無しさん
2007/10/16(火) 14:04:37普通のエディタじゃできないんですか?
コンパイラがよく分からなくて何かできないんですけど。
0062デフォルトの名無しさん
2007/10/16(火) 14:08:19コードを書くだけならどんなエディタでも構わないと言えば構わない。
コンパイラにVisualStudioのような統合環境を使うのなら、ビルトインのエディタを使うのが無難だと思う。
コンパイラにbccやlsicを使うのはよした方がいい。
コンパイラにgccを使うのならコマンドライン環境そのものの使い方にも慣れる必要がある。
まぁもっとも、一部の天才のように読むだけで勉強できるのならエディタもコンパイラも要らないわけだが。
0063デフォルトの名無しさん
2007/10/16(火) 14:09:09でも初心者は、BCC developerつかっとけ
0064BCC Developer導入法
2007/10/16(火) 14:15:01http://www.codegear.com/jp/downloads/free/cppbuilder
へ行って
Borland C++Compiler / Turbo Debugger Windows 5.5 8.85 MB
をクリックして、必要事項を記入してファイルを落とす
落としたら、メールで送られてきたパスワードを入力してインストールする
デバッガをインストールするときのパスワードは ReadmeInstall.txt に書いてある
つぎに BCC Developerをインストールする 下をダウンロードする
http://www.vector.co.jp/soft/dl/win95/prog/se180695.html
http://www.cmagazine.jp/download/setbcc15b.exe
解凍したフォルダをbccdevに名前を変更して、C:\borlandへ移動する
一方でsetbcc.exeを起動して、すすむを5回押して設定を押す
その後、C:\borland\をbccdev\BccDev.exeを起動して
コンパイラ C:\borland\bcc55\Bin\bcc32.exe
デバッガ C:\borland\bcc55\Bin\TD32.EXE
を入力して設定ボタンを押す
ファイル→新規作成 を選んで、ディレクトリは、C:\borland\bccdev、プロジェクト名はtestとしokボタンを押す
再び、ファイル→新規作成 を選び、ファイル名のところへhello.cppを入力してokボタン
#include<stdio.h>
int main( ){
printf( "Hello world!\n" );
return 0;}
をコピペして、プロジェクト→メイクしてMake End!!が出ればコンパイル成功
次に実行→実行してHello world!がDOS画面に出れば成功
0065デフォルトの名無しさん
2007/10/16(火) 14:26:23これじゃできませんか?
0066デフォルトの名無しさん
2007/10/16(火) 14:27:240067デフォルトの名無しさん
2007/10/16(火) 14:29:28>62は無視ですか?
0068デフォルトの名無しさん
2007/10/16(火) 14:32:08BCC Developerは無料で簡単
0069デフォルトの名無しさん
2007/10/16(火) 14:34:090070デフォルトの名無しさん
2007/10/16(火) 14:40:53すみません、よく分からなくて。
0071デフォルトの名無しさん
2007/10/16(火) 14:41:450072デフォルトの名無しさん
2007/10/16(火) 14:42:330073デフォルトの名無しさん
2007/10/16(火) 14:46:260074デフォルトの名無しさん
2007/10/16(火) 14:46:57このサイトの勉強をしたいんですけど。
できますか?
0075デフォルトの名無しさん
2007/10/16(火) 14:46:590076デフォルトの名無しさん
2007/10/16(火) 14:49:16BCC Developerでできるが、そのサイトは勉強にむいていない 質が良くない
0077デフォルトの名無しさん
2007/10/16(火) 15:04:36http://hp.vector.co.jp/authors/VA001944/c-begin/text01.html
http://effy.ldw.jp/c/index.html
0078デフォルトの名無しさん
2007/10/16(火) 15:08:28できますか?って…自分の頭のことを他人に聞くなよw
0079デフォルトの名無しさん
2007/10/16(火) 15:12:380080デフォルトの名無しさん
2007/10/16(火) 15:12:42後者は兎も角、前者はLSI-C86を使っている時点でアナクロに過ぎると思う。
0082デフォルトの名無しさん
2007/10/16(火) 15:14:560083デフォルトの名無しさん
2007/10/16(火) 15:15:35皆さんありがとうございます。
0084デフォルトの名無しさん
2007/10/16(火) 15:23:01私も間違いを指摘するメールを出したが改めるどころか返事もなかった。
0085デフォルトの名無しさん
2007/10/16(火) 16:06:18C++でもISO/IEC 14882:2003 (X3014:2003)では、
float版とlong double版がdouble版の関数名で多重定義されている。
ほげfとかほげlみたいな関数はないことになっているだろうけど。
0086デフォルトの名無しさん
2007/10/16(火) 16:35:58[2] 問題文(含コード&リンク):マージソート
merge(data1,n1,data2,n2,data3)を使い,merge_sort(data1,n,data2)を作成せよ。
関数の再帰的定義(?)というものを使って作成するみたいです。注:nへはdata1の要素数(整数型)を代入する。
注:data2はdata1を整列した配列とする。
用意された整数値データ int data[20]={9,10,8,7,6,20,-4,8,9,11,5,15,-7,12,23,3,24,-11,30,6}
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:? 学校ではktermでcc [ファイル名]とやっています
[3.3] 言語:C
[4] 期限: ([200?年10月17日24:00まで]
[5] その他の制限:merge()は自分で作りました。
#define N 10
void merge(int data1[], int n1, int data2[], int n2, int data3[]){
int index1, index2, index3, i;
index1 = index2 = index3 = 0;
while(index1 < n1 || index2 < n2){
if(index1 < n1 && index2 < n2){
(data1[index1] >= data2[index2])?(data3[index3++] = data1[index1++])
:(data3[index3++]=data2[index2++]);
for (i=0; i<(2*N) ;i++)
printf("%d,", data3[i]);
printf("\n");}
else if(index1 < n1){
for (;index1 < n1 ;index1++)
data3[index3++] = data1[index1]; }
else {for( ; index2 < n2 ; index2++)
{data3[index3++] = data2[index2];}}
}
}
0087デフォルトの名無しさん
2007/10/16(火) 16:39:32提出期限は明日までですが、ここまで頑張ったならしっかり理解して終わりたいです。
期限すぎてからでもいいのでどなたかお願いします。。
コンパイルエラーが出るので使えませんが一応自分の作り書けたものも載せておきます。
もし構想みたいなのはよければどこがダメなのか教えてもらえれば明日頑張って続き作ります><
void merge_sort(int data1, int n, int data2)
{
int i,j, cut = n / 2;
if ( cut > 0 ){
int samp_left[cut],samp_right[n - cut];
for( i = 0 ; i < cut ; i++)
samp_left[i] = data1[i];
for( i = cut ; i > n ; i++ )
samp_right[i]=data1[i];
if( n != 2 ){
merge_sort(samp_left,cut,data2);
merge_sort(samp_right,n - cut ,data2);
}
}
merge(samp_left,cut,samp_right,(n - cut),data2);
}
0088デフォルトの名無しさん
2007/10/16(火) 16:55:17C/C++の宿題を片付けます 97代目
http://pc11.2ch.net/test/read.cgi/tech/1191937213/l50
0089デフォルトの名無しさん
2007/10/16(火) 17:27:20とりあえずぱっと見ておかしいところ……
>void merge_sort(int data1, int n, int data2)
data1とdata2は配列だから、int data1[]とかint *data2とかやらないと。
>for( i = cut ; i > n ; i++ )
継続条件の不等号が逆だと思う
>samp_right[i]=data1[i];
iがcutから始まってるから、samp_rightの添え字がずれちゃうね
足し引きして調整しないと
>meege_sort(samp_left,cut,data2);
>merge_sort(samp_right,n - cut ,data2);
merge_sortの第三引数は結果を受け取る変数だから、
双方ともにdata2に受け取ったら上書きされちゃうと思う。
meege_sort(samp_left,cut,samp_left);みたいにして同じ配列で受け取るか、
sorted_leftとかの配列を新たに宣言して、それを第三引数に指定すべき。
>merge(samp_left,cut,samp_right,(n - cut),data2);
もしsorted_leftとかを新たに作るんだったら、ここの引数も直す
そうでないならこのままでいい
大筋としては特に考え方が間違ったりはしてないと思うよ
今は携帯だからこれ以上無理
>>88
丸投げしたいわけでもないみたいだし、いんじゃね
何で宿題スレのテンプレ使ってるのか知らんけど
0090デフォルトの名無しさん
2007/10/16(火) 17:33:35LIBファイルを使って最初からリンクしてしまうパターンでしょうか?
それともLoadLibraryで随時リンクするパターンでしょうか?
009189
2007/10/16(火) 17:37:31cut==0のとき(n==1のとき)、samp_leftとかが宣言されてないからmerge関数を呼び出すとこでエラーが出る
とりあえずの対処法としては、mergeをifブロックに押し込んで、
n==1 (cut==0)の時はdata2にそのままデータを入れる
0092デフォルトの名無しさん
2007/10/16(火) 17:38:22スタティックリンクだとDLLのバージョンで悩まなくて済む
0093デフォルトの名無しさん
2007/10/16(火) 17:44:33スコープが……
0094デフォルトの名無しさん
2007/10/16(火) 17:57:32ビルドに失敗してしまいます。何故なのでしょうか?
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
return 0;
}
エラー 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup MSVCRTD.lib
エラー 2 fatal error LNK1120: 1 unresolved externals C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\test\Debug\test.exe
0095デフォルトの名無しさん
2007/10/16(火) 18:01:43Windowsアプリを作るなら、コンパイルオプション設定する必要があるんじゃないか。
VCは知らんが、例えばBorlandなら「-W」とか。
0096デフォルトの名無しさん
2007/10/16(火) 18:05:53プロジェクトの設定を変えたら動きました。ありがとうございます
0097デフォルトの名無しさん
2007/10/16(火) 18:23:120098デフォルトの名無しさん
2007/10/16(火) 20:02:52marge関数内ではdata1[],data2[]は読み込みしかしていないから
>merge_sort(samp_left,cut,data2);
>merge_sort(samp_right,n - cut ,data2);
は
merge_sort(data1,cut,samp_left);
merge_sort(data1 + cut,n - cut ,samp_right);
としてもいいと思う。
(merge関数がブラックボックスなら宣言にconstついてない時点で却下だけど)
あとC言語だと配列宣言時の要素数指定に変数が使えないから
>int samp_left[cut],samp_right[n - cut];
はだめだと(C++では通ってしまう)
int *samp_left,*samp_right;
samp_left = malloc(cut*sizeofint));
samp_right = malloc((n-cut)*sizeofint));
として当然merge呼び出した後
free(samp_left);free(samp_right);
とする。
0099デフォルトの名無しさん
2007/10/16(火) 22:57:09INT_MAX + 1.0 にすると、2147483648.000000 と出て、エラーが出ません。
double型はどこまで値を扱えるのか誰か教えてくださいませんか?
0100デフォルトの名無しさん
2007/10/16(火) 22:58:10T data;
node *left;
node *right;
};
void deletetree(node *t){
if(t==NULL)return;
deletetree(t->left);
deletetree(t->right);
delete t;
}
void deletetree(node *t){
node *route[1024];
node *p,q;
int n=0;
for(p=t;){
while(q=t->left;q!=NULL;q=q->left){route[n]=p;n++}
delete p;
}
}
0101デフォルトの名無しさん
2007/10/16(火) 22:58:540102デフォルトの名無しさん
2007/10/16(火) 23:08:42DBL_MAX まで
DBL_MAX は float.h で定義されている
0103デフォルトの名無しさん
2007/10/16(火) 23:29:39953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304
583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
こんな数が得られましたw
ありがとうございます
0104デフォルトの名無しさん
2007/10/17(水) 03:18:10別のコンパイラから利用できることってあるんですか?
0105デフォルトの名無しさん
2007/10/17(水) 03:21:060106デフォルトの名無しさん
2007/10/17(水) 03:28:420107デフォルトの名無しさん
2007/10/17(水) 05:49:34LSI C-86というのの設定がわからず、Borland C++ Compiler 5.5 ってのも
落とせるところのリンクが死んでます・・・手っ取り早くコンパイルするにはどうすればいいでしょうか
0108デフォルトの名無しさん
2007/10/17(水) 07:38:10http://www.forest.impress.co.jp/lib/stdy/program/progdevenv/
VC2005ExpressかTurboC++ExpressをDLすればよし。どちらもコマンドラインでコンパイル可能。
0109デフォルトの名無しさん
2007/10/17(水) 08:40:31Borland C++Compiler 5.5
http://www.borland.com/jp/products/cbuilder/freecompiler.html
ここのダウンロード、まったく反応ありませんね〜。
昨日からC言語をはじめた者ですが、どこかにミラーサーバ
ありませんか??
0110デフォルトの名無しさん
2007/10/17(水) 08:53:02ttp://www.codegear.com/jp/downloads/free/cppbuilder
0111デフォルトの名無しさん
2007/10/17(水) 13:41:44インストールしても実行ファイルがなくてどうすればいいのやら
0112BCCはこれよめ
2007/10/17(水) 14:02:15http://www.codegear.com/jp/downloads/free/cppbuilder
へ行って
Borland C++Compiler / Turbo Debugger Windows 5.5 8.85 MB
をクリックして、必要事項を記入してファイルを落とす
落としたら、メールで送られてきたパスワードを入力してインストールする
デバッガをインストールするときのパスワードは ReadmeInstall.txt に書いてある
つぎに BCC Developerをインストールする 下をダウンロードする
http://www.vector.co.jp/soft/dl/win95/prog/se180695.html
http://www.cmagazine.jp/download/setbcc15b.exe
解凍したフォルダをbccdevに名前を変更して、C:\borlandへ移動する
一方でsetbcc.exeを起動して、すすむを5回演氓オて設定を押bキ
その後=AC:\borland\をbccdev\BccDev.exeを起動して
コンパイラ C:\borland\bcc55\Bin\bcc32.exe
デバッガ C:\borland\bcc55\Bin\TD32.EXE
を入力して設定ボタンを押す
ファイル→新規作成 を選んで、ディレクトリは、C:\borland\bccdev、プロジェクト名はtestとしokボタンを押す
再び、ファイル→新規作成 を選び、ファイル名のところへhello.cppを入力してokボタン
#include<stdio.h>
int main( ){
printf( "Hello world!\n" );
return 0;}
をコピペして、プロジェクト→メイクしてMake End!!が出ればコンパイル成功
次に実行→実行してHello world!がDOS画面に出れば成功
0113デフォルトの名無しさん
2007/10/17(水) 14:09:45コンパイラ自体はただのソフトなんだからそれぐらい自分で解決できるようになっておけ
0114デフォルトの名無しさん
2007/10/17(水) 15:37:49ありがとうございました!
無事Win95で起動させました!
このPCの余生の用途が決まりました。
0115デフォルトの名無しさん
2007/10/17(水) 15:50:58実行ファイルが無いって……
インストール先をちゃんと見てみたのか?
0116デフォルトの名無しさん
2007/10/17(水) 15:52:05PATHを通せば
0117998
2007/10/17(水) 19:19:02ポインタの取り扱いミスとの指摘を受けたものです。
ポインタ勉強したのですが、イマイチ分かりません。
数値計算用プログラムで配列の要素をかなりたくさん使っているのですが、
それも原因として挙げられますか?
0118デフォルトの名無しさん
2007/10/17(水) 19:20:13数字、文字、それ以外の1つの文字列を入力し入力後に
その文字列を数字、文字、それ以外の各配列に分けそれぞれの内容を
表示するプログラムなのですが
int i, suji_cnt = 0, moji_cnt = 0 ,kigou_cnt =0;
char str[NUM],suji[NUM],moji[NUM],kigou[NUM];
printf("Input:");
scanf("%s",&str);
for(i=0; str[i] != '\0';i++){
if(str[i]>='0' && str[i]<='9'){
suji[suji_cnt++] = str[i];
}
else if(str[i]>='a' && str[i]<='z'){
moji[moji_cnt++] = str[i];
}
else{
kigou[kigou_cnt++] = str[i];
}
}
printf("数字: %s Input Length : %d\n", suji,suji_cnt);
printf("文字: %s Input Length : %d\n", moji,moji_cnt);
printf("それ以外: %s Input Length : %d\n", kigou,kigou_cnt);
return 0;
}
と書くと表示されるとき最後のほうで変な記号?
みたいなものも表示されるのですがどこがおかしいのでしょうか?
よろしくお願いします。
0119デフォルトの名無しさん
2007/10/17(水) 19:22:560120デフォルトの名無しさん
2007/10/17(水) 19:30:34文字列を'\0'で終わらせてないから。
0121119
2007/10/17(水) 19:33:10反転の他に、(+)にする、(-)にする方法もあれば教えて頂きたいです。
数値は signed前提です。
0122119
2007/10/17(水) 19:42:44なんとか解決できたかも知れません。
符号を反転させるには、
x *= -1;
でき、
if( x < 0){
x *= -1;
}
------------
if( x > 0){
x *= -1;
}
で、できそうです。
もっとスマートな方法があれば教えて頂きたいです。
よろしくお願いします。
0123デフォルトの名無しさん
2007/10/17(水) 19:43:33ありがとうございます。
解決できました。
0124デフォルトの名無しさん
2007/10/17(水) 19:51:30x = x * x / x;
とかでできるんでない?多分
0125124
2007/10/17(水) 19:52:50今の無しにしてorz
0126デフォルトの名無しさん
2007/10/17(水) 19:56:38ソースうp!
0128デフォルトの名無しさん
2007/10/17(水) 19:59:27数値計算の速度がシビアじゃないところなら >>122 よりも
x=-x;
x=abs(x);
x=-abs(x);
が分かりやすい (オレはね)
0129デフォルトの名無しさん
2007/10/17(水) 20:08:56むしろ乗算を使わない128のほうが速い気がする。
0130デフォルトの名無しさん
2007/10/17(水) 20:11:470131デフォルトの名無しさん
2007/10/17(水) 20:18:07#include <time.h>
#include <math.h>
#define N 500000000
using namespace std;
f0(){int x=10,n,c;
c=clock();for(n=0;n<N;n++)x=-x;c=clock()-c;
cout << x<<" "<<c<<endl;}
f1(){int x=10,n,c;
c=clock();for(n=0;n<N;n++)x=abs(x);c=clock()-c;
cout << x<<" "<<c<<endl;}
f2(){int x=10,n,c;
c=clock();for(n=0;n<N;n++)if(x>0)x=-x; else x=-x;c=clock()-c;
cout << x<<" "<<c<<endl;}
main(){
f0();f1();f2();}
0132デフォルトの名無しさん
2007/10/17(水) 20:20:20a = rand() これをいじって10以下でランダムとかにしたいのですが・・
0133デフォルトの名無しさん
2007/10/17(水) 20:27:080134デフォルトの名無しさん
2007/10/17(水) 20:34:22rand()%10 // 0〜9 までの乱数
rand()%11 // 0〜10 までの乱数
0135デフォルトの名無しさん
2007/10/17(水) 20:45:02#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int lower = 1, upper = 10;
srand((unsigned int)time());
fprintf(stdout, "%d", rand_xtoy(lower, upper));
return 0;
}
int rand_xtoy(int lower, int upper) {
return rand() / (INT_MAX + 1.0) * upper + lower;
}
0136デフォルトの名無しさん
2007/10/17(水) 20:55:26誤解しそうな関数
rand_xtoy( 9 , 10 ) が返す値の範囲は?
0137デフォルトの名無しさん
2007/10/17(水) 21:12:55サッカー見ながら書いたら間違ったw
int rand_xtoy(int lower, int upper) {
return rand() / (INT_MAX + 1.0) * (upper - lower + 1) + lower;
}
0138137
2007/10/17(水) 22:02:12int rand_xtoy(int lower, int upper) {
return rand() / (RAND_MAX + 1.0) * (upper - lower + 1) + lower;
}
0139998
2007/10/17(水) 23:01:00ごめんなさい。
ソースはうpできないんです。
0140デフォルトの名無しさん
2007/10/17(水) 23:17:53バッファオーバーフローにより、
書き換えてはいけないところが書き換えられているか、
未初期化のポインタを操作している可能性が高いです
0141デフォルトの名無しさん
2007/10/17(水) 23:43:32「fopenでエラーが出る」と判明しているのなら、
ファイルオープンに失敗したNULLポインタを使ってるんじゃないの?
0142デフォルトの名無しさん
2007/10/18(木) 00:55:45makeかけたら結構の行いくんだよね。
1つのファイルに2、3個の関数書くもの?
0143デフォルトの名無しさん
2007/10/18(木) 01:18:2520行めの関数プロトタイプ
void fileinput(char [][],int );
どういうエラーですか?
0144デフォルトの名無しさん
2007/10/18(木) 01:30:44配列の要素数を省略できるのは最初の [ ] だけ。
void fileinput(char [][10],int );
とかにする必要がある。10 かどうかは知らんが。
0145デフォルトの名無しさん
2007/10/18(木) 01:40:41>void fileinput(char [][],int );
二次元配列を受け取る時は、一次元目の要素数を指定しなければならない
void catch_two_dimensions_array(char s[][5] , int n){
int i;
for(i=0; i<n; i++) printf("%s",s[i]);
}
int main(){
char str[3][5] == {"hoge" , "hage" , "func"};
catch_two_dimensions_array(str , 3);
return 0;
}
なお、
void catch_two_dimensions_array(char (*s)[5] , int n);
としてもおk(結局同じこと)
0146デフォルトの名無しさん
2007/10/18(木) 01:47:52分岐しないで絶対値をとる方法です。(普通使いません)
int abs(int x) /* |x| */
{
int mask = x >>(CHAR_BIT*sizeof(int)-1);
return (x + mask)^mask;
}
int minus_abs(int x) /* -|x| */
{
int mask = x >>(CHAR_BIT*sizeof(int)-1);
mask = ~mask;
return (x + mask)^mask;
}
0147デフォルトの名無しさん
2007/10/18(木) 02:06:501ライナーな符号変転(整数限定、マクロで書いてみた)
#define NEGATIVE(x) (~x+1)
これは有名だと思う。
0148デフォルトの名無しさん
2007/10/18(木) 02:42:081ファイルに関数1つなんて規則はない。
ある程度同じ関連のものは1ファイルにまとめた方が管理もしやすいと思う。
そのあたりは書いた人のセンスだろうが…。
1ファイル1関数にすると1関数の行数が多くなりがちと読んだことがあるが
本当なのかなぁ
0149デフォルトの名無しさん
2007/10/18(木) 02:44:13int kansuu(int a, int b, char *c){
という風に書きますよね。
これを
int kansuu(a, b, c)
int a;
int b;
char *c;
{
と書き換えることができると聞いたのですが、コンパイルが通りません。
後者の書き方は一般的ではないのでしょうか?
0150デフォルトの名無しさん
2007/10/18(木) 02:46:31Cでは出来るがC++では無理だったかと
0151デフォルトの名無しさん
2007/10/18(木) 02:51:300152デフォルトの名無しさん
2007/10/18(木) 07:13:56あったら教えてくれ
0153デフォルトの名無しさん
2007/10/18(木) 07:30:13現在の時刻: 7:28:12.80
新しい時刻を入力してください:_
と表示されます。
0154デフォルトの名無しさん
2007/10/18(木) 07:33:05.\time
.\time.exe
0155デフォルトの名無しさん
2007/10/18(木) 07:53:16ありがとうございます。実行できました。
0156デフォルトの名無しさん
2007/10/18(木) 08:48:38C言語作成当初からあったのでしょうか?
(自分の環境がC99な為、C89等他の環境でもビルドできるか知りたいです)
0157デフォルトの名無しさん
2007/10/18(木) 08:50:570158デフォルトの名無しさん
2007/10/18(木) 14:17:05大丈夫、C99でもできない。恐らくgccの拡張だろ。
0159デフォルトの名無しさん
2007/10/18(木) 14:38:12C++でなおかつ関数じゃなくてクラスor構造体or共同体なら宣言できるが…。
gcc拡張使ってないから分らない…
(ヲイヲイ)
0161デフォルトの名無しさん
2007/10/18(木) 16:04:49gccの拡張。
また、gccでも、CではできるがC++ではできない。
例:
void func(int x[], int y[], int n)
{
int i;
double average(int x, int y){
return (x + y) / 2;
}
for(i = 0;i < n;i++)
printf("%d\n", average(x[i], y[i]));
}
みたいな感じで使う(例が悪くてすまん)
0162デフォルトの名無しさん
2007/10/18(木) 16:25:47カプセル化したいんならC++でやるべきだろ
0163デフォルトの名無しさん
2007/10/18(木) 19:29:200164デフォルトの名無しさん
2007/10/18(木) 19:36:17if(b==0.0 || a%b!=0.0)
{
}
がコンパイル通らないんですが、doble型の%演算は
0165デフォルトの名無しさん
2007/10/18(木) 19:36:48double a,b;
if(b==0.0 || a%b!=0.0)
{
}
がコンパイル通らないんですが、double型の%演算はできないんですか?
0166デフォルトの名無しさん
2007/10/18(木) 19:41:08浮動小数点数の比較で ==, != を使うのはどうかと思うがな。
0167デフォルトの名無しさん
2007/10/18(木) 19:41:19ないです。fmod関数を使ってください
0168デフォルトの名無しさん
2007/10/18(木) 19:43:200169デフォルトの名無しさん
2007/10/18(木) 19:46:270170デフォルトの名無しさん
2007/10/18(木) 19:49:21Fortran
0171デフォルトの名無しさん
2007/10/18(木) 20:22:15int main (void)
{
int a=0xFFFA;
printf("%d,%p",a,&a);
return 0;
}
仮に&aのアドレスが0012FF88だった場合に
1バイト目(FA)は0012FF88ですが、
int aの2バイト目(FF)のアドレス 0012FF89を
得るにはどうしたらいいでしょうか?
0172デフォルトの名無しさん
2007/10/18(木) 20:32:35#include<stdio.h>
int main(void){
int a=0xFFFA;
printf("%d,%p\n", a, &a);
printf("%p\n", (char*)&a+1);
return 0;
}
0173デフォルトの名無しさん
2007/10/18(木) 20:37:14Windows(Intel)の場合はこうでなかったかな?
0012FF88 00
0012FF89 00
0012FF8A FA
0012FF8B FF
0174デフォルトの名無しさん
2007/10/18(木) 20:39:01#include <stdio.h>
struct int_filter{
char byte[sizeof(int)/psizeof(char)];
};
int main (void)
{
int a=0xFFFA;
struct int_filter *f;
f = (struct int_filter *)&a;
printf("a:value->%d,address->%p",a,&a);
printf("filter:[0]->%p,[1]->%p,[2]->%p,[3]->%p"f->byte,f->byte+1,f->byte+2,f->byte+3)
return 0;
}
0175デフォルトの名無しさん
2007/10/18(木) 20:41:140176173
2007/10/18(木) 20:42:23無視してくださいw
0177171
2007/10/18(木) 20:48:12できた〜〜〜ありがとうございます。
>>174
174さんのコピーして貼り付けたんですが、
コンパイルできませんでした。
初心者なのでソースが難しすぎてどこを直せばうごくかさっぱりですが
どうもありがとうです。
0178デフォルトの名無しさん
2007/10/18(木) 20:56:25sizeof(int)==4なら
0x00FFFAは
FA,FF,00,00 でしょIntel系なら。
00,00,FF,FA の順ががモトローラ系(スペル忘れちった)
0179デフォルトの名無しさん
2007/10/18(木) 21:21:570180デフォルトの名無しさん
2007/10/18(木) 21:51:54>>174のヤツ。
psizeof→sizeofのタイプミス
2つ目のprintf、閉じる方の「"」の後ろに「,」が無い。文の最後に「;」がない。
ミス自体は初心者レベルのモンだな。
まぁどうでも良いけどな・・・
0181デフォルトの名無しさん
2007/10/18(木) 22:35:06#include <stdio.h>
#define MAX_SIZE 30
int stack[MAX_SIZE];
int sp = 0;
void push( int x )
{ stack[sp] = x;
sp++;}
int pop(void)
{ int x;
x = stack[sp-1];
sp--;
return x;}
〜スタックが空か判定(省略)〜
0182デフォルトの名無しさん
2007/10/18(木) 22:36:16{ int i;
printf( "size = %2d:", sp );
for( i = 0; i < sp; i++ ){
printf( " %4d", stack[i] );
}
printf( "\n" );
}
int main()
{
push( 1 ); show();
push( 2 ); show();
push( 3 ); show();
printf( "pop: %4d\n", pop() );
printf( "pop: %4d\n", pop() );
printf( "すべてpopします...\n" );
while( !is_empty() ){
printf( " %4d", pop() );
}
return 0;
}
スタックの内容を少しずつ表示していくものなんですが、
これだとpush関数とpop関数の所は場合によっては危ないよ、と言われました。
ポインタとか使ったほうが良いんでしょうか?
危ない、の意味すらわかりません。分かる人居たら教えてください。
0183デフォルトの名無しさん
2007/10/18(木) 22:39:550184デフォルトの名無しさん
2007/10/18(木) 22:40:20たとえばpushしてないのにいきなりpopするとか
0185デフォルトの名無しさん
2007/10/18(木) 22:44:34>>181
ようするにMAX_SIZE以上pushしようとしたときと、
空の時にpopしようとしたときにまずい。
0186デフォルトの名無しさん
2007/10/18(木) 22:48:17なら俺も黙っとく。
0187デフォルトの名無しさん
2007/10/18(木) 22:48:19pushする時にはオーバーフローしないか(配列から溢れないか)、
popの時にはスタックが空でないかチェックするのは鉄則
pushなら
if(sp < MAX_SIZE)
popなら
if(sp > 0)でチェックすればいい
0188186
2007/10/18(木) 22:50:080189181
2007/10/18(木) 22:58:36危ない、ってそれのことだったんですね。
push関数で最大値以上にpushしたらどうなるのか、エラー出てないし
まあ良いかと思ってたんですが、油断していました。
(181の最後で「空かどうか判定」の部分は省略しましたが、
そこのことだと思ってました。)
自分でちょっと直してみます。
0190デフォルトの名無しさん
2007/10/19(金) 06:02:19int main(){
char *str="test";
str[1]='s';
printf("%s\n",str);
return 0;
}
これを試してみたのですが、何も表示されません。
どこが問題なのでしょうか?
0191デフォルトの名無しさん
2007/10/19(金) 06:10:360192デフォルトの名無しさん
2007/10/19(金) 06:27:51ポインタや配列に関する知識が中途半端な証拠
0193デフォルトの名無しさん
2007/10/19(金) 06:37:350194デフォルトの名無しさん
2007/10/19(金) 06:42:43それは処理系によって動作が異なる。
何も表示されないどころかエラー吐いて止まる場合もあるし、
>>190の望みと思われるtsstを表示して正常終了する場合もある。
つまり、コンパイルできるからといって書いてはいけないコード。
0195デフォルトの名無しさん
2007/10/19(金) 06:43:490196デフォルトの名無しさん
2007/10/19(金) 06:45:17printf("%c",str);
とした場合には、ちゃんとeが表示されます。
これってつまりstr[1]には文字が入っているということですよね。
では何故そこに代入することができないのでしょうか?
0197デフォルトの名無しさん
2007/10/19(金) 06:59:28そこってどこだと思う?
0198デフォルトの名無しさん
2007/10/19(金) 07:11:28そこにsを代入しようと思うのですが。
0199デフォルトの名無しさん
2007/10/19(金) 07:26:45→そのビルへは階数に関わらず手紙を届ける事が禁止されている
0200デフォルトの名無しさん
2007/10/19(金) 07:32:380201デフォルトの名無しさん
2007/10/19(金) 07:34:31出ないにしても、代入が無効になるだけだと思うのですが、表示すら何もされなくなるのは何故なのでしょうか。
0202デフォルトの名無しさん
2007/10/19(金) 08:46:11うまくいかない環境もあり,うまくいく環境もある
0203デフォルトの名無しさん
2007/10/19(金) 08:48:31配列とポインタが同じように扱える保証はないからな
0204デフォルトの名無しさん
2007/10/19(金) 10:52:15探しているんですが、何かおすすめの本てありますか?
今手元にあるのはメディックエンジニアリングの「これから
はじめるC言語基礎の基礎」という本なんですが・・・・
0205デフォルトの名無しさん
2007/10/19(金) 10:58:280206デフォルトの名無しさん
2007/10/19(金) 11:50:24いやでもやってることは、文字列の先頭から2バイト目に文字を代入する、ってことですよね?
配列で宣言してもポインタで宣言しても、データがメモリに連続で格納される、という点は変わらないはずです。
いくら処理系依存と言っても、配列だけ何故か1KBごとに飛び飛びで格納する、
なんてトリッキーなことはしていないと思うのですが、しているのですか?
もしそうならば、わざわざ配列の格納方式だけ処理系依存にする意味なんてあるんですか?
0207デフォルトの名無しさん
2007/10/19(金) 12:04:51文字列リテラルと配列の区別をつけよう。
0208デフォルトの名無しさん
2007/10/19(金) 12:05:18>>190のコードで実際にどんな値が入ってるか、確認してみれば?
printf("%d" , str[1]);
%cじゃなく%dで
もし代入失敗してるなら代わりに何が入ってるか確認できるし
0209デフォルトの名無しさん
2007/10/19(金) 12:12:01機能として違うのはわかりますが、メモリの格納方式まで別々にする意味は何でしょう?
単に不便にしているだけとしか思えないのですが。
>>208
同じ値が入っていました。さすがにこれはおかしいと思い、VCのモードをReleaseに変えたら動きました。
しかし根本的な問題解決にはなっていません。何故こう無駄に不安定なのか…
0210デフォルトの名無しさん
2007/10/19(金) 12:27:500211デフォルトの名無しさん
2007/10/19(金) 12:30:35「このモジュールはデバッグモードでコンパイルして
こっちはリリースモードでコンパイルしないとダメだからな」
嫌すぎる…
0212デフォルトの名無しさん
2007/10/19(金) 13:22:06文字列リテラルを使うときに、メモリを節約できるから。
つまり、次のコードは、同じ値を出力するかもしれない。
# コンパイラとオプションによって変わる
--
void exsample()
{
const char * foo = "abcde";
const char * bar = "abcde";
printf("%p, %p\n", foo, bar);
}
--
勿論、次のコードは只の配列だから違う値が出力される。
void exsample2()
{
char foo[] = "abcde";
char bar[] = "abcde";
printf("%p, %p\n", foo, bar);
}
0213デフォルトの名無しさん
2007/10/19(金) 13:23:230214デフォルトの名無しさん
2007/10/19(金) 13:29:260215デフォルトの名無しさん
2007/10/19(金) 13:56:580216デフォルトの名無しさん
2007/10/19(金) 15:42:13int main (void){
double a,b,c,x;
printf("Please type 1st Number >> ");
scanf("%xf",&a);
printf("Please type 2nd Number >> ");
scanf("%xf",&b);
printf("Please type 3rd Number >> ");
scanf("%xf",&c);
x=(a+b+c)/3;
printf("Average = %xf\n",x);
return 0;
}
なぜか、計算結果が違う・・・ %f が違うんでしょうか?
0217デフォルトの名無しさん
2007/10/19(金) 15:46:25%xf を %lf にしてみたらどうかな?
0218215
2007/10/19(金) 16:07:13ありがとうございました。
0219デフォルトの名無しさん
2007/10/19(金) 20:17:42文字列リテラルの内容を書き替えるプログラムの挙動は未定義。
文字列リテラルの型はchar配列となっているが、これは過去との互換性のため。
蛇足だがC++ではconst charの配列となっている。
(ただし、またも互換性のためchar*への型変換は定義さらている)
>>206
組み込みではROMに配置できるようになる。
Windowsなど高水準なOSでは、規格の規定から
文字列リテラルの書換はするべきでないと
認知されているため、文字列リテラルが
格納されている辺りを読取専用にする。
0220デフォルトの名無しさん
2007/10/19(金) 21:09:41「メモリの節約のため」でまとめちゃってもいい気もするけどね。
なんかメモリの節約以外の理由で文字列リテラルはROMのが良い理由があったら、
後学のために教えたって欲しいかも。
0221デフォルトの名無しさん
2007/10/19(金) 21:39:110222デフォルトの名無しさん
2007/10/19(金) 22:18:08fclose(fp); とすると、どうなるのでしょうか?
0223デフォルトの名無しさん
2007/10/19(金) 22:21:130224デフォルトの名無しさん
2007/10/20(土) 12:19:02詳しく言うと、エラー時にはEOFが返される。
成功時は0が返される。
0225デフォルトの名無しさん
2007/10/20(土) 13:31:04NULLかゴミ値じゃねぇの?
0226デフォルトの名無しさん
2007/10/20(土) 13:47:34以下はMac OS X Tigerのfclose(3)から引用
> The fclose() function does not handle NULL arguments; they will result in
> a segmentation violation. This is intentional - it makes it easier to
> make sure programs written under FreeBSD are bug free. This behaviour is
> an implementation detail, and programs should not rely upon it.
実際にfcloseにNULLを渡してみたらsegvが発生した。
おっしゃるとおりの御利益はあるかもしらんが、ちゃんと規格に準拠しようぜ…
0227デフォルトの名無しさん
2007/10/20(土) 18:16:47const char test[] = {"abcdef"};
で
cとdの間に0x04を入れたい場合どう書けばよいのでしょうか
0228デフォルトの名無しさん
2007/10/20(土) 18:31:080229227
2007/10/20(土) 18:42:470230デフォルトの名無しさん
2007/10/20(土) 19:12:41\04は8進表記。
0231デフォルトの名無しさん
2007/10/20(土) 20:04:000232デフォルトの名無しさん
2007/10/20(土) 20:08:21printf("%d\n", (int)x);
こうか?
0233デフォルトの名無しさん
2007/10/20(土) 20:08:42%.0f
0234デフォルトの名無しさん
2007/10/20(土) 20:09:56>>233
どちらでもできました!ありがとうございました
0235デフォルトの名無しさん
2007/10/20(土) 20:30:34MFCを使ったC++プログラミングは、C言語と似ているようで
似ていないですね。
0236デフォルトの名無しさん
2007/10/20(土) 20:36:52単にC++をCとして使ってただけだろ
0237デフォルトの名無しさん
2007/10/20(土) 20:37:270238デフォルトの名無しさん
2007/10/20(土) 20:40:47クラス、例外処理、テンプレート、新たに覚えることはたくさんある
0239デフォルトの名無しさん
2007/10/20(土) 21:02:21同じだと思っている人と一緒に仕事するとよーっくその事を実感することになる。
0240デフォルトの名無しさん
2007/10/20(土) 23:10:59printfって、%fでdouble型もfloat型も受けるよな?
それが、よく分らなくなった。
double型とfloat型って、サイズが違うはずだから、
引数から取り出すとき、区別がつかなくて、おかしくならないか?
0241デフォルトの名無しさん
2007/10/20(土) 23:13:34というわけで、可変引数だと暗黙的にfloatはdoubleに変換されるらしい
0242デフォルトの名無しさん
2007/10/20(土) 23:13:520243デフォルトの名無しさん
2007/10/20(土) 23:50:12でもそういうのってコンパイラによって違うのでは?
それってANSI Cで決められてたっけ?
0244デフォルトの名無しさん
2007/10/21(日) 00:07:10ANSIというか規格で決まっている。
floatは受ける型がわからない関数に渡されるときはdoubleに格上げされる。
これはプロトタイプの与えられていない関数の引数、あるいは可変引数のときに起こる。
なので、printfに渡すときはfloatもdoubleもどちらもdoubleとして渡されることになる。
似たようなことがcharにも言えて、これはintに格上げされる。
0245デフォルトの名無しさん
2007/10/21(日) 01:21:25#include "myheader.h"
int main(){
int list_num[100];
FILE *fp;
int i;
char buf[100][30];
というプログラムの最初の部分において
gcc -c main.c
main.c: 関数 `fgword' 内:
main.c:3: error: 文法エラー before '{' token
main.c:9: error: 文法エラー before "fp"
make: *** [main.o] エラー 1
main関数内でいきなりこういうエラーがでるんだけど
どういうことなんでしょうか?
main関数内にfgwordは使ってないんですけど
0246デフォルトの名無しさん
2007/10/21(日) 01:22:490247デフォルトの名無しさん
2007/10/21(日) 01:35:24int fgword(int);
にセミコロンがなかったからこういうエラーがでたようです。
ありがとうございます。
突然こんなエラーでてきてびびった。
0248デフォルトの名無しさん
2007/10/21(日) 03:41:30処理させるのと
ノートパソコンで処理
させるのと
音が違うな。
デスクトップはうるさくてやってられない。
実行に10分くらいかかるプログラムを動かしてるとき
デスクトップだとかなり沸いてくるし。
0249デフォルトの名無しさん
2007/10/21(日) 03:45:400250デフォルトの名無しさん
2007/10/21(日) 12:38:50charだと8bitになってしまいます
0251デフォルトの名無しさん
2007/10/21(日) 12:39:12ch = "test1";
ch = "test2";
↑で"test2"を代入した時点でメモリリークしてますか?
0252デフォルトの名無しさん
2007/10/21(日) 13:11:01メモリリークの意味を考えてください
確保したメモリを使用後も開放せずにいることですよ
で、それは該当すると思いますか?
そもそも領域確保していないのに
0253デフォルトの名無しさん
2007/10/21(日) 13:13:03「動的に」が抜けてた
静的に確保されたものは終了後、自動的に開放されます
0254デフォルトの名無しさん
2007/10/21(日) 13:59:07そのためスレッド稼働中の判定がうまくいきません どうしたらいいですか?
#include <process.h>
#include <stdio.h>
#include <windows.h>
void fnc(void *p){
int m=(int) p;
Sleep(m*400);
printf("%d end\n",m);}
main(){
HANDLE m[10]; DWORD tp[10];
int n=0,k;
for(k=0;k<10;k++)tp[k]=0;k=0;
while(n<100){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE){
m[k]=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, (void *)n));n++;}
k++;}
Sleep(10000);}
0255254
2007/10/21(日) 14:04:270256254
2007/10/21(日) 14:11:11DWORD flg;
m=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, NULL));
このようにスレッドを開始したとき、スレッドが終わると次の関数を終了コードを返すはずですよね?
GetExitCodeThread(m, &flg);
なんかいつまでもアクティブのままなんですが
0257254
2007/10/21(日) 14:18:100258デフォルトの名無しさん
2007/10/21(日) 14:20:020259デフォルトの名無しさん
2007/10/21(日) 14:29:28>start_address で起動されるルーチンは、__cdecl 呼び出し規約を使用する必要があり、戻り値を持つことはできません。
0260デフォルトの名無しさん
2007/10/21(日) 14:36:490261デフォルトの名無しさん
2007/10/21(日) 14:56:09なんか作業が終わる前に停止してしまいます
#include <process.h>
#include <stdio.h>
#include <windows.h>
#define ThreadNum 100
unsigned __stdcall fnc(void* p){
int m=(int) p;
Sleep((m%10)*10);
printf("%d end\n",m);}
main(){
HANDLE m[ThreadNum];
DWORD tp[ThreadNum];
int n=0,k;
for(k=0;k<ThreadNum;k++)tp[k]=100;k=0;
while(n<100){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE){
m[k]=reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL));n++;}
k++;if(k>=ThreadNum)k=0;}
do{n=0;
for(k=0;k<ThreadNum;k++){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE)n++;}
}while(n>=ThreadNum);
}
0262デフォルトの名無しさん
2007/10/21(日) 14:57:220263デフォルトの名無しさん
2007/10/21(日) 14:57:520264デフォルトの名無しさん
2007/10/21(日) 14:58:41一番最後は
while(n<ThreadNum);
でした
0265デフォルトの名無しさん
2007/10/21(日) 15:19:53for(n=0; n<ThreadNum; n++)
{
if(m[n]) WaitForSingleObject(m[n], INFINITE);
}
というかreinterpret_castってC++じゃねーかww
0266デフォルトの名無しさん
2007/10/21(日) 15:30:27それはEXではない方の場合でしょうか?
0267デフォルトの名無しさん
2007/10/21(日) 15:34:46よってCの範疇ではないのでスレ違い
0268デフォルトの名無しさん
2007/10/21(日) 15:46:230269デフォルトの名無しさん
2007/10/21(日) 16:16:06実行するマシンによって(無論コンパイルはそのコンピュータ上でやり直している)
値が変動したりしなかったりします。
どうしてでしょうか?
---------------------------------------------------
#include <stdio.h>
main(){
int i,*x;
x=&i;
*x=1;
printf("x=%o *x=%d\n",x,*x);
}
---------------------------------------------------
コンパイルコマンドは gcc hoge.c
以下は4回分の出力を横に並べたもの
Fedora7
x=27775464634 *x=1, x=27747676054 *x=1, x=27773760474 *x=1, x=27764163514 *x=1
Vine
x=27767545704 *x=1, x=27770645104 *x=1, x=27777542624 *x=1, x=27775054324 *x=1
OS X(10.3)
x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1
HP-UX
x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1
0270デフォルトの名無しさん
2007/10/21(日) 16:19:540271デフォルトの名無しさん
2007/10/21(日) 16:21:560272デフォルトの名無しさん
2007/10/21(日) 16:24:15xは変数iのアドレス(スタック上の)
OSによって異なるだろうし、同じOSでもコンパイラによっても異なる
0273デフォルトの名無しさん
2007/10/21(日) 16:27:19int input(char *pstr1)
{
char *ppstr1;
fgets(pstr1,SIZE_ARR,stdin);
fflush(stdin);
ppstr1=strchr(pstr1,'\n');
if(ppstr1!=NULL){
*ppstr1='\0';}
return 0;
}
このコードは、fgets関数で読み込んだ文字列から改行記号を探し
ヌル文字と改行文字を入れ替えをするということをしてるんですが
「*ppstr1='\0';」は、なぜ間接演算子抜きの「ppstr1='\0';」ではダメなんでしょうか
ご教示ください
0274デフォルトの名無しさん
2007/10/21(日) 16:30:24なるほど、ありがとうございました。
0275デフォルトの名無しさん
2007/10/21(日) 16:39:43strchrは見つかった場所へのポインタを返すから、char *型のppstr1で受け取ってるだろ?
char *型、つまりアドレスを表してるわけだから、ppstr1だけだと、その見つかった場所のアドレスになるんだ。
だから、アドレスを書き換えても意味がない。
ここでやりたいのは改行をヌル文字に変える作業だから、ppstr1というポインタを介して値を変更しないといけない。
だから、間接参照演算子を使って代入作業を行わないと駄目ってこと。
0276デフォルトの名無しさん
2007/10/21(日) 16:43:25ところでstdinからfgetsで取得したデータの改行は\0に変換されていなかったっけ?
まちがっていたらソマソ
0277デフォルトの名無しさん
2007/10/21(日) 16:45:34変換というより、最後に\0を付加するんだよ。
0278デフォルトの名無しさん
2007/10/21(日) 16:49:55そいつは多分getsと勘違いしてるとオモ。
getsは最後の改行コードを文字列に含まない。
fgetsは改行コードを文字列に含む。
0281デフォルトの名無しさん
2007/10/21(日) 16:58:540282デフォルトの名無しさん
2007/10/21(日) 17:00:340283デフォルトの名無しさん
2007/10/21(日) 17:00:410284デフォルトの名無しさん
2007/10/21(日) 17:34:010285デフォルトの名無しさん
2007/10/21(日) 17:40:37日本語でおk
0286デフォルトの名無しさん
2007/10/21(日) 17:41:03x= f(0) + f(1) + ・・・ だとインライン展開しますか?
0287デフォルトの名無しさん
2007/10/21(日) 17:46:410288デフォルトの名無しさん
2007/10/21(日) 17:48:400289デフォルトの名無しさん
2007/10/21(日) 20:17:10等比数列の初項aと公比rを入力し、格項の値とn項までの総和を計算し出力せよ。ただし、r!=1とする。(for文を使用する)
等比数列: a, ar, ar^2,・・・・・ar^(n-1)
等比数列の和:Sn=a+ar+ar^2+・・・・+ar^(n-1)
for文の部分だけでもお願いします。
0290デフォルトの名無しさん
2007/10/21(日) 20:18:41宿題スレ行け
0291デフォルトの名無しさん
2007/10/21(日) 20:22:34printfは非inlineな関数だから関係ないような気がするけど…。
0292デフォルトの名無しさん
2007/10/21(日) 20:22:44申し訳ない。宿題スレの存在しらなかったっす
0293名無し
2007/10/21(日) 21:58:060294デフォルトの名無しさん
2007/10/21(日) 22:01:210295名無し
2007/10/21(日) 22:12:130296デフォルトの名無しさん
2007/10/22(月) 15:14:45int add2(int i);
void add3(int *p);
int main(void)
{
int n; /* n の値の変化に注目する */
printf("Input integer: ");
scanf("%d", &n);
printf("Original: %d \n", n);
???????; /* 関数add1 に nを適用する */
printf("After Add1: %d \n", n); /* 関数add1 を適用した後の nを表示する */
printf("Add2: %d \n", ???????); /* nを適用した関数add2 の値を表示する */
printf("After Add2: %d \n", n); /* 関数add2 を適用した後の nを表示する */
???????; /* 関数add3 に nを適用する */
printf("After Add3: %d \n", n); /* 関数add3 を適用した後の nを表示する */
return 0;
}
void add1(int i) /* i に1を加えて,表示する */
{
???????}
int add2(int i) /* i に1を加えた値を返す */
{
???????
}
void add3(int *p) /* ポインタの指す値に1を加えて,表示する */
{
???????
}
????の部分を埋めてください。
0297デフォルトの名無しさん
2007/10/22(月) 15:17:57http://pc11.2ch.net/test/read.cgi/tech/1191937213/
0298デフォルトの名無しさん
2007/10/22(月) 16:09:03char str[]="日本語";
のような感じで、文字列リテラルとしてUTF-8を指定することは可能でしょうか?
ソースの文字コードをUTF-8にしても、strにはSJISのコードが入ります。
0299デフォルトの名無しさん
2007/10/22(月) 18:15:23で UNICODE が使える。文字コードは処理系依存
どうしても UTF8 が必要なら変換するしかないと思う。
0300デフォルトの名無しさん
2007/10/22(月) 18:27:11領域こえたらセグメンテーションでるのはわかる。
0301デフォルトの名無しさん
2007/10/22(月) 18:29:18全然分かってないじゃん
0302それはセグメンテーションフォルトだろう
2007/10/22(月) 18:30:41おまえは何か勘違いしている。領域を越えたらセグメンテーションが出ると言うわけではない。
0303デフォルトの名無しさん
2007/10/22(月) 18:40:050304デフォルトの名無しさん
2007/10/22(月) 18:42:010305デフォルトの名無しさん
2007/10/22(月) 18:43:360306デフォルトの名無しさん
2007/10/22(月) 18:46:450307デフォルトの名無しさん
2007/10/22(月) 20:18:18総素数の最大数が分かっているときはリストなどより配列を使ったほうが
プログラムは簡単になるし、性能もいいのができる。
ただし、以下のことは注意しなくてはいけない。
1.要素数の最大値が決まっていないとき
最大数を超えたときにリアロケートするという手もあるが、そういう時はリストにする。
2.中身がスカスカの配列
メモリーの無駄。メモリーが十分あればそれでも良い。
3.配列が確保できない
スタック上に配列を作成するときはよくある。
こういうときはヒープは外部変数にとる。
0308デフォルトの名無しさん
2007/10/22(月) 22:40:56scanfだと空入力したとき結果が出ないし
getsは禁止らしいので
fgetsしか使う方法がないのですが・・・
0309デフォルトの名無しさん
2007/10/22(月) 22:43:060310デフォルトの名無しさん
2007/10/22(月) 23:40:50fgetsで読み込まれた文字列の改行文字の後は'\0'です。
改行文字を含めたくないなら 273 の方法です…。
0311デフォルトの名無しさん
2007/10/22(月) 23:48:13改行文字が付いてるのを気にしないなら何もする必要なし
0312デフォルトの名無しさん
2007/10/23(火) 01:06:28for ( int i = 0; i < img_height; i++ ) {
img_data[i] = (HOGE)calloc( sizeof( GEHO ), 3 * img_width );
}
とメモリを確保した場合、どのようにメモリを開放したらいいのでしょうか?
0313デフォルトの名無しさん
2007/10/23(火) 01:45:44free(img_data[i]);
free(img_data);
0314デフォルトの名無しさん
2007/10/23(火) 01:53:37img_dataの型がよく分からないのだが……
img_dataもimg_data[i]も両方HOGE型てなんなん
int **ar,i;
ar = (int**)malloc(sizeof(int*)*HEIGHT);
for(i=0; i<HEIGHT; ++i) ar[i] = (int*)malloc(sizeof(int)*WIDTH);
こういうのをイメージしてるなら、こう↓
for(i=0; i<HEIGHT; ++i) free(a[i]);
free(ar);
0315デフォルトの名無しさん
2007/10/23(火) 02:12:47ありがとう。
種類の違うデータを二次元配列にいれたりしてるんだけど、
printfで表示させてもあっているのに、
あるアルゴリズムをかけると変な値がでるんだよなー。
ある空白の二次元配列の1行ずつに、違う二次元配列の1行ずつを代入して
足し算していくような感じのプログラムなんだけど。
計算が対数計算だから場合わけが非常に精密にしないとだめなんだよね。
0316312
2007/10/23(火) 02:13:07img_dataを開放しても、img_data[i]は開放されないんですね。
0317プリンがー
2007/10/24(水) 00:15:56#include<stdio.h>
void main (void)
{
int x i;
double y;
for(i=0;i<=9;i++){
printf("数値を入力して下さい");
scanf("%d",&x);
y=x*x;
printf("y=%3lf\n",y);
}
return0;
}
であってますか?
0318デフォルトの名無しさん
2007/10/24(水) 00:24:4310の二乗は?
というか、実行すればいいだろ
0319デフォルトの名無しさん
2007/10/24(水) 00:28:55exit(0);
0320318
2007/10/24(水) 00:29:56ごめ 間違えた
#include<stdio.h>
int main(void)
{
int i, x;
for(i=1;i<=10;i++){
printf("%d の二乗を入力して下さい : ", i);
scanf("%d", &x);
printf("%3d\n", x);
}
return 0;
}
0321デフォルトの名無しさん
2007/10/24(水) 01:00:02printf("%3d\n", x);
printf("%3d\n", x);
0322デフォルトの名無しさん
2007/10/24(水) 02:18:57無償コンパイラが欲しいんですがないですか?
0323デフォルトの名無しさん
2007/10/24(水) 02:20:050325318
2007/10/24(水) 06:13:11scanf("%d", &x);
↓
x=i*i;
0326デフォルトの名無しさん
2007/10/24(水) 10:29:58なるほど、>323のようになれると。
0327デフォルトの名無しさん
2007/10/24(水) 12:04:28Turbo-C 2.01
ttp://bdn.borland.com/museum/
お薦め。
0328プリンがー
2007/10/24(水) 12:29:22大学生協は置いてなくて・・・
講義では問題解くってことはしないのでorz
0329318
2007/10/24(水) 12:41:42推薦図書/必読書のためのスレッド 37
http://pc11.2ch.net/test/read.cgi/tech/1190192944/
0330デフォルトの名無しさん
2007/10/24(水) 12:42:28が抜けてるな
0332デフォルトの名無しさん
2007/10/24(水) 12:54:430333takumi
2007/10/24(水) 14:13:59問題:長さ100のint型配列 int a[100]がある。a[0]〜a[99]には整数が収められているする。
この100個の中で一番小さい数を求め、画面に出力するプログラムを作成せよ。
出力形式は「ans.=???」とせよ。???の部分は答え。
なんですが、全くわからないので教えて下さい。。
0334デフォルトの名無しさん
2007/10/24(水) 15:08:21http://pc11.2ch.net/test/read.cgi/tech/1193150915/l50
0335デフォルトの名無しさん
2007/10/24(水) 16:24:03どこの中学生掲示板だよ
0336デフォルトの名無しさん
2007/10/24(水) 17:59:260337デフォルトの名無しさん
2007/10/24(水) 21:19:580〜9 までの数字を、0 から1個ずつ増やしながら 10行表示しなさいっていうプログラムを作るんだけど、
0
01
012
0123
01234
012345・・・
とはならずに
0
1
2
3
4
ってなっちゃいます。というかそういう風に書いてるのもわかるんですが、
#include <stdio.h>
int main(void)
{
int a = 0;
a = 0;
while(a < 10)
{
printf("%d\n" ,a);
a++;
}
return 0;
}
↑whileの中をどうすればいいんでしょう・・・。
0338デフォルトの名無しさん
2007/10/24(水) 21:26:55{
int b = 0;
while(b <= a)
{
printf("%d", b);
b++;
}
printf("\n");
}
0339デフォルトの名無しさん
2007/10/24(水) 21:29:01int main(void)
{
int a,b;
for(a=0;a<10;a++)
{
for(b=0;b<=a;b++)printf("%d" ,b);
printf("\n");
}
return 0;
}
0340デフォルトの名無しさん
2007/10/24(水) 21:32:40ああああありがとうございます!
whileの中にwhile使うとは盲点。
流れも理解できましたありがとうございます!
0341デフォルトの名無しさん
2007/10/24(水) 21:35:510342デフォルトの名無しさん
2007/10/24(水) 21:38:140343デフォルトの名無しさん
2007/10/24(水) 21:38:43そうなんですよね。
他にもwhileを使って、2個入力した文字列が、同じ文字列かどうか判断するプログラムを作ったんですが、
ifelse使った方が手っ取り早かったり、一応基本中の基本ということで頑張ってますが、
とりあえずとことん覚えてみようと思います。
0344デフォルトの名無しさん
2007/10/24(水) 21:40:48まだ3日目です('A`)('A`)('A`)
初日はOSインスコとかパソコンに関する事を教わって(というか何回もやってきた事なので余裕でした)
二日目は%dやらfloat=小数点やら、long=スゲーでかい数とか、配列とかを覚えて
本日三日目でif else for を覚えたんですが、whileがなんかスゴイ曲者というか、問題がクセものでてんてこ舞いです。。。
0345デフォルトの名無しさん
2007/10/24(水) 21:44:45実戦力高めるならSTLだな
たとえば2つの文字列比較するならこうやればいい
#include <iostream>
#include<string>
using namespace std;
main(){
string a,b;
a="こんにちは"; b="こんばんわ";
cout<<a<<" と "<<b<<"は ";
if(a==b)cout<<"一致"; else cout<<"違う";
}
0346デフォルトの名無しさん
2007/10/24(水) 21:59:46固有値を求めたいんだけど。
0347デフォルトの名無しさん
2007/10/24(水) 22:09:40初心者(それも++じゃなくてCっぽい)にそんなこと教えたら、
同じ文字列が入ったchar配列を==比較して「あれ? 同じのはずなのに……」てことになるぞ
0348デフォルトの名無しさん
2007/10/24(水) 22:16:49標準ライブラリーにはない
特殊な科学技術計算用のライブラリーを手に入れるか、自作するか
0349デフォルトの名無しさん
2007/10/25(木) 08:26:44clapack
0350デフォルトの名無しさん
2007/10/25(木) 22:25:22int hoge;
int hage;
int hige;
int huge;
} HOGE;
と言う構造体があるとして、hoge = 1; hage = 0; hige = 1; huga = 1;となっているとします。
その構造体の中で、値が"1"になっている物を見付けたいのですが、そういうことはできないですか?
構造体内の変数の値を調べ、それが条件にあっていれば別々の処理をしたいです。
0351デフォルトの名無しさん
2007/10/25(木) 22:28:28リフレクションのある言語ならできる。
0352デフォルトの名無しさん
2007/10/25(木) 22:39:37メンバ名で参照したくないって事?
構造体先頭からのオフセットでアクセスするとかかな
0353デフォルトの名無しさん
2007/10/25(木) 22:50:11配列にしない(できない)理由はあるの?
typedef union{
struct{
int hoge;
int hage;
int hige;
int huge;
}
int array[4];
} HOGE;
0354350
2007/10/25(木) 22:57:44なんですかそれは…
始めてみました。 意味がちょっとわかりません…
その形にしておいて、
HOGE u_hoge;
....
u_hoge.array[0]にしたら、hogeにアクセスできるって事ですかね?
0355デフォルトの名無しさん
2007/10/25(木) 22:58:370356デフォルトの名無しさん
2007/10/25(木) 23:55:240357デフォルトの名無しさん
2007/10/26(金) 00:26:59あまりポインタは使いたくないんですが・・・
0358aho
2007/10/26(金) 00:29:26構造体のポインタを利用してみました。
#include <stdio.h>
typedef struct{
int hoge;
int hage;
int hige;
int huge;
}HOGE;
int main(){
HOGE* hogep = NULL;
try{
hogep = new HOGE();
}catch(...){
printf("new error!\n");
}
/* メンバ変数の初期化 */
hogep->hoge = 1;
hogep->hage = 0;
hogep->hige = 1;
hogep->huge = 1;
printf("%d\n", hogep->hoge);
return 0;
}
0359デフォルトの名無しさん
2007/10/26(金) 00:40:51fgets(buf, n, fp);
if (buf[strlen(buf) - 1] == '\n') {
buf[strlen(buf) - 1] = '\0';
}
・・・?
0360デフォルトの名無しさん
2007/10/26(金) 00:44:21fgets(buff, sizeof buff, stdin);
for(i=0; buff[i]; i++) if(buff[i]=='\n') { buff[i] = '\0'; break;}
0361デフォルトの名無しさん
2007/10/26(金) 01:39:24どこでパス入力するの?
0362教えてください
2007/10/26(金) 03:23:34下記の素数か素数でないか調べるコードで、
�@変数名にis_primeとありますが、isは何を意味しているのですか?
�Ais_prime = 1;とするのがわかりません。
�B以下、return 0; まで、どういう流れかわかりません
よろしければ1行ずつ教えてもらえるとうれしいです。
#include <stdio.h>
int main(void)
{
int num, i, is_prime;
printf("判定したい数を入力してください: ");
scanf("%d", &num);
/* 約数があるかどうか調べる */
is_prime = 1;
for(i=2; i<=num/2; i=i+1)
if((num%i)==0) is_prime = 0;
if(is_prime==1 && num > 1) printf("素数です");
else if (num > 1) printf("素数ではありません");
return 0;
}
0363デフォルトの名無しさん
2007/10/26(金) 03:44:590364デフォルトの名無しさん
2007/10/26(金) 08:08:18適当な数字入れて処理追いかけてみろよ。
0365デフォルトの名無しさん
2007/10/26(金) 08:13:380366デフォルトの名無しさん
2007/10/26(金) 11:02:57You is fool.
0367デフォルトの名無しさん
2007/10/26(金) 11:26:14解凍しなおしてみたら?
0368デフォルトの名無しさん
2007/10/26(金) 12:54:260369デフォルトの名無しさん
2007/10/26(金) 13:24:170370デフォルトの名無しさん
2007/10/26(金) 13:55:39不等号の>>と>の判別ってプログラム的にどうすべきですかね?
計算は対数でするんだけど。
0371デフォルトの名無しさん
2007/10/26(金) 14:35:43もしくは比が閾値を越えるかで判定
0372デフォルトの名無しさん
2007/10/26(金) 15:09:54今計算してみると対数の値をexpかけてみて値をみていくと
値がかわってくるのが差が10から15あたりのときみたいだから
閾値を15で計算をかえてみることにするわ。
0373デフォルトの名無しさん
2007/10/26(金) 15:49:02if(loc<100){
printf("氏名を入力して下さい(空白で終了):\n");
fgets(data[loc].namae,39,stdin);←この行
if(!*data[loc].namae)break;
printf("電話番号を入力して下さい:\n");
fgets(data[loc].denwa,39,stdin);
printf("市外局番を入力して下さい:\n");
fgets(str,9,stdin);
data[loc].sigai=atoi(str);
}
}
上の行のfgetsをgetsに変えるとEnterでbreakするんですけど
fgetsのままでは動作しません。どうすればfgetsのままで動作しますか?
0374デフォルトの名無しさん
2007/10/26(金) 16:10:04何回解凍しなおしてもダウンロードしなおしても空…
zipファイルはちゃんと容量あるのに解答してできたフォルダには容量が全くなくなる。
0375デフォルトの名無しさん
2007/10/26(金) 16:15:36解凍ソフトは何?
パス付きに対応してないやつなんじゃね?
0376デフォルトの名無しさん
2007/10/26(金) 16:17:32fgetsは改行も取り込むから、
fgets(data[loc].namae,39,stdin);
if(data[loc].name[0] == '\n') break;
これでおk
0377デフォルトの名無しさん
2007/10/26(金) 16:26:35出来ました。ありがとうございます。
0378デフォルトの名無しさん
2007/10/26(金) 16:30:47http://ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken/miyakosi/c04.html
ここは間違ってる?もしくは誤解される様な感じなのですか・・?
一度参考にしたんですが・・。
0379デフォルトの名無しさん
2007/10/26(金) 16:46:34'\n'を取り除くとも書いてないから間違いとは言えない。
しかし、その直後のfputs()の説明が間違っているから信用できない。
0380デフォルトの名無しさん
2007/10/26(金) 17:20:431行64バイトのファイル(行数可変)のデータに何回も文字列の検索を行ういアウトプットするプログラムを作っています。
fgetsを使い何回もファイルを読み込んで一行ずつ比較するというようにできたにはできたのですが、
行数可変で多い場合100000行超えたりするファイルに対してはえらい時間がかかります。
メモリにぶちこんでそこから何回も検索を行いたいと思うのですが、どう組んだらいいでしょうか。
0381これ参考に
2007/10/26(金) 17:37:47#include <time.h>
#include <string.h>
int N;
void serch(char* x,char* str,int* adr){
char t[256];int n,M,k,su=0;
for(M=0;;M++)if(str[M]=='\0')break;
for(n=0;n<256;n++)t[n]=M;
for(n=1;n<=M;n++){k=(unsigned char)str[M-n];if(t[k]==M)t[k]=n;}
n=0;while(1){
for(k=0;k<M;k++)if(str[k]!=x[n+k]) break;
if(k==M){adr[su]=n;su++;n+=M;}
else {k=(unsigned char)x[n+M];n+=t[k];}
if(n+M>=N){adr[su]=-1;return;}}}
main(){
N=18000000;char *x=new char[N];N=0;
char buf[120],k,n;
FILE *fp=fopen("2ch.txt","rb");
while(k=fread( buf,1,100,fp)){
for(n=0;n<k;n++)x[N+n]=buf[n];N+=k;}
fclose(fp);
printf("データロード完了!\n測定中です・・・\n");
int adr[30000];
char str[]="名無し";
serch(x,str,adr);
}
0382デフォルトの名無しさん
2007/10/26(金) 18:07:20変数の使い方、変数の名前が気持ち悪い
>>380
malloc,realloc使うべし
0383デフォルトの名無しさん
2007/10/26(金) 18:08:40reallocはいらないやも
0385デフォルトの名無しさん
2007/10/26(金) 18:35:140386デフォルトの名無しさん
2007/10/26(金) 18:36:04ありがとう。
解凍ソフト変えたらできた。
0387デフォルトの名無しさん
2007/10/26(金) 18:53:06#include <string>
#include <fstream>
using namespace std;
int main()
{
fstream fp("test.txt");
string str,buf;
do{
fp >> buf;
str+=buf;
}while((!fp.eof()));
int n=str.find("会議");
cout << n;
}
0388デフォルトの名無しさん
2007/10/26(金) 18:53:49だからその入力ロジックを何とかしろって
0389デフォルトの名無しさん
2007/10/26(金) 19:06:04適当に書いた例だけど
FILE *fp;
char *data;
... //省略
data = (char*)malloc(sizeof(char) * 128); /とりあえずchar128個分確保
if(data==NULL) return 1; //エラー処理
int i=0,size=128;
while((data[i] = getchar()) != EOF){
if(++i >= size){
char *tmp;
tmp = realloc(data,sizeof(char) * (size + 50)); //50ずつ拡張
if(tmp == NULL){
/* reallocは元の領域を解放するが、失敗時は解放せずにNULLを返す
そのため、失敗時に解放できるように、別変数で一度戻り値を受けてから、エラーチェックする */
free(data); //mallocやreallocで確保した領域は必ず解放する
return 1;
} else {
data = tmp;
size += 50;
}
}
}
free(data) //必ず解放
0390デフォルトの名無しさん
2007/10/26(金) 20:26:58int A;
int B;
void X(int a[],int b[]){
printf("%d",a);
printf("%d",b);
}
void main(void){
//省略
X("A","B");
質問させてください
変数A Bを引数使って表示させたいんですけど、コマンドプロンプト?で実行させると警告がでてちゃんと表示されません。
どうすればいいでしょうか?
説明不足ですみませんがよろしくお願いします
0391デフォルトの名無しさん
2007/10/26(金) 20:29:39関数を呼び出す時によって、値をいれる必要が無いときがあります。
不要な値のために変数を宣言したくないのですが、変数を宣言しないでいい方法などはありませんか?
hoge( &x, &y, &height, &width);
と呼び出すのですが、&heightと&widthの結果を使わないときもあるので、
int x, y; だけ宣言して、heightとwidthは変数宣言したくないと思っています。
0392デフォルトの名無しさん
2007/10/26(金) 20:30:260393デフォルトの名無しさん
2007/10/26(金) 20:31:42C++は入れない場合も同じ名前に出来る 2つ書けばいい
0394デフォルトの名無しさん
2007/10/26(金) 20:33:40たとえばcとdを使わないなら、hoge( a, b) { return hoge( a, b , 0 , 0);}
0395デフォルトの名無しさん
2007/10/26(金) 20:34:45NULL を使えばいいと思うよ
>>393
ここはC言語のみ
C++なら誘導してからにしてください
0396391
2007/10/26(金) 20:39:55すみません、C言語です。
>>394
すみません。 私が関数ではないため動作が変えれないのと、不必要な値は6この引数のうち、
1, 2, 5が不要になったりする場合もあります。
>>395
すみません。
NULLを使うと言うのは、どのようにすればいいのでしょうか?
型を、castするという意味でしょうか?
0397391
2007/10/26(金) 20:48:00hoge( &x, &y, NULL, NULL);
とすれば、コンパイルは通ったのですが、これは正しいのでしょうか?
簡単に動作を説明して頂けるとありがたいです。
0398デフォルトの名無しさん
2007/10/26(金) 20:50:47動作はNULLで通るように自分で書かなければ行けない
0399391
2007/10/26(金) 21:26:43> 自分で書かなければいけない
と言うのは、関数をそのように修正すると言うことでしょうか?
関数は自分で作ったもので修正はできないと思います。
0400デフォルトの名無しさん
2007/10/26(金) 21:27:56NULL の指す先を読み書きしないようにするだけ
0401デフォルトの名無しさん
2007/10/26(金) 22:00:33hoge()の仕様がわからないと、引数でNULLを渡していいかどうかは判断できない。
0402デフォルトの名無しさん
2007/10/26(金) 22:44:080403デフォルトの名無しさん
2007/10/26(金) 22:51:540404デフォルトの名無しさん
2007/10/27(土) 00:01:400405デフォルトの名無しさん
2007/10/27(土) 00:10:28あなたが hoge() か
0406デフォルトの名無しさん
2007/10/27(土) 00:15:31int f(int &x){
if(&x==NULL)
return -1;
return x+10;}
int main(){
int x=0;
printf("%d\n",f(x));}
0407デフォルトの名無しさん
2007/10/27(土) 00:23:05それじゃポインタ渡した意味な(ry
0408デフォルトの名無しさん
2007/10/27(土) 00:29:32てか参照渡しってCで使えるの?
0409デフォルトの名無しさん
2007/10/27(土) 00:38:22int f(int *x){
if(x==NULL)
return -1;
return *x+10;}
int main(){
int x=0;
printf("%d\n",f(NULL));}
0410デフォルトの名無しさん
2007/10/27(土) 00:42:570411デフォルトの名無しさん
2007/10/27(土) 00:45:110412デフォルトの名無しさん
2007/10/27(土) 00:50:420413デフォルトの名無しさん
2007/10/27(土) 01:30:010414デフォルトの名無しさん
2007/10/27(土) 01:34:02へぇ、永遠のデバッグビルドか
0415デフォルトの名無しさん
2007/10/27(土) 09:58:07sunも引数チェックにassert使えって言ってるよ。
0416デフォルトの名無しさん
2007/10/27(土) 10:40:38内部的なエラーでも無い限りNULLになる事はありえない前提
0417デフォルトの名無しさん
2007/10/27(土) 11:38:55NULLを渡すなんてありえない。
0418デフォルトの名無しさん
2007/10/27(土) 16:10:150419デフォルトの名無しさん
2007/10/27(土) 16:15:390420デフォルトの名無しさん
2007/10/27(土) 16:20:57NULL比較?
0421デフォルトの名無しさん
2007/10/27(土) 17:39:12図とかでイメージしやすく解説してください
0422デフォルトの名無しさん
2007/10/27(土) 17:44:10カリー化
0423デフォルトの名無しさん
2007/10/27(土) 17:45:58本読め
0424デフォルトの名無しさん
2007/10/27(土) 17:46:25char *str;
/* 文字列のためのメモリを確保 */
str = (char *)malloc(100);
こんな感じに書いてるけど
char str[100]
ってやった方が楽じゃん。なんでmallocなんて使うの?
0425デフォルトの名無しさん
2007/10/27(土) 17:49:17型が分からなかったので適当に決めた
int hoge_wrap(int *x, int *y, int *width, int *height){
int dummy=0;
if(x==NULL) x=&dummy;
if(y==NULL) y=&dummy;
if(width==NULL) width=&dummy;
if(height==NULL) height=&dummy;
return hoge(x, y, width, height);
}
0426デフォルトの名無しさん
2007/10/27(土) 17:50:10必要ないなら無理して使わなくても良い物です
0427デフォルトの名無しさん
2007/10/27(土) 17:52:55無理して使えるようになるためにおせーてよ
何か新天地が開けるかもしれないじゃん
というか教えてくださいお願いしますガンダム見ませんから
0428デフォルトの名無しさん
2007/10/27(土) 17:56:590429デフォルトの名無しさん
2007/10/27(土) 17:58:130430デフォルトの名無しさん
2007/10/27(土) 18:00:080431デフォルトの名無しさん
2007/10/27(土) 18:00:140432デフォルトの名無しさん
2007/10/27(土) 18:04:55char array[100]; のかわりにchar *p; p=(char*)malloc(100);を使うとき
1.配列のサイズが未定のとき
実行時にしかか配列のサイズ(この場合100)がわからないとき
2..配列のサイズが大きすぎて内部変数として確保できないとき
外部変数を使うという手もある
0433デフォルトの名無しさん
2007/10/27(土) 18:05:280434デフォルトの名無しさん
2007/10/27(土) 18:09:53#include <iostream>
#include <vector>
using namespace std;
#define N 10000000
main(){
int *x;
x=new int[N];
vector<int> y;
y.reserve(N);
// char z[N];z[0]=1;
for(int n=0;n<N;n++)x[n]=y[n]=1;
printf("%d",x[0]);}
0435デフォルトの名無しさん
2007/10/27(土) 18:10:55なし
0436デフォルトの名無しさん
2007/10/27(土) 18:11:160437デフォルトの名無しさん
2007/10/27(土) 18:30:060438デフォルトの名無しさん
2007/10/27(土) 18:58:41状況による。
たまにいる、必ずやるってやつは素人。
0439デフォルトの名無しさん
2007/10/27(土) 19:23:20配列サイズが分からなかったり、途中で増える可能性がある時に使う
0440デフォルトの名無しさん
2007/10/27(土) 19:35:21やらないとLintに叱られます
0441プリンがー
2007/10/27(土) 19:55:120442デフォルトの名無しさん
2007/10/27(土) 20:02:570443デフォルトの名無しさん
2007/10/27(土) 20:03:160444デフォルトの名無しさん
2007/10/27(土) 20:07:27そんなlintありません。
0445デフォルトの名無しさん
2007/10/27(土) 20:21:30スタックサイズを増やせばおk
ま、普通はポインタにして malloc するがな
0446デフォルトの名無しさん
2007/10/27(土) 20:37:47char str[100] の[]の中に変数を入れるとコンパイルエラーになるが、
mallocだとそれができます。
0447デフォルトの名無しさん
2007/10/27(土) 20:42:540448デフォルトの名無しさん
2007/10/27(土) 20:55:010450デフォルトの名無しさん
2007/10/27(土) 23:11:41コンピュータじゃないんだから人間的に考えればいいと思うよ
0451デフォルトの名無しさん
2007/10/27(土) 23:16:350452デフォルトの名無しさん
2007/10/28(日) 00:19:56大文字、小文字に関係なく、アルファベットを入力した場合には、それぞれの入力した個数を数えなさい。
2. 1. の処理終了後、アルファベットをそれぞれ何個ずつ入力したか出力しなさい。
これなんですがどう頑張っても意味不明です・・・
ヒントとして
?入力アルファベットの個数を数えるカウンタは大きさ 26 の配列で用意。
最初に、配列の 26個の要素すべてを0クリアすること。
?A〜Z、a〜z は ASCIIコードの 65〜90、97〜122 に該当することを考えれば、配列の何番目をカウントUP するかは計算で求められるはず。
実行結果
入力文字
14abcaaabccdzzgk(リターン)
aabc147cab8cc3c(リターン)
CTRL+Z(リターン)
とすると
a = ○○個 b = ○○個 c = ○○個 改行
d = ○○個 e = ○○個〜〜〜 と一覧を出力させたいんです。
とあるんですが、どう書いたらいいんでしょうか・・・('A`
switch使ってみたりしたんですが、イマイチ意味がわからなくなってきました・・・。
ちなみに今まで習った事は、
if if else for while break continue goto 算術関数 strcpy等、 等の初歩的なことだけです。。。
0453デフォルトの名無しさん
2007/10/28(日) 00:22:10宿題スレ行け
0454デフォルトの名無しさん
2007/10/28(日) 00:25:3265-65は0
90-65は25
97-97は0
122-97は25
ってことじゃね
0455デフォルトの名無しさん
2007/10/28(日) 00:25:45普通初心者にgotoは教えないだろ
0456デフォルトの名無しさん
2007/10/28(日) 00:25:56宿題スレに行け……と言いたいところだがヒントをやろう
'a'-'a' == 0
'z'-'a' == 25
'A'-'A' == 0
'Z'-'A' == 25
0457デフォルトの名無しさん
2007/10/28(日) 00:29:120458デフォルトの名無しさん
2007/10/28(日) 00:30:440459デフォルトの名無しさん
2007/10/28(日) 00:33:500460デフォルトの名無しさん
2007/10/28(日) 00:56:35scanfで変数cに文字を入れた場合、変数cから65を引いた数、例えばAなら65で0となり、Cなら67で2となり、
配列a[26]の[]内をcとして、そこに+1づつカウントしていく というのはわかるんですが、
どう書いていいのかチンプンカンプンなんです・・・。
そもそもgetcharって1文字入力なのに演習問題の実行例には
abcdddef14(return)
afijjgjkk(return)
CTRL+Zってなっててなんで文字列での入力になってるんだろうとか思ったり('A`
ちなみにgotoは多段ループから強制的に抜けたい場合にのみ使ったほうがいいかもしれないけどオススメはできないとも書いてありました。
0461デフォルトの名無しさん
2007/10/28(日) 01:01:19なんとなくわかりかけたかも・・・?
ちなみにC言語学んでからまだ5日目です('A`
0462デフォルトの名無しさん
2007/10/28(日) 01:03:27意味のある文字はアルファベットとCTRL+Z。
それ以外の(return)とか数字とかは無視すればいいんじゃね?
CTRL+Zはなんだっけ・・・EOT?
0463デフォルトの名無しさん
2007/10/28(日) 01:09:23whileでのgetcharでのループから抜け出すための CTRL+Z=EOF っす。
a と入力して、画面に a = 1個 と入力させるのはかけるんですが、
abcと入力した場合は配列使うと思うんですが、まずそもそも
getcharでabcの場合 while ((c = getchar()) != EOF) //cは配列 配列に入力 CTRL+Zを押すとwhile終了。
でc[]にc[0]=a c[1]=b c[2]=cとなる・・・の?あれ理解しかけてきました。
ずっとc[0]にabcとなると思ってました・・・。
文字列の場合はgetsになるんですね、このすぐ先に習う項目にgetsあってみてみたら文字列って書いてあってアッーって思いました。
0464デフォルトの名無しさん
2007/10/28(日) 01:10:570465デフォルトの名無しさん
2007/10/28(日) 01:12:50・c = getchar()のcは配列である必要ない
のはず・・・
0466デフォルトの名無しさん
2007/10/28(日) 01:20:45見た目的には a と打ち込むだけでは エンターを押さない限り文字入力待機画面になってるんですけど、(上記問題の場合はwhileなので文字→エンター→入力待機→文字→エンター→入力待機となるのはわかります)
内部的には処理されているということですか?
aだけ押す、エンターは押さない→画面には入力待機状態であるが、内部的には処理されている?
ちょっとやってみまつ。
0467デフォルトの名無しさん
2007/10/28(日) 01:24:390468デフォルトの名無しさん
2007/10/28(日) 01:26:04aからfまで順に1つ1つ処理していくということになるんですか?
0469デフォルトの名無しさん
2007/10/28(日) 01:30:56puts("なんか入力された\n");
}
0470デフォルトの名無しさん
2007/10/28(日) 01:34:000471デフォルトの名無しさん
2007/10/28(日) 01:35:44int main(void)
{
int c;
while ((c = getchar()) != EOF) {
printf("%d\n" ,c);
}
return 0;
}
出力した結果、>>470さんの言ったとおり、例えばAAA(リターン) の場合綺麗に65656510と表示されました!
これで問題に取り組んでみたいと思います!
ありがとうございます!!!
0472デフォルトの名無しさん
2007/10/28(日) 01:37:46引っ込んでようorz
0473デフォルトの名無しさん
2007/10/28(日) 01:40:34皆さん本当にありがとうございました。
0474デフォルトの名無しさん
2007/10/28(日) 01:41:460475デフォルトの名無しさん
2007/10/28(日) 09:44:070476デフォルトの名無しさん
2007/10/28(日) 11:44:11重複したシンボルがある(?)とか怒られてて困っています
原因がわかる方いませんか?おねがいします
http://www.uploda.org/uporg1085799.zip.html
一応ファイルをうpしました
0477デフォルトの名無しさん
2007/10/28(日) 11:56:55マルチうざい
0478デフォルトの名無しさん
2007/10/28(日) 13:19:04どのシンボルが重複してるかまで表示されてるだろ?
それが重複してるんだよ。
0479デフォルトの名無しさん
2007/10/28(日) 13:41:16ありがとうございました。よく見たら書いてました。
0480デフォルトの名無しさん
2007/10/28(日) 15:03:31例えば、配列の中身を順に表示させようと思っても文字化けします
array[11] = {"しーげんご"};
Shift-Jisとかに変換してから使うんですか?
0481デフォルトの名無しさん
2007/10/28(日) 15:17:35> 配列の中身を順に・・・
1バイトずつの表示はできない。
0482デフォルトの名無しさん
2007/10/28(日) 15:30:49そうなんですか・・・
じゃあ半角英字みたいに平仮名でも文字コードに数字を足して
次の文字へ!みたいな処理はできますか
0483デフォルトの名無しさん
2007/10/28(日) 15:54:37いちど使用している文字コードの文字コード表を見ることを薦める。
ちなもに、S-JISでは、「あ」「い」「う」は,それぞれ,0x82a0, 0x82a2, 0x82a4
0484デフォルトの名無しさん
2007/10/28(日) 16:02:41調べてみたんですが、SーJISで「あ」を表示させるには
%cを2回と0x82,0xa0をつかって表示させると書いてありました。
ほかの表示方法は見つけられなかったのですが、ありますか?
0485452
2007/10/28(日) 17:12:30が、次の問題で一点引っかかる事が('A`
終了条件eまたはEってどういう風に記述するんですか?
while(gets(str) != ○○)
の○○にeかEを入力した場合で終了という風にしたいのですが・・・。
'e' とか'E'は駄目みたいです。
0486デフォルトの名無しさん
2007/10/28(日) 17:13:570487デフォルトの名無しさん
2007/10/28(日) 17:17:56習う順番でgetchar+putchar → gets+putsという風になってて
問題が、
gets() を用いて、テストの点数を文字列として入力しなさい。
上記処理中、eかEを入力した場合は下記処理をスキップさせ、内容を出力せよ っていう問題なんです。
考え方としては、今まで習ってきたように ○○が入力されるまでは処理を続けるというwhileループでの処理だと思うんですが・・・。
0488デフォルトの名無しさん
2007/10/28(日) 17:21:550489デフォルトの名無しさん
2007/10/28(日) 17:33:29int変数aというものを新たに用意し、
getsで入力した中に、a = 'e' か a='E' での判定を入れたら無事とおりました><
0490デフォルトの名無しさん
2007/10/28(日) 19:18:39while(gets(str)[0] == 'E')
とか? 試してないけど
NULLが返ってきた時に危険だなw
0491デフォルトの名無しさん
2007/10/28(日) 19:42:10できたました!
こんな長い(すごい短いんだろうけど・・・)の書いたの初めてです・・・。
0492デフォルトの名無しさん
2007/10/28(日) 19:47:06どれか2つの値が等しければ「2つの値が等しいです」と、そうでなければ「3つの値が異なります」と表示するプログラムをつくりなさい
#include <stdio.h>
int main(void)
{
int n1,n2,n3;
printf("整数A"); scanf("%d", &n1);
printf("整数B"); scanf("%d", &n2);
printf("整数C"); scanf("%d", &n3);
if(n1==n2==n3)printf("3つの値は等しいです");
else if(n1==(n2||n3))
printf("2つの値は等しいです");
else if(n2==(n1||n3))
printf("2つの値は等しいです");
else if(n3==(n2||n1))
printf("2つの値は等しいです");
else printf("3つの値は異なります");
return(0);
}
このように組んで整数Aに1整数Bに2整数Cに3を代入すると2つの値は等しいですと表示されてしまいます
問題点を教えてください><
0493デフォルトの名無しさん
2007/10/28(日) 19:53:17n2||n3 n2||n1 n1||n3 は、それぞれ両方0のとき0、それ以外だと1になる。
0494デフォルトの名無しさん
2007/10/28(日) 19:55:04int main(void)
{
int n1,n2,n3,k=0;
printf("整数A "); scanf("%d", &n1);
printf("整数B "); scanf("%d", &n2);
printf("整数C "); scanf("%d", &n3);
if(n1==n2)k++;
if(n1==n3)k++;
if(n2==n3)k++;
if(k==3)printf("3つの値は等しいです");
else if(k==1)printf("2つの値は等しいです");
else printf("3つの値は異なります");
}
0495デフォルトの名無しさん
2007/10/28(日) 19:56:480496492
2007/10/28(日) 20:05:56ありがとうございました。||の使い方をかんちがいしていました。。。
0497デフォルトの名無しさん
2007/10/28(日) 20:33:46なんか無駄が多い気がするが、まあそれは眼をつむっておこう
だがgetsの入力先配列が要素数2てのは……誤入力もあるだろうし、せめて256くらい確保した方が良い気がする
というか、要素数2だとヌル文字入らないじゃん(というか100も入らないし)
atoiってヌル文字入らないと変な動作になることあるはず
0498デフォルトの名無しさん
2007/10/28(日) 21:06:24むむ、
getsでの取得は 例えば入力が50なら、charだから配列[0]に50 で配列[1]に\0が入る=2個で足りるってことじゃないですか?
もしgetsでの取得変数がintの場合なら点数最大100(つまり3桁)は最低でも[4]になるのはわかります。
まぁでも、教えてもらっている人にも、配列は無駄でもいいから多く取った方がいいと教わりましたので、多くとる事を、この先心がけていきます!
ありがとうございました!
0499デフォルトの名無しさん
2007/10/28(日) 21:21:49ためしにcharでの変数aに入力したものを、出力させるのかいてみて
a[0]をやったら、最初の1文字しか出力されませんでした。
本当にありがとうございました。
0500デフォルトの名無しさん
2007/10/28(日) 22:56:33int* foo
の違いを教えてください><
今までint *foo しか使ってなくて
いきなりint* fooが出てきてわけわかりません><
0501デフォルトの名無しさん
2007/10/28(日) 22:57:42次は int * foo だ
0502デフォルトの名無しさん
2007/10/28(日) 23:00:180503デフォルトの名無しさん
2007/10/28(日) 23:03:210504デフォルトの名無しさん
2007/10/28(日) 23:04:11そんなのもあるのですか
ソース解読してる途中にこんなの出てきてわけわからんのです
すいませn助けてください。ほんと
何でグぐれ場いいのかもわからなくて
すんません、マジで
0505デフォルトの名無しさん
2007/10/28(日) 23:07:39int *foo;
int* foo;
int * foo;
は全部一緒
0506デフォルトの名無しさん
2007/10/28(日) 23:09:54なんでこんな風に書き方分けてるのか
0507デフォルトの名無しさん
2007/10/28(日) 23:14:350508デフォルトの名無しさん
2007/10/28(日) 23:35:53for(int i = size >> 1 ; ; i >>= 1)
というループがあったのですが
size >> 1 や i >>= 1 というのはどういう意味なのですか?
0509デフォルトの名無しさん
2007/10/28(日) 23:37:410510デフォルトの名無しさん
2007/10/28(日) 23:40:19ビットシフト
0511デフォルトの名無しさん
2007/10/28(日) 23:44:55あとforの2つ目のところが空白なのもわけがわかりません
0512デフォルトの名無しさん
2007/10/28(日) 23:46:35forの2つめが空白の場合は条件なしの繰り返し=無限ループ
0513デフォルトの名無しさん
2007/10/28(日) 23:53:43iが10(2進数で1010)だとすると5(101)になる
5だとすると2(10)になる。その次はもう予想できるよな?
0514デフォルトの名無しさん
2007/10/29(月) 00:07:56ありがとうお兄ちゃんたち!
0515デフォルトの名無しさん
2007/10/29(月) 01:18:22俺は
int* foo;
のほうが好きかな
「int型へのポインタを返す」ってのをあらわしてる感じで
0516デフォルトの名無しさん
2007/10/29(月) 01:35:28int *foo;
のほうが好きかな
int *foo, *bar;
みたいに複数いっぺんに宣言するときわかりやすいし
0517デフォルトの名無しさん
2007/10/29(月) 01:35:530518デフォルトの名無しさん
2007/10/29(月) 01:37:090519デフォルトの名無しさん
2007/10/29(月) 02:21:33どうしていくべきですか?
100X100くらいの配列の
0520デフォルトの名無しさん
2007/10/29(月) 02:23:34だがそういう風にするとああいうことも起きるわけでいちがいに
どちらがいいとは判断しかねるな
0521デフォルトの名無しさん
2007/10/29(月) 06:11:010522380
2007/10/29(月) 11:19:52mallocでメモリに格納→格納した文字列を検索後抜き出す動作をもう一度ご教示いただけないでしょうか。
0523デフォルトの名無しさん
2007/10/29(月) 12:46:28先ずは試しにfgets()版を見せてくれ。
0524380
2007/10/29(月) 13:16:03void Hairetsu(void) {
FILE *read;
char fnameread[90];
char charline[90];
char KensakuName[20];
strcpy(fnameread, "*****.txt");
strcpy(KensakuName, "C3 10237");
StartTime = clock();
printf("%d\n", StartTime);
while(KensakuCount < 10) {
read = fopen(fnameread, "r");
if (read == NULL) {
printf("ファイルがオープンできません\n");
exit(1);
}
while(1) {
fgets(charline, 90, read);
if (strcmp(charline, "ENDDATA\n") == 0){
***ファイルは必ず最後の行にENDDATAと記載されています
break;
}
if (strncmp(charline, KensakuName, 16) == 0) {
***ここで検索に引っかかった行から新たな要素を取り出して再度同ファイル内で検索をかけます
***その際にまた先頭行から読み直してfgetsを用いて検索をしこれをこのif内で3回程度繰り返えします。
}
}
fclose(read);
}
}
0525デフォルトの名無しさん
2007/10/29(月) 13:31:08「えらい時間」とあるけど、どれくらい掛かるの?
試しに>524相当のロジックを書いて10万と1行のファイルで動かしてみたが、1秒も掛からないんだが。
0526380
2007/10/29(月) 13:37:22これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。
それで更にその中に計算式が組み込まれていますので・・・・
0527デフォルトの名無しさん
2007/10/29(月) 13:45:24>524からこれは読み取れないわけだがw
つーか、それはそもそもアルゴリズムに問題がないか?
オンメモリでもそれだけアクセスすればそれなりに遅いと思うぞ。
0528デフォルトの名無しさん
2007/10/29(月) 13:49:43仮に1nsで処理できる凄まじいコンピュータがあったとして、ざっと3億年掛かる計算だが。
0529デフォルトの名無しさん
2007/10/29(月) 14:58:18挿入後に現在入っているキューを全部表示するようにしたいのですが、最後に挿入した文字列しか表示されないです。
ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、
char型だとなぜこうなってしまうのでしょう?
実行結果(変数opがchar)
Operation(0:enqueue 2:quit)0
input string : a
String Queue : [a]
head[0] tail[1]
Operation(0:enqueue 2:quit)0
input string : b
String Queue : [b]
head[0] tail[1]
Operation(0:enqueue 2:quit)
実行結果(変数opがint)
Operation(0:enqueue 2:quit)0
input string : ab
String Queue : [ab]
head[0] tail[1]
Operation(0:enqueue 2:quit)0
input string : bc
String Queue : [ab] [bc]
head[0] tail[2]
Operation(0:enqueue 2:quit)
次レス以降にソースを書きます
05301/2
2007/10/29(月) 14:58:49#include "stdlib.h"
#include "string.h"
struct structQ { char Q[5];};
int next (int x){
if(x==4) return 0;
else return x+1;
}
void enqueue(char *s, int head, int *tail, structQ *AllQ){
if(next(*tail)==head) printf("OVERFLOW!\n");
else
{
strcpy(AllQ[*tail].Q, s);
*tail = next(*tail);
}
}
void printQueue(int head, int tail, structQ *AllQ){
int h;
printf("String Queue : ");
for(h=head; h!=tail; h =next(h))
printf("[%s] ", AllQ[h].Q);
printf("\n");
}
05312/2
2007/10/29(月) 14:59:25structQ *AllQ;
AllQ = (structQ *)malloc( sizeof(structQ)*(5) );
int head =0, tail =0;
char *s, str[100];
char op;
// int op;
while(1){
printf("Operation(0:enqueue 2:quit)");
scanf("%s", &op);
if(op == '0')
// scanf("%d", &op);
// if(op == 0)
{
printf("input string : ");
scanf("%s", str);
s = (char *)malloc( sizeof(char)*(strlen(str)+1) );
strcpy(s,str);
enqueue(s, head, &tail, AllQ);
free(s);
printQueue(head, tail, AllQ);
}
else if(op == '2')
// else if(op == 2)
break;//終了
else
printf("invalid ope number!\n");
printf("head[%d] tail[%d]\n", head, tail);
}
free(AllQ);
return 0;
}
0532デフォルトの名無しさん
2007/10/29(月) 15:05:00STL使っておけ
vector< string > x;
x.push_back("文字列");
x.push_back("名無しです");
x[0],x[1]で文字列にアクセスできる
0533デフォルトの名無しさん
2007/10/29(月) 15:09:27文字列を入力したいんなら、char じゃだめだろ
char には 1 文字しか入らない
char の配列にしないと
0534デフォルトの名無しさん
2007/10/29(月) 15:11:49突っ込みどころだらけ。
>#include "stdio.h"
cの規格にあるインクルードファイルは""で括ってはいけません。
また、一般的にプロジェクトローカルなもの以外は<>で括るべきです。
>ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、
%d指定で整数値を入力する場合、入力に失敗した場合は変数が更新されないので、「0と認識してしまう」というのは間違い。
>scanf("%s", &op);
文字型への%s指定は行なってはいけません。%sはあくまでも、文字列入力です。
この呼び出しで恐らくスタック領域の破壊が起こり、他の変数の値がおかしくなったせいでキュー登録に失敗した可能性があります。
0535デフォルトの名無しさん
2007/10/29(月) 15:12:45cにはSTLなどありません。スレタイも読めないくらい頭が回らないのであれば、無理に回答しなくて宜しいかと。
0536デフォルトの名無しさん
2007/10/29(月) 15:26:38opはオペレーションNoの取得なので、1文字です。
指定文字列の取得はchar str[100]に入れています。
>scanf("%s", str);
>>535
1文字入力の%cで
>scanf("%c", &op);
と変えてみました。
キューには格納されているようですが、変な出力結果になってしまいます。
実行結果
Operation(0:enqueue 2:quit)0
input string : ab
String Queue : [ab]
head[0] tail[1]
Operation(0:enqueue 2:quit)invalid ope number!
head[0] tail[1]
Operation(0:enqueue 2:quit)0
input string : bc
String Queue : [ab] [bc]
head[0] tail[2]
Operation(0:enqueue 2:quit)invalid ope number!
head[0] tail[2]
Operation(0:enqueue 2:quit)
0537デフォルトの名無しさん
2007/10/29(月) 15:30:17"%c"を" %c"にして味噌。
0538デフォルトの名無しさん
2007/10/29(月) 15:32:33できました!
ありがとうございます。
%cのスキャンにはスペースが必要なんですね。
実行結果
Operation(0:enqueue 2:quit)0
input string : ab
String Queue : [ab]
head[0] tail[1]
Operation(0:enqueue 2:quit)0
input string : bc
String Queue : [ab] [bc]
head[0] tail[2]
Operation(0:enqueue 2:quit)
0539デフォルトの名無しさん
2007/10/29(月) 15:35:11ファイルのデータをすべてmallocで確保したヒープ領域に読み込む。
1.fstat関数でファイルサイズを取得する。
2.そのファイルサイズ分をmallocし、そこにファイルの全レコードを読み込む。
レコードサイズ64バイトで10万レコードだと、6.4Mバイトほど。
3.検索はmallocで確保したバッファの中を検索する。
0540デフォルトの名無しさん
2007/10/29(月) 15:36:30いや、今回はたまたまその前の%sの喰い残しの改行文字を破棄する必要があるので、空白を入れることで回避したと言うだけ。
毎回空白が必要だと言うわけではない。
scanf()の振る舞いについて、下手な入門書に頼らずきちんと確認しておくことをお勧めしておきます。
因みに、printf()とscanf()の指定子を互換性があるかのごとく並列で解説しているような入門書が多く出回っていますが、
互換性はないものと思って理解しておく方が間違いがありません。
0541デフォルトの名無しさん
2007/10/29(月) 15:42:20scanfについて調べたら、改行の読み捨てが必要な場合があるみたいですね。
勉強になりました、ありがとうございます。
0542デフォルトの名無しさん
2007/10/29(月) 18:05:25$tripkey = "#istrip";
$tripkey = substr($tripkey,1,);
$salt = substr($tripkey.'H.',1,2);
$salt =~ s/[^\.-z]/\./go;
$salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/;
$trip = crypt($tripkey,$salt);
$trip = substr($trip,-10);
$trip = '◆'.$trip;
print "$trip";
0543デフォルトの名無しさん
2007/10/29(月) 19:59:390544デフォルトの名無しさん
2007/10/29(月) 20:36:420545デフォルトの名無しさん
2007/10/29(月) 20:47:480546デフォルトの名無しさん
2007/10/29(月) 20:51:06double x;;
char top[100] down[100],t,d;
小数点の一から始めて、下向きに数字を読み取ってdownにいれて
一より大きいなら上向きにtopに入れていく
最後に出力
0547デフォルトの名無しさん
2007/10/29(月) 21:53:10単なる思いつきで書いたから、特に色々とは突っ込まないで欲しい。
あと、こっちの環境ではまともに動いてくれない。 小数点の精度上、
下位ビットにゴミがあってそれを取り込んでしまう。
まぁ、その辺はなんとかしてくれい。
void DoubleToStr(double f) {
char up[256], down[256],temp;
int d = f, i = 0, j = 0;
double z = f;
do { up[i++] = d % 10 + '0';
d = d / 10;
} while (d != 0);
up[i++] = '.'; up[i] = '\0'; i-=2;
while (j < i) {
temp = up[j]; up[j] = up[i]; up[i] = temp;
++j; --i;
}
z = f; d = f; z = z - d; i = 0;
do { z = z * 10;
d = z;
down[i++] = d + '0';
z = z - (double)d;
} while (z != 0.0);
down[i] = '\0';
strcat(up, down);
printf("%s\n", up); }
0548プリンがー
2007/10/29(月) 22:16:02変数に求め、結果を出力するプログラムを書きなさい。
#include <stdio.h>
int main (void)
{
int i;
double a[100],max=0;
for(i=0;i<=100;i++){
scanf("%lf",&x[i]);
if(x[i]>max){
max=x[i];
}
}
printf("最大値は%fです。",max);
return(0) ;
}
これであってますか?
0551デフォルトの名無しさん
2007/10/29(月) 22:22:40double a[100]で100個用意したのはいいが
for(i=0;i<=100;i++){ の行で101個目にアクセスしてるだろ。
for(i=0;i<100;i++){ が正解
0552デフォルトの名無しさん
2007/10/29(月) 22:24:32配列に入れる必要性がわからんけど後でプログラムを拡張するのかな
0554プリンがー
2007/10/29(月) 23:00:39出力するプログラムを書きなさい。
#include <stdio.h>
int main (void)
{
int i;
for(i=1;i<=1000;i++){
if(i%2=0||i%3=0){
if(i%4!=0){
putchar('\n');
}
}
}
return(0);
}
これであってますか?
0555デフォルトの名無しさん
2007/10/29(月) 23:02:21//array copy
for(i=0; i < (size<<1); i++)
output[i] = input[i];
すみません、この二つの違いを教えてください。
初めに下のほうで計算していたら望む結果が出てこなくて
上のとおりやったら出来ました…
同じことをやっていると思ったのですが、どう違うのでしょうか
0556デフォルトの名無しさん
2007/10/29(月) 23:03:120557デフォルトの名無しさん
2007/10/29(月) 23:04:33回したら、ものすごい数の改行が出た。
0558デフォルトの名無しさん
2007/10/29(月) 23:07:51outputとinputの型によって差がでるんじゃないかな
0559プリンがー
2007/10/29(月) 23:08:15訂正
#include <stdio.h>
int main (void)
{
int i;
for(i=1;i<=1000;i++){
if((i%2==0||i%3==0)&&(i%4!=0)){
putchar('\n')
}
}
return(0);
}
これでいいでしょうか??
0560デフォルトの名無しさん
2007/10/29(月) 23:09:29○printf("%d ", i);
0562デフォルトの名無しさん
2007/10/29(月) 23:13:390563デフォルトの名無しさん
2007/10/29(月) 23:15:45どちらもint型のポインタ(1次元配列)なのですが。
単に求めた結果が出ればいいだけなら、これでいいのですが
初めのソースが合ってると信じて、違う原因がわからないのは自分でも納得がいかないので
0564デフォルトの名無しさん
2007/10/29(月) 23:15:5461 82 A0 0D 0A となりました。
ここからこの数を使って aあ と新たなファイルに表示させたいのですが、
a は出力できるのですが あ のやり方がわかりません。
どうしたら日本語の あ が出力できるんでしょうか。
ちなみにaは
char temp[50]
char moji[]="61";
strcpy(temp,"0x");
strcpy(temp,moji)
long int aa=strtol(temp,NULL,16);
fprintf(file,"%c",aa);
見たいな感じで出力しました。
0565デフォルトの名無しさん
2007/10/29(月) 23:22:43char tmp[10];
tmp[0] = (char)strtol("82", NULL, 16);
tmp[1] = (char)strtol("A0", NULL, 16);
tmp[2] = '\0';
printf("%s", tmp);
0566デフォルトの名無しさん
2007/10/29(月) 23:23:54その二つはinputとoutputがchar型配列でない限り、違う結果になる
>memcpy(input,output,size<<1);
ここの第三引数は、バイト単位でのサイズを指定する
>for(i=0; i < (size<<1); i++)
>output[i] = input[i];
こっちで指定するのは、配列の要素数
0567デフォルトの名無しさん
2007/10/29(月) 23:25:46printf("%c%c%c",0x61,0x82,0xA0);
0568デフォルトの名無しさん
2007/10/29(月) 23:26:00memcpyのsize<<1はバイトで
for文のsize<<1はint型(4バイト?)分になるんじゃないかな?
試してないから間違ってるかもしれないけど
0569デフォルトの名無しさん
2007/10/29(月) 23:31:11なるほど。。。と違いはわかったのですが
memcpyだとinputからoutputに何がコピーされているのか混乱してきました。
sizeはint型でinput分の要素数を表しています。
0 1 2 3 4 5 6 7 の要素が入っていて
それを計算したものをoutputに出力させているのです
for文の方をmemcpyと同じように働かせるにはどうしたらよいのでしょうか
0570デフォルトの名無しさん
2007/10/29(月) 23:31:45入力に何を与えたら何が出力されるのか書いてくれれば考えてみる
>>524 >>526 を読んだが訳分からんかった
検索のキーとなるのは64バイトの内最初の固定 n バイトだけ?(>>524 だと n=16)
1行64バイトって改行文字を含まずに64バイト?
読み込むファイルは検索途中で書き換えられる?
0571デフォルトの名無しさん
2007/10/29(月) 23:36:06要素数を表してるのになんでビットシフトしてるの?
0572デフォルトの名無しさん
2007/10/29(月) 23:39:320573デフォルトの名無しさん
2007/10/29(月) 23:40:24どちらもできましたありがとうございます。
0574デフォルトの名無しさん
2007/10/29(月) 23:40:48階差数列や漸加式をイメージしてもらいたいのですが
長さの半分の式を移していくという処理をやっています。
なんか頭が熱持ってきました。。。
0575デフォルトの名無しさん
2007/10/29(月) 23:41:57そうです、2^nの式です。。。わかるものなのですね
0576デフォルトの名無しさん
2007/10/29(月) 23:44:48sizeが正しく使われてるか確認した方がいいと思う。
0577デフォルトの名無しさん
2007/10/29(月) 23:48:59for(i=0; i < length<<1 ; i++)
input[i] = output[i];
…こうやったら、望む値が出てきました。。。。なぜ。。。。。
計算させるところを勘違いしていたのか、わけがわからなくなってきました。。。。
0578デフォルトの名無しさん
2007/10/29(月) 23:50:41なんかよく分からんが例として
int a[10],b[10],size=10,i;
//何らかの代入処理
memcpy(b,a,size * sizeof(int));
//↑は↓と等価
for(i=0; i < size; i++)
b[i] = [i];
こんなふうにする
あと今気付いたが、memcpyの第一引数と第二引数が反対になってるよ
第二引数がコピー元で、第一引数がコピー先
代入文と同じ順序ね
0579デフォルトの名無しさん
2007/10/29(月) 23:55:00ありがとうございます。ちょっと頭冷やして、ソースと頂いたレスを理解します。
ほんとなんかすみません
0580デフォルトの名無しさん
2007/10/30(火) 03:23:33sin^2(x)
(サインの二乗(x))
はどのようにプログラムに書けば良いのでしょうか?
0581デフォルトの名無しさん
2007/10/30(火) 03:34:41sin(x)の2乗ということですよね
#include <math.h>
sin(x)*sin(x) /* sin(x)の2畳 */
sin関数を2階呼ぶのが面倒なら
double y;
y = sin(x);
y*y
0582581
2007/10/30(火) 03:36:222乗なら掛け算で十分
0584デフォルトの名無しさん
2007/10/30(火) 03:46:080585デフォルトの名無しさん
2007/10/30(火) 03:51:51cos(2x) = cos^2(x) -sin^2(x) となる
cos^2(x) + sin^2(x) = 1 なので
1 - 2 sin^2(x) = cos(2x)
これより、(1+ cos(2x)) / 2 が求める値である
0587デフォルトの名無しさん
2007/10/30(火) 12:19:41>>581 より計算量増えてね?
0588デフォルトの名無しさん
2007/10/30(火) 12:48:58そもそも移項で間違ってる
0589デフォルトの名無しさん
2007/10/30(火) 12:55:03>>587
・関数呼び出しが一回でいい(cf.sin(x)*sin(x))
・一時的な代入がいらない(cf.y=sin(x);y=y*y;)
ってことでこの方法が一番いいかと
0590デフォルトの名無しさん
2007/10/30(火) 12:58:060591デフォルトの名無しさん
2007/10/30(火) 13:26:481 - cos(2x) なんて、 x = 0 の近辺で桁落ちして使い物にならないぞ。
double t = sin(x);
double s2x = t * t;
しか、ありえない。
0592デフォルトの名無しさん
2007/10/30(火) 13:34:290593デフォルトの名無しさん
2007/10/30(火) 15:50:05これはどういう意味があるのでしょうか
0594デフォルトの名無しさん
2007/10/30(火) 15:54:290595デフォルトの名無しさん
2007/10/30(火) 15:55:08構造体のポインタからメンバにアクセスするときはドット演算子ではなくこれを使う
0596デフォルトの名無しさん
2007/10/30(火) 15:57:52int x, y;
};
struct point p;
struct point *pp = &p;
があったとき、
(*pp).x = 1;
pp->x = 1;
が同じxに代入をしている。
構造体へのポインタを使う上での簡略化。
0597デフォルトの名無しさん
2007/10/30(火) 16:00:59ありがとうございました
0598デフォルトの名無しさん
2007/10/30(火) 17:29:440599デフォルトの名無しさん
2007/10/30(火) 19:46:39まずEUC-JPに統一する。
旧字体は新字体、カタカナはひらがなにする。
ひらがなと、新字体以外は登録しない。
出現可能な文字に0から順に番号をつけて、N-germ (2-germ) で登録していく
あと、ハッシュを使う為に全角2文字分を圧縮して20数ビットを使う
NKF32.DLL
http://www.vector.co.jp/soft/win95/util/se295331.html
旧字体→新字体
http://www.ritsumei.ac.jp/acd/cg/lt/cl/koten/newold.htm
http://yasuda.homeip.net/misima/misima_seiji_test.html
http://www.toyama-cmt.ac.jp/~kanagawa/language/kyuuji.html
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/old_chara.html
http://homepage3.nifty.com/jgrammar/ja/tools/tradkan0.htm
http://homepage3.nifty.com/jgrammar/ja/tools/ksimple.htm
0600デフォルトの名無しさん
2007/10/30(火) 19:56:23http://gihyo.jp/dev/serial/01/make-findspot
Googleの技術は凄いと思ったがMooterっていうサイトがGoogleを上回る検索力らしい
Mooter
http://www.mooter.co.jp/
辞書不要の形態素解析エンジン「マリモ」とは
http://www.atmarkit.co.jp/news/200708/15/mooter.html
形態素解析について
http://www.gengokk.co.jp/thebun.htm
http://mecab.sourceforge.net/feature.html
Google の秘密 - PageRank 徹底解説
http://www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html
PageRankの基本概念
http://tnt.math.metro-u.ac.jp/labo/grad/2004/masa/graph/6.html
0601デフォルトの名無しさん
2007/10/30(火) 19:58:27ガンバレ
そしてこのスレに来るな
0602デフォルトの名無しさん
2007/10/30(火) 22:36:040603デフォルトの名無しさん
2007/10/30(火) 22:39:420604デフォルトの名無しさん
2007/10/30(火) 22:39:560605デフォルトの名無しさん
2007/10/30(火) 22:41:46このばあい、関数へのポインターを引数で渡します。
例)
コールバック関数
リストに要素をつなげるときに大小比較関数
0606デフォルトの名無しさん
2007/10/30(火) 22:44:33void qsort(void *base, size_t num, size_t size,
int (*compare)(const void*, const void*))
この、int (*compare)(const void*, const void*)が関数ポインターで
この場合はソートの並びを呼び出し側で制御できるようにしている。
0607デフォルトの名無しさん
2007/10/30(火) 22:56:19複数の機能(=関数の数)を内包する関数で、引数の指定によって機能を使い分ける場合ってことかな?
でもそれって単なる文字列でも振り分け可能な気がするなぁ…やっぱりわからん。
0608デフォルトの名無しさん
2007/10/30(火) 22:59:49単に引数で文字列を渡すだけじゃ、qsortの作者が想定している型やソート方法しか対応できない
0609デフォルトの名無しさん
2007/10/30(火) 23:03:25ためしに qsort を使ってみろ
数値のソート、文字列のソート、自前構造体のソート・・・
そしたらわかる
0610デフォルトの名無しさん
2007/10/30(火) 23:04:51一人で作業する分にはあまり使う必要無いと思う
0611デフォルトの名無しさん
2007/10/30(火) 23:35:24そしてどんな比較関数でも同じ手続きで利用するために、関数へのポインタを使っている。
…で合ってる?
0612デフォルトの名無しさん
2007/10/30(火) 23:37:46あれ覚えるのやっかいだし
0613デフォルトの名無しさん
2007/10/30(火) 23:38:330614デフォルトの名無しさん
2007/10/30(火) 23:50:45いっぺん練習で、全ての変数をポインタとmallocでコーディングしたらイヤでも理解出来るよ。
0615デフォルトの名無しさん
2007/10/31(水) 00:00:58指定できますか?
0616デフォルトの名無しさん
2007/10/31(水) 00:29:420617プリンがー
2007/10/31(水) 00:47:58S=a1b1+a2b2+-----a10b10を計算せよ。
#include <stdio.h>
int main (void)
{
int i,a[10],b[10];
int S;
for(i=1;i<=10;i++){
scanf("%d",&a[i]);
scanf("%d",&b[i]);
S+=a[i]b[i]
}
printf("積和は%dです。\n",S);
return(0);
}
これであってますか??
0618デフォルトの名無しさん
2007/10/31(水) 00:49:34・Sの初期化がされていない。
・a[i]*b[i];
0619デフォルトの名無しさん
2007/10/31(水) 00:49:35>S+=a[i]b[i]
とりあえずコレが間違ってる
*と;が足りない
0621デフォルトの名無しさん
2007/10/31(水) 01:12:26セミコロン(;)忘れるなよ
0622プリンがー
2007/10/31(水) 01:31:530623デフォルトの名無しさん
2007/10/31(水) 02:04:27unsigned char afo_1,afo_2,afo_3,...afo_n;
とafo_1からafo_nまで宣言したい時はどうしたら良いですか?
0624デフォルトの名無しさん
2007/10/31(水) 02:09:22配列じゃダメなの?n=10なら
unsigned char afo[10];
配列の各要素へのアクセスは添字を指定する。
afo[0] = 'a';
afo[1] = 'b';
〜
afo[9] = 'j';
0625デフォルトの名無しさん
2007/10/31(水) 02:09:30全部書くしかない。
配列でいいなら配列使え。
0626623
2007/10/31(水) 02:15:12nが決まった値では無いので、今の路線は無理ですねー。。
配列で頑張ってみます。夜遅いのにすみません。素早い対応ありがとうございます。
0627627
2007/10/31(水) 04:16:28どうしても実行後うまくいきません
簡単なプログラムで
入力された文字を”#”で表すというものですが
指摘お願いします
http://upsurusuru.hp.infoseek.co.jp/index.html
にアップしましたので怪しいむと思いますが
助けてくださいお願いします
07/10/31(Wed),04:10:07
この時刻にアップしました
拡張子を.cに変更してください
だれかおねがいします
0628デフォルトの名無しさん
2007/10/31(水) 04:30:05うちの環境だとコンパイルできないから確認してないけど、
isalphaとisdigitが逆なんでねーの?
0629Pもかっこわりぃなぁ
2007/10/31(水) 10:42:33どうでもいいけど、ABCDEFGHIしKLMNOPQRSTUVWXYZになっている。
0630デフォルトの名無しさん
2007/10/31(水) 13:33:380631デフォルトの名無しさん
2007/10/31(水) 13:43:360632デフォルトの名無しさん
2007/10/31(水) 14:07:340633デフォルトの名無しさん
2007/10/31(水) 14:20:545点
0634デフォルトの名無しさん
2007/10/31(水) 14:58:30例)
enterを押すと計算をするみたいに
enterキーが押されたっていう結果をどうやって取り込むか教えてください
0635デフォルトの名無しさん
2007/10/31(水) 15:09:11いいえ
”ではなく"を使いましょう
0636デフォルトの名無しさん
2007/10/31(水) 15:21:24getchar()でもしておいたら?
0637デフォルトの名無しさん
2007/10/31(水) 15:28:13環境による。つかキーボードドライバの仕様による。
0638デフォルトの名無しさん
2007/10/31(水) 16:35:44コンソールで?
ウィンドウで?
0639デフォルトの名無しさん
2007/10/31(水) 16:41:080640デフォルトの名無しさん
2007/10/31(水) 17:22:57>>639
>>639
0642デフォルトの名無しさん
2007/10/31(水) 23:16:08MS-DOSで実行した場合int型って2バイトづつのメモリじゃん?
でもXP上で実行したらint型だと4バイトづつになって超悩んでた結果、
16ビットマシンと32ビットマシンって事って始めて知ったよ・・・
0643デフォルトの名無しさん
2007/10/31(水) 23:23:53のJAVAの関数を
memcpy(コピー先,コピー元,, n バイト分)
に置き換えたいのですが
要素数をnバイト分であらわすか、
nバイト分を要素数に変えるにはどうすればいいか教えてください
sizeof(nバイト分)ではダメでした
0644デフォルトの名無しさん
2007/10/31(水) 23:24:58sizeof(要素)*要素数
0645デフォルトの名無しさん
2007/10/31(水) 23:27:05その発想は無かったわ
0646デフォルトの名無しさん
2007/10/31(水) 23:38:59できました!!!!!!!!!!!!!!!!!!!11
すいませんが、何をやっているのか教えていただけませんか?
>>645
バカですいません
0647デフォルトの名無しさん
2007/10/31(水) 23:50:11sizeof(要素)で1つあたりのバイト数が出る
要素数をかけ算すればn バイト分が求まる。
かけ算は小学校三年生だっけ?
0648デフォルトの名無しさん
2007/10/31(水) 23:55:23memcpyではあくまでバイトを扱うのであって
要素数分のバイトを3つ目に入れないとダメなわけですね。。。ありがとうございました
0649デフォルトの名無しさん
2007/11/01(木) 01:53:40使い方完全に理解してるのかな?
関数の中の関数とかどうやって見るの?
0650デフォルトの名無しさん
2007/11/01(木) 02:03:28コンソールって何のことだと思ってんの?
0651デフォルトの名無しさん
2007/11/01(木) 07:16:51if ((pi = malloc(sizeof(unsigned int *) * 32)) == NULL)
{
fputs("しっぱい", stdout);
exit(0);
}
for (i = 0; i < 32; i++)
{
if ((pi[i] = malloc(sizeof(unsigned int))) == NULL)
{
fputs("しっぱい", stdout);
exit(0);
}
}
for (i = 0; i < 32; i++)
{
fprintf(stdout, "%8u %8u", pi[i], &pi[i][4]);
fputc('\n', stdout);
}
for (i = 0; i < 32; i++) free(pi[i]);
free(pi);
return 0;
pi[i][4] と pi[i + 1][0] のアドレスが一緒になっちゃうんだけど、なんで?
0653デフォルトの名無しさん
2007/11/01(木) 07:37:41ウィンドウって何のことなの?
0654デフォルトの名無しさん
2007/11/01(木) 12:06:05typedef struct bridge{
int a;
int b;
int c;
}DATA;
DATA m[5][5];
こんな感じです。
0655デフォルトの名無しさん
2007/11/01(木) 12:09:010656デフォルトの名無しさん
2007/11/01(木) 12:10:10すばやいレスありがとうございます。
0657デフォルトの名無しさん
2007/11/01(木) 13:21:06typedef struct bridge{
int a;
int b;
int c;
}DATA;
DATA m[5][5] = {
{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},
{-1,0,0},{0,0,0},{0,0,2},{0,0,0},{-1,0,0},
{-1,0,0},{0,1,5},{0,0,0},{0,1,3},{-1,0,0},
{-1,0,0},{0,0,0},{0,1,2},{0,0,0},{-1,0,0},
{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0}
};
構造体を二次元配列で宣言する場合はどのようにすればよいのでしょうか。
アドバイスお願いします。
0658デフォルトの名無しさん
2007/11/01(木) 13:32:45DATA m[5][5] = {
{{-1, 0, 0}, ...},
...
};
0659デフォルトの名無しさん
2007/11/01(木) 13:40:09本当に申し訳ありません。
単純なミスでしたorz
ありがとうございます。
0660デフォルトの名無しさん
2007/11/01(木) 14:29:42CUI || GUI ?
0661デフォルトの名無しさん
2007/11/01(木) 14:57:270662デフォルトの名無しさん
2007/11/01(木) 15:05:21char ci[100];
int i = 2007;
sprintf(ci, "%d", i);
0663デフォルトの名無しさん
2007/11/01(木) 15:09:29さすがエスパー
0664デフォルトの名無しさん
2007/11/01(木) 15:12:44ありがとうございます!
0665デフォルトの名無しさん
2007/11/01(木) 16:18:05ttp://www.excite.co.jp/dictionary/english_japanese/?search=CONSOLE&match=beginswith&dictionary=NEW_EJJE&block=36319&offset=400
0666デフォルトの名無しさん
2007/11/01(木) 16:20:06こっちのほうが解りやすいかな。
ttp://www.excite.co.jp/dictionary/japanese/?search=%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB&match=beginswith&itemid=07660600
0667デフォルトの名無しさん
2007/11/01(木) 16:25:24え?
>>634
のプログラムの話なんだけどなんなの?
0668デフォルトの名無しさん
2007/11/01(木) 20:52:53*pだとしたら
p = &a ってアドレスのみ格納?
でこの場合
*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。
これでいいのかい!?
でポインタのポインタとかイミフ!
0669デフォルトの名無しさん
2007/11/01(木) 21:04:02>*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。
>これでいいのかい!?
まあ大体はおk
>でポインタのポインタとかイミフ!
単純に上のaがポインタだと考えればいいんだよ
0670デフォルトの名無しさん
2007/11/01(木) 21:33:12ソノハッソウハナカッタワ
すげー単純にわかった。thx
0671デフォルトの名無しさん
2007/11/01(木) 22:42:44{
aiai = rand();
if (aiai >= 0 && aiai <= 100)
{
count2 = 0;
while(count2 < 3)
{
test[count][count2] = aiai;
count2++;
printf("%4d ",test[count][count2]);
}
printf("\n");
count++;
}
配列二次元目をまず3つ埋めた後、
縦に20個の繰り返しで乱数での数字を埋めたいんだけど、
どーもcount2が機能してないみたいで、全部初期化した0が返ってくる。
なんでなんだぜ?
二次元目って変数指定できないの?
0672デフォルトの名無しさん
2007/11/01(木) 22:43:48それはご愛嬌で><
0673デフォルトの名無しさん
2007/11/01(木) 22:47:36よくよく見直したら
count2++;
printf("%4d ",test[count][count2]);
これ処理の順番逆でした・・・。
0674プリンがー
2007/11/02(金) 00:35:43x(エックスバーってどうやったら入力できますか?
0675デフォルトの名無しさん
2007/11/02(金) 00:36:39http://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%AF%E3%82%B9%E3%82%AB%E3%83%AA%E3%83%90%E3%83%BC
0676デフォルトの名無しさん
2007/11/02(金) 01:12:30乱数のrand()を使って勝、負のとこを帰れば丁、半にかえるプログラムですが
これで問題はないでしょうか?
#include <stdlib.h>
main(){
int a;
a= rand() % 2;
if(a==1){
printf("勝");
}else{
printf("負");
}
}
プログラムの意味でifは基本なのでわかりますが
↓ここの部分があまりよく分からないんですが
a= rand() % 2;
if(a==1){
%2は2つの数のどちらかを出すと考えたのですがそれでよろしいでしょうか?
a==1のとき勝が表示されます。
a= rand() % 2で1が表示された場合
elseはa==0ということで負と表示されていると考えていのでしょうか?
応用として甲、乙、丙をランダムに表示させる場合はif(a==2)、else if(a==1)、else
として甲、乙、丙を表示させると考えるとかんがえていいのでしょうか?
分かる方がいればよろしくお願いします。
初心者用の参考書には乱数関係の説明がほとんどないんで…。
0677デフォルトの名無しさん
2007/11/02(金) 01:14:180678デフォルトの名無しさん
2007/11/02(金) 01:15:57int main(void)
{
while(1)
{
float kyori;
int ryokin;
printf("距離?"); scanf("%f", &kyori);
if(kyori <= 0.0) return;
for(ryokin = 1300; kyori > 8.0; kyori -= 2.0) ryokin += 200;
if(kyori <= 5.0) ryokin = 870;
if(kyori <= 3.0) ryokin = 550;
if(kyori <= 2.0) ryokin = 380;
printf("料金 : %d\n", ryokin);
}
}
↑のプログラミングリストでfloatの型使わないで表すとどうなるでしょうか?
お願いします
0679デフォルトの名無しさん
2007/11/02(金) 01:19:400680デフォルトの名無しさん
2007/11/02(金) 01:28:03rand()は0以上RAND_MAX以下の整数を返す関数
%2は2で割った余り(剰余)を求める
2で割った余りは0か1だからrand()%2は0か1どちらかをランダムに生成するという意味
甲乙丙なら3種類の乱数(0,1,2)をランダムに生成すればいいからrand()%3とすればいい
0681デフォルトの名無しさん
2007/11/02(金) 06:18:49>680
ありがとう。
rand()%◆では◆で割った余りをランダムに表示させるという方法で
乱数をだしているんですね。
>677
それは分かるんです。質問の仕方が悪かったようで申し訳ないです。
0682デフォルトの名無しさん
2007/11/02(金) 10:10:230683デフォルトの名無しさん
2007/11/02(金) 10:50:31char *const *pp = &p;
pp = foo // 可能?
*pp = bar // 可能?
char *const *ppとあるとき、
*constと*はどっちが元のもの?
ポインタのポインタのポインタの…は、
どっち方向に * が伸びていくの?
0684デフォルトの名無しさん
2007/11/02(金) 12:18:41fooとbarは何の型?
0685デフォルトの名無しさん
2007/11/02(金) 12:29:03char *const p = &c;
char *const *pp = &p;
char *const **ppp = &pp;
char *const ***pppp = &ppp;
pp = foo; // 可能
*pp = bar; // 不可能
**pp = hoge; // 可能
0686デフォルトの名無しさん
2007/11/02(金) 12:41:26はconstなchar* のポインタ
char const **pp
はconstなcharのポインタのポインタ
と認識してるけど・・・
char *const p;
char *const *pp = &p; //OK
char const *p;
char *const *pp = &p; //NG
0687デフォルトの名無しさん
2007/11/02(金) 14:14:02charへのconstポインタへのポインタ?
charへのポインタへのconstポインタ?
char **const p
charへのconstポインタへのconstポインタ?
charへのポインタへのconstポインタ?(char *(*const) p相当?)
0688デフォルトの名無しさん
2007/11/02(金) 14:15:29char *const *pp
はcharへのconstポインタへのポインタ、ということになる。
0689デフォルトの名無しさん
2007/11/02(金) 14:17:26charへのconstポインタへのポインタ
>char **const p
charへのポインタへのconstポインタ
>charへのconstポインタへのconstポインタ?
それは char *const *const p; と書く
0690デフォルトの名無しさん
2007/11/02(金) 15:58:450691デフォルトの名無しさん
2007/11/02(金) 17:28:040692デフォルトの名無しさん
2007/11/02(金) 17:50:59ポインタじゃないただの変数の場合、constあり/なしの2種類しかない。
char c;
const char c;
ポインタには、指す先のconstあり/なしとポインタ自体のconstあり/なしがあるから、全部で4通りになる。
charへのポインタ … char *p;
charへのconstポインタ … char *const p;
const charへのポインタ … const char *p;
const charへのconstポインタ … const char *const p;
ポインタを指すポインタは、指す先が4種類あって、ポインタ自体のconstあり/なしもあるから、全部で8通り。
charへのポインタ へのポインタ … char **p;
charへのconstポインタ へのポインタ … char *const *p;
const charへのポインタ へのポインタ … const char **p;
const charへのconstポインタ へのポインタ … const char *const *p;
charへのポインタ へのconstポインタ … char **const p;
charへのconstポインタ へのconstポインタ … char *const *const p;
const charへのポインタ へのconstポインタ … const char **const p;
const charへのconstポインタ へのconstポインタ … const char *const *const p;
0694デフォルトの名無しさん
2007/11/02(金) 17:56:010695デフォルトの名無しさん
2007/11/02(金) 18:01:20const char **const p;
の場合、右から順に考えて
p が const
*p はノーマル
**p が const
という風に機械的に解釈するといいらしい
0696デフォルトの名無しさん
2007/11/02(金) 18:03:180697デフォルトの名無しさん
2007/11/02(金) 18:09:13実際のプログラムで活用されるの?
なんか、>>692とかわけわかめなんだ。
0698プリンがー
2007/11/02(金) 18:11:37#include <stdio.h>
int main (void)
{
double height teihen;
double S;
printf("height=");
scanf("%lf",&height);
printf("teihen=");
scanf("%lf",&height);
S=height*teihen/2;
printf("面積S=%f\n",S);
}
これであってますか?
0699プリンがー
2007/11/02(金) 18:20:13#include <stdio.h>
int main (void)
{
int i;
double e;
for(i=1;i<=10;i++){
e+=0.1+1/i!:
}
printf("e=%f\n",e);
return(0);
}
あってます?
0700デフォルトの名無しさん
2007/11/02(金) 18:21:53どこらへんがおいしいの?
0702デフォルトの名無しさん
2007/11/02(金) 18:23:540703デフォルトの名無しさん
2007/11/02(金) 18:27:18例えば、
Manpage of QSORT
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/qsort.3.html
に、(char * const *) p1が出てくる。
0704デフォルトの名無しさん
2007/11/02(金) 18:34:47eが初期化してない。
1/i!なんて式初めて見た。
0705デフォルトの名無しさん
2007/11/02(金) 18:38:43のケースだと i! はいつも 0 になり、ゼロディバイドw
0706デフォルトの名無しさん
2007/11/02(金) 18:43:07!iならそうだろうけど・・・。
i!でもおk
0707デフォルトの名無しさん
2007/11/02(金) 18:52:45thx
使うときは使うんだな。もっかいポインタやりなおすわ。
0709デフォルトの名無しさん
2007/11/02(金) 19:14:25printf("teihen=");
scanf("%lf",&height); // テーヘンだ!テーヘンだ!
0711デフォルトの名無しさん
2007/11/02(金) 19:21:09>>698の自分のプログラムをよく見ましょう
単純なケアレスミス
あとCにはi!なんて記法は存在しません
0713デフォルトの名無しさん
2007/11/02(金) 19:29:56まずn!の意味を考えると・・・
n! = 1*2*3*4*5 ・・・ * n
だ
あとはそれをプログラムするだけ。
0715デフォルトの名無しさん
2007/11/02(金) 19:38:140716デフォルトの名無しさん
2007/11/02(金) 19:38:21まず問題の前に書式の勉強をしておいで。
0717プリンがー
2007/11/02(金) 19:40:320718プリンがー
2007/11/02(金) 19:46:230719デフォルトの名無しさん
2007/11/02(金) 19:58:25勉強がんばれ
0721プリンがー
2007/11/02(金) 20:47:49これって関数使わずにプログラム作れますか?
0722デフォルトの名無しさん
2007/11/02(金) 20:51:060724デフォルトの名無しさん
2007/11/02(金) 20:51:530726デフォルトの名無しさん
2007/11/02(金) 20:52:240727デフォルトの名無しさん
2007/11/02(金) 20:53:000728デフォルトの名無しさん
2007/11/02(金) 20:53:24そんなのしなくても出来る。
まずn!を計算する処理を考える、
それが出来たらnn!を計算する処理を考える
それが出来たら1/nn!を計算する処理を考える。
0729デフォルトの名無しさん
2007/11/02(金) 20:55:000731デフォルトの名無しさん
2007/11/02(金) 20:55:590733デフォルトの名無しさん
2007/11/02(金) 21:04:13二重ループは知ってる?
0735デフォルトの名無しさん
2007/11/02(金) 21:07:420736デフォルトの名無しさん
2007/11/02(金) 21:12:35考え方だけ参考にして。ちなみに行儀の悪いコーディングの例でもあります
#include<stdio.h>
int main(void){int i,n=10;
double e=1.0,x=1.0;for(i=1;
i<=n;i++)e+=(x/=i);printf(
"%f\n",e);return 0;}
0738デフォルトの名無しさん
2007/11/02(金) 21:27:23何故そう思う?
0739プリンがー
2007/11/02(金) 21:42:12n=10はiの範囲のうち。x=1.0はe+=1.0/iの1.0はiを格上げするため。
double/int→doubleここはなんて説明すればいいのか・・・
0740プリンがー
2007/11/02(金) 21:43:380742デフォルトの名無しさん
2007/11/02(金) 21:45:000744デフォルトの名無しさん
2007/11/02(金) 21:58:27x /= i
は
x = x/i;
のこと。
x/iをxに代入する。
0745デフォルトの名無しさん
2007/11/02(金) 21:58:46e=1 + 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9 + 1/10
ってことになるよ
とりあえず x の値を表示させてみては?
0747デフォルトの名無しさん
2007/11/02(金) 22:17:12じゃあ1/3!は 0.5/3だって理解は出来る?
同様に 1/4!は 0.166/4
0748デフォルトの名無しさん
2007/11/02(金) 22:21:55前回のループで計算したxが分子だよ
0750デフォルトの名無しさん
2007/11/02(金) 22:26:12そうそう。
あれ、分子が1.0のまんま?はて?
0752デフォルトの名無しさん
2007/11/02(金) 22:29:31x = x / i;
e = e + x;
xのところに直値で1.0を入れることはできない
0753デフォルトの名無しさん
2007/11/02(金) 22:29:48つまり分子は1.0のままではない。って事。
1/3!=(1/2!)/3
1/4!=(1/3!)/4
1/5!=(1/4!)/5
0754プリンがー
2007/11/02(金) 22:33:33てか階乗の意味ってもともと
1/3!=(1/2!)/3
1/4!=(1/3!)/4
1/5!=(1/4!)/5
なの?
1/3!=1/1*2*3
1/4!=1/1*2*3*4
1/5!=1/1*2*3*4*5
じゃなくて?
0755デフォルトの名無しさん
2007/11/02(金) 22:34:04if文が全般的に違うようです。
#include<stdio.h>
main() {
int year(void);
printf("西暦・・・");
scanf("%d", &year);
if(year % 12 = 2) {printf("%d 年は戌年",year);}
else if(year % 12 = 3) {printf("%d年は亥年\n",year);}
else if(year % 12 = 4) {printf("%d年は子年\n",year);}
else if(year % 12 = 5) {printf("%d年は丑年\n",year);}
else if(year % 12 = 6) {printf("%d年は寅年\n",year);}
else if(year % 12 = 7) {printf("%d年は卯年\n",year);}
else if(year % 12 = 8) {printf("%d年は辰年\n",year);}
else if(year % 12 = 9) {printf("%d年は巳年\n",year);}
else if(year % 12 = 10) {printf("%d年は午年\n",year);}
else if(year % 12 = 11) {printf("%d年は未年\n",year);}
else if(year % 12 = 0) {printf("%d年は申年\n",year);}
else {printf("%d年は酉年\n",year);}
return 0;
}
0756デフォルトの名無しさん
2007/11/02(金) 22:35:47意味は同じでしょ?
結果が同じならおk
0757デフォルトの名無しさん
2007/11/02(金) 22:36:03比較は == で
0758デフォルトの名無しさん
2007/11/02(金) 22:36:26switchで頼むわ・・・。
0759デフォルトの名無しさん
2007/11/02(金) 22:37:310760デフォルトの名無しさん
2007/11/02(金) 22:38:110761デフォルトの名無しさん
2007/11/02(金) 22:38:14って関数じゃなくて変数の宣言をしたいんじゃないの
0762デフォルトの名無しさん
2007/11/02(金) 22:50:41お前らそんな一気に言ったら>>755が可哀想だろw
>>755
これを参考に。
#include<stdio.h>
const char *eto[] = {"申年","酉年","戌年","亥年","子年","丑年","寅年","卯年","辰年","巳年","午年","未年"}
int main(){
int year;
printf("西暦・・・");
scanf("%d", &year);
printf("%d年は%s",year, eto[year%12]);
return 0;
}
0763デフォルトの名無しさん
2007/11/02(金) 22:54:15year にゲタをはかせて、テーブル自体は 「子」 から始まって 「亥」 で終わって欲しい
0764デフォルトの名無しさん
2007/11/02(金) 22:57:06ああ、まあ、そっちの方が綺麗か
適当に脳内修正しといて
0767デフォルトの名無しさん
2007/11/02(金) 23:29:09それで警告が出るようにコンパイラオプションを指定しろ。
VC++なら/W4、gccなら-Wallとか。
0768デフォルトの名無しさん
2007/11/02(金) 23:30:170769デフォルトの名無しさん
2007/11/02(金) 23:30:30警告っていうか、エラーにならないか?
0770プリンがー
2007/11/02(金) 23:43:00このときのi++は0.1刻みに増え(i=i+0.1)ますか?
それとも1ずつ増え(i=i+1)ますか?
0771デフォルトの名無しさん
2007/11/02(金) 23:44:47やってみればいいじゃないか?
0772デフォルトの名無しさん
2007/11/02(金) 23:46:460773デフォルトの名無しさん
2007/11/02(金) 23:47:050.1刻みに増えると思う根拠は何だい?
0775デフォルトの名無しさん
2007/11/02(金) 23:47:23基本的にループ変数にfloatやdoubleを使うのはトラブルの元だよ
累積誤差が無視できない
0777デフォルトの名無しさん
2007/11/02(金) 23:48:42今すぐインストールしなさい
0778デフォルトの名無しさん
2007/11/02(金) 23:50:400779プリンがー
2007/11/02(金) 23:52:08例えばy=x^3-x^2を1.5から8.5まで0.1ずつ変化させたときのyの値を
出力せよ。の場合ループを使わざるを得ないよね!?
0780デフォルトの名無しさん
2007/11/02(金) 23:53:06そういう時は i += 0.1であって i++ではない。
0781デフォルトの名無しさん
2007/11/02(金) 23:53:16ループは使うがループ変数は整数型でもできる
0782デフォルトの名無しさん
2007/11/02(金) 23:53:56ループ変数にはintを使ってループの中で10.で割って使う
0784デフォルトの名無しさん
2007/11/02(金) 23:54:45どのように作ればいいですか?
0785デフォルトの名無しさん
2007/11/02(金) 23:55:36C標準だけではできない
割り込みとかポーリングとかOSやハードウェアをいじくる
0786デフォルトの名無しさん
2007/11/02(金) 23:56:04google先生に 無料のコンパイラは無いか聞いてみれ
0789デフォルトの名無しさん
2007/11/03(土) 00:00:20本に付属してるものならともかく今時の入門者はコンパイラ単体で買うのは珍しいと思う
いろんなコンパイラがネットから無料でダウンロードできるしね
0790デフォルトの名無しさん
2007/11/03(土) 00:00:53今すぐ聞け
0792デフォルトの名無しさん
2007/11/03(土) 00:11:12特殊な環境用のコンパイラは買わないと無いかも知れない (PIC用とか)
MS-Windows とか MacOS とか Linux ならフリーのコンパイラがある
勉強ならパソコンでやればいい
0793デフォルトの名無しさん
2007/11/03(土) 00:13:410796デフォルトの名無しさん
2007/11/03(土) 02:28:17喪前みたいにこんなに物覚えが悪い馬鹿が実際にコンパイルしないで効率落としてたら迷惑だ。
とっととコンパイラをインストールしてこい。
コンパイラなしに勉強したいなら、もう少し他人の書き込みを注意深く読めるようになってからにしろ。
0797デフォルトの名無しさん
2007/11/03(土) 02:40:36#include<stdio.h>
int tosi(int a,int b);
return a - b;
main() {
int year;
printf("あなたの生まれた年は?\n");
scanf("%d",&year);
printf("あなたは今年%d歳\n",tosi(2007,year));
return 0;
}
0798デフォルトの名無しさん
2007/11/03(土) 02:43:29構文
0799デフォルトの名無しさん
2007/11/03(土) 03:46:22改行で入力終了にしたいのですが,どうすればいいですか?
1 1 0 0 1 0 1 1 改行
で入力を終了したいです。
教えてください。よろしくお願いします。
//---- 配列入力
num = 0;
do {
scanf("%d", &arr[num]);
} while ( arr[num++] != EOF ); // 改行は入力の終了
num--; // 有効な入力数
0800デフォルトの名無しさん
2007/11/03(土) 04:28:06それらが自分自身のメモリサイズを知っているのは何故なんですか?
例えば、
int a[3]={1,2,3};
printf("%d",*(a+1));
とかって場合、*(a+1)の+1がint分オフセットするって記憶している場所ってどこなんでしょう??
0801デフォルトの名無しさん
2007/11/03(土) 04:30:230802デフォルトの名無しさん
2007/11/03(土) 04:34:20キニスルナ
あえて言うならコンパイラさんの秘密の小部屋の中だ
0803デフォルトの名無しさん
2007/11/03(土) 04:45:16http://www.youtube.com/watch?v=9OHe2h3sZL0
0804デフォルトの名無しさん
2007/11/03(土) 04:49:05そういう風に作られているからとしか言いようがない
CPUが変わるとコンパイラ変えないとだめでしょ?
0805デフォルトの名無しさん
2007/11/03(土) 04:49:31ぅぅ…気になる。。
けど我慢します。
ありがとうございました。
どっかのメモリ上にいるんだろうけど…。
それを参照出来ないのかな…。。
気になる…寝れない。
0806デフォルトの名無しさん
2007/11/03(土) 04:51:21そんなに気になるならアセンブラ勉強しろ
大抵のコンパイラはソース吐かせられるようになっているから
それを見れば一目瞭然なんだが
0807デフォルトの名無しさん
2007/11/03(土) 04:53:43あ、なるほど。
レジスタにもメモリにもディスクにも記憶されてないんですね!?
ただ単にオフセットしたりする順序が(機械語レベルで)書かれているんですかね。
なんとなく想像付きました。
0808デフォルトの名無しさん
2007/11/03(土) 04:57:45intやcharのオフセットサイズが知りたいのならsizeof(int)でおk
但し、これらの結果は環境に依存するから注意が必要だ
0809デフォルトの名無しさん
2007/11/03(土) 05:01:20CPUのアドレッシングモードを活用している場合もある
例えばx86のintならレジスタに+04hずつ足しながらレジスタ+レジスタで
アドレスを算出している事が多い
RISCの場合は完全にコード内に組み込まれてしまう場合が多いね
0810デフォルトの名無しさん
2007/11/03(土) 05:02:23int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "ないよう", "たいとる", MB_OK);
return 0;
}
XP2、VC++2005Express、cl.exeなんですが、たったこれだけのソースなのに以下のエラーが出てコンパイルできません。
なんでなんだぜ?
test.obj : error LNK2019: 未解決の外部シンボル __imp__MessageBoxA@16 が関数 _WinMain@16 で参照されました。
test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
0811デフォルトの名無しさん
2007/11/03(土) 05:43:32自分で作ったプログラムでは、再帰処理を用いたせいかやたら速度が遅く、
辺の数を増やすと数時間では終わらなくなってしまいます。
なるべく関数を再帰呼び出ししないように無駄な探索は再帰前にチェックさせたのですが、それでも遅いです。
再帰を非再帰にしたいのですが、自分の技量ではまったく記述が浮かびませんでした。
再帰の内容は、開始位置から上下左右の4つの方向にそれぞれ移動させ、さらに再帰でその処理を繰り返しながら
目的位置までの経路を探索する、というものです。
どうすれば、非再帰にできるか助言頂けないでしょうか?
0812デフォルトの名無しさん
2007/11/03(土) 06:08:110813デフォルトの名無しさん
2007/11/03(土) 06:17:14経路データをどう与えるんだ? あと一筆書きするって事?
0814デフォルトの名無しさん
2007/11/03(土) 06:26:38ただし(a,b)書いたときa<bとしaとbはつながっているとする
前回にすすんだ経路を記録しておいて、進んだときにその経路を消していけばいいのでは?
戻るときは前回のデータを復元していく
たとえば、A=(a1,a2)などとして、ABCDEFGという繋がりが与えられれば、各段階でAからGの経路へ進めるということを繰り返す
初めに(進めるとして)Aへ進めたらBCDEFGが残る 次にAを進めようとするがここは残っていない BCD・・・とチェックしていく
0815デフォルトの名無しさん
2007/11/03(土) 06:36:49探索の深さ d
現在の探索位置 k0,・・・k(N-1)
現在位置 x
i = 0・・・N-1
xから繋がり(ai,bi)で移動できるか 出来るならkd = i、d++ とし繋がりを消す すべての繋がりがなくなれば成功でリターンする
どの繋がりにも行けないならd--。kdのつながりを復元して上へ戻る
もしd=0なら失敗でリターンする
0816815
2007/11/03(土) 06:44:370817デフォルトの名無しさん
2007/11/03(土) 06:57:02経路の総数なら数式で出したほうがラクだと思うが。
0818815
2007/11/03(土) 07:15:55#include <iostream>
#include <time.h>
using namespace std;
main(){
unsigned int A[32768];
int n,a,b,c;
for(n=0;n<32768;n++)A[n];
for(n=0;n<20000;n++){
a=rand()%1024;b=rand()%1024;
if(a!=b){c=a+1024*b; A[c/32] |= 1<<(c%32);}}
int v[10000],d=0,x=0;
for(n=0;n<10000;n++)v[n]=0;
for(n=v[d];n<1024*1024;n++)
if( (A[n/32]>>(n%32))&1 ){
a=n>>10; b=n%1024;
if(x==a){x=b;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));}
else if(x==b){x=a;v[d]=n+1;d++;A[n/32] &= ~(1<<(n%32));}
}
}
0819デフォルトの名無しさん
2007/11/03(土) 08:07:29user32.libをリンクしろ。
user32.libはPlatform SDKもしくはWindows SDKに入っている。
VC++ 2005への設定が容易な分、Windows SDKがおすすめ。
0820デフォルトの名無しさん
2007/11/03(土) 08:35:56scanf()の戻り値を見て、0だったら終わればいい。
0821デフォルトの名無しさん
2007/11/03(土) 10:52:55具体的にどこをどう直せばいいですか?
0822デフォルトの名無しさん
2007/11/03(土) 10:58:41#include<stdio.h>
int tosi(int a,int b){
return a - b;
}
main() {
int year;
printf("あなたの生まれた年は?\n");
scanf("%d",&year);
printf("あなたは今年%d歳\n",tosi(2007,year));
return 0;
}
0823デフォルトの名無しさん
2007/11/03(土) 12:17:33メモ化
再起をループに書き換えたところで改善されるパフォーマンスは微々たるもの
0824815 出来たけどバグあるよ 直して使ってくれ
2007/11/03(土) 14:24:44#define TEN 3
using namespace std;
main(){
int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1];
//経路生成
for(n=0;n<=N/32;n++)A[n]=0;
for(n=0;n<100;n++){
a=rand()%TEN;b=rand()%TEN;
if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}}
//経路総数
int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++;
int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;;
for(n=0;n<keirosu+2;n++)y[n]=0;
for(x=0;x<TEN;x++){ z[0]=x;
while(1){ n=y[d];
if(n>=N){
if(d==0)return 0;
d--;n=y[d];a=n%TEN; b=n/TEN;
if(a==x)x=b;else x=a;
A[c/32]|=1<<(c%32);s++;
y[d]++;continue;}
if( (A[n/32]>>(n%32))&1 ){
a=n%TEN; b=n/TEN;
if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}
if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}}
y[d]++;}}
end:for(n=0;n<keirosu-s;n++)cout<<z[n]<<"→";}
0825815 すこしなおした バグ取るか、参考として利用してくれ
2007/11/03(土) 15:04:39#define TEN 20
using namespace std;
main(){
int N=TEN*TEN,n,a,b,c;unsigned int A[TEN*TEN/32+1];
//経路生成
for(n=0;n<=N/32;n++)A[n]=0;
for(n=0;n<100;n++){
a=rand()%TEN;b=rand()%TEN;
if(a<b){c=a+TEN*b; A[c/32] |= 1<<(c%32);}}
//経路総数
int keirosu=0;for(n=0;n<N;n++)if( (A[n/32]>>(n%32))&1 )keirosu++;
int *y=new int [keirosu+2], z[TEN], d=0,x,s=keirosu;;
for(n=0;n<TEN;n++)z[n]=-1;for(n=0;n<keirosu+2;n++)y[n]=0;
for(x=0;x<TEN;x++){ z[0]=x;
while(1){ n=y[d];
if(n>=N){
if(d==0)break;
z[d]=-1;d--;x=z[d];
A[n/32]|=1<<(n%32);
s++;y[d]++;continue;}
if( (A[n/32]>>(n%32))&1 ){
a=n%TEN; b=n/TEN;
if(a==x){s--;if(s==0)goto end; x=b; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}
if(b==x){s--;if(s==0)goto end; x=a; d++; y[d]=0;z[d]=x; A[n/32]&=~(1<<(n%32));continue;}}
y[d]++;}}
end:for(n=0;n<keirosu;n++)cout<<z[n]<<"→";}
0826>>811
2007/11/03(土) 15:17:37>>825
ソースまで公開して頂きありがとうございます。
じっくり読んで参考にします。
0827デフォルトの名無しさん
2007/11/03(土) 16:07:57すみません。
struct
0828デフォルトの名無しさん
2007/11/03(土) 16:12:56struct AAA{
:
:
};
AAA* a = (AAA*)malloc(sizeof(AAA)*4);
とコーディングしていたら客先の担当者からおこられました。
「一応サイズは保証されているけどそれはAAA a[4]ではない」、と。
C++では
AAA* a = new AAA[4]で保証されていますの、といったら
「それはC++だからでしょ?」といわれました・・・・。
AAA* a = (AAA*)malloc(sizeof(AAA)*4);ってやっちゃいけないんですか?
0829デフォルトの名無しさん
2007/11/03(土) 16:19:040830デフォルトの名無しさん
2007/11/03(土) 16:24:50べつに問題ないと思うけど。
固定長で、配列で済むところでmalloc()なんか使うなって意味かな?
malloc()禁止だったら、可変長の配列はどうするんだろ。
0831デフォルトの名無しさん
2007/11/03(土) 16:31:19それはそもそもCではエラーなわけだが。そのコードが通るなら、C++なのだからvectorかnewを使うべきだし。
0832デフォルトの名無しさん
2007/11/03(土) 16:32:26口調に萌えた
0833デフォルトの名無しさん
2007/11/03(土) 16:33:570834デフォルトの名無しさん
2007/11/03(土) 16:35:28回答ありがとうございます。
言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。
すみません。ついでに便乗質問なのですが
(1)
AAA aaa[30][30];
int x=...;
int y=...;
aaa[y][x]=...;
(2)
AAA aaa[30*30];
int x=...;
int y=...;
aaa[y*30+x]=...;
で(2)の使い方をしていたらこれも理解しづらいということで怒られました。
2次元配列のほうが処理的にも良いのでしょうか。
0835デフォルトの名無しさん
2007/11/03(土) 16:36:30レベルの差ってのは自分よりすげーってことね
0836デフォルトの名無しさん
2007/11/03(土) 16:37:200837デフォルトの名無しさん
2007/11/03(土) 16:38:020838デフォルトの名無しさん
2007/11/03(土) 16:39:57(2)が明確に処理的に優れてることを示せないのに(2)を選んだ理由は?
0839デフォルトの名無しさん
2007/11/03(土) 16:40:15callocを使えということかな?
0840デフォルトの名無しさん
2007/11/03(土) 16:40:49いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います。
私のところではパフォーマンスを要求する場合は(2)の形式でかつ、オフセット計算関数を用意することが多く、
そうでない場合には(1)の形式を配列の配列ではなく配列へのポインタ配列の形で使うことが多くなります。
0841デフォルトの名無しさん
2007/11/03(土) 16:46:45> 言葉足らずでした。「構造体のmallocなんてありえない!」といわれたのを書くの忘れてました。
その担当者は、プログラム知らなさすぎなんじゃね?
0842834
2007/11/03(土) 16:46:55処理的には
a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で
計算したほうがよいのかなと思いまして。
>>839
担当者いわく、構造体の領域確保はできない、ない、ということらしいです。
0843デフォルトの名無しさん
2007/11/03(土) 16:49:51>841に同意。後学の為に、その担当者の所属企業をお教え願えませんか?w
0844デフォルトの名無しさん
2007/11/03(土) 16:51:15コードの可読性は(1)のほうがいいだろ。
パフォーマンスの問題なら、(2)のほうが何パーセント処理時間が短くなるとか、具体的な数字を見せて説得すれば
いいんじゃね?
0845デフォルトの名無しさん
2007/11/03(土) 16:51:51>処理的には
>a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思いそれなら最初から1次元で
>計算したほうがよいのかなと思いまして。
だからなんで「よい」と思うのか教えてくれ。
0846デフォルトの名無しさん
2007/11/03(土) 16:52:00>a[y]のアドレスにとんで、そこからsizeof(AAA)分移動になるかと思い
コンパイラの最適化をなめてはいけない。
2次元配列のほうが、より最適化される可能性が高い。
0847デフォルトの名無しさん
2007/11/03(土) 16:55:06>いいえ、処理的にはどう考えても(2)の方が何かと都合がよいと思います
>>842
>計算したほうがよいのかなと思いまして
自分なら、思うだけじゃ、可読性を犠牲にする気にはならないな
実測して優位性を証明しる
0848デフォルトの名無しさん
2007/11/03(土) 16:57:591 :以下、名無しにかわりましてVIPがお送りします。:2007/11/03(土) 14:02:12.45 ID:o3DHz8v00
http://id13.fm-p.jp/185/notkephir/
裏絵バロスwwwwwwwwwwwww
やあ、ここのBBSのパス解析できたら明日おにゃのことセックルできるお(^ω^ )
http://wwwww.2ch.net/test/read.cgi/news4vip/1194066132/698-698
0849デフォルトの名無しさん
2007/11/03(土) 17:06:48int b[30*30];
int foo(int x, int y) {
return a[y][x];
}
int bar(int x, int y) {
return b[y * 30 + x];
}
gcc でコンパイルしたら、foo も bar も同じコードになった。
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %ecx
movl 8(%ebp), %eax
popl %ebp
movl %ecx, %edx
sall $4, %edx
subl %ecx, %edx
addl %edx, %edx
addl %eax, %edx
movl _a(,%edx,4), %eax ;または _b(,%edx,4), %eax
ret
0850デフォルトの名無しさん
2007/11/03(土) 17:47:38fseekでファイルのヘッダ部分を飛ばしたいのですが
fseek(fp,???,SEEK_SET);
4行飛ばしたい、というときは第2引数はどうすればいいのでしょうか?
4行をバイトにどう直すのかわからなくて
0851デフォルトの名無しさん
2007/11/03(土) 17:54:060852デフォルトの名無しさん
2007/11/03(土) 17:56:394行だから、82x4=328バイト分seekするというのはどうだろう?
0853デフォルトの名無しさん
2007/11/03(土) 18:01:55ありがとうございます、やってみます
>>851
やり方がおかしいのか、おかしいことを言っているのでしょうか?
普通はどうやるんですか?
0854デフォルトの名無しさん
2007/11/03(土) 18:02:31ありがとうございます。
0855デフォルトの名無しさん
2007/11/03(土) 18:10:111行が何バイトかは、その行を読み込んで改行まで数えないとわからないのが普通
0856デフォルトの名無しさん
2007/11/03(土) 18:10:580857デフォルトの名無しさん
2007/11/03(土) 18:20:44だからそれ以前の人ならそういう発想でも別に変でないかも。
0858デフォルトの名無しさん
2007/11/03(土) 18:51:46>>855
普通はそうなのですか…結構アナログな感じなのですね
ただ、すんません。疑問が増えました。
データをストリームとして扱う、の意味がわかりません
0859デフォルトの名無しさん
2007/11/03(土) 18:57:10現在位置を取得し、これをAとします。
getsを4回呼び出します。
現在位置を取得し、これをBとします。
fseekで現在位置をAの場所に戻します。
fseekB-Aバイト分現在位置を進めます。
0860デフォルトの名無しさん
2007/11/03(土) 18:58:30「データをストリームとして扱う」というのは、普通にファイルを頭から順に読んでいくこと。
これに対して、「固定長のブロックとして扱う」やりかたがあって、
ひとつひとつのカタマリが同じ大きさの場合に、
fseekを使ってデータの開始位置にシークして、必要なデータのみを直接読み書きすることを言います。
0861デフォルトの名無しさん
2007/11/03(土) 19:24:43ありがとうございました。
今まで何も理解せずにプログラムしてたのだと思い知りました。。。
0862デフォルトの名無しさん
2007/11/03(土) 21:41:45と
KOUZOUTAI *data
data = (struct Point *)malloc( sizeof(struct Point) * num );
の違いって何なのでしょうか?
どちらもnum分の構造体を確保していると思うのですが。
それとポインタの場合で二次元の構造体を確保する方法教えてください。
0863デフォルトの名無しさん
2007/11/03(土) 21:42:36すません。
4行目はPointじゃなくて KOUZOUTAIです。
0864デフォルトの名無しさん
2007/11/03(土) 21:59:04と
int *data = (int *)malloc(sizeof(int)*10)
の違いと同じ。
0865デフォルトの名無しさん
2007/11/03(土) 22:00:33ファイルの更新時刻を得るのってどうすればいいんでしょうか?
0866デフォルトの名無しさん
2007/11/03(土) 22:01:130867デフォルトの名無しさん
2007/11/03(土) 22:07:280868デフォルトの名無しさん
2007/11/03(土) 22:17:23標準ライブラリにそういう関数が入ってたりしないってことでしょうか
0869デフォルトの名無しさん
2007/11/03(土) 22:23:21ファイルシステムに依存する情報なんで、標準には入ってない
0870デフォルトの名無しさん
2007/11/03(土) 22:23:32んー
その、構造体で宣言するのと、ポインタで宣言するのと利点があまりわからず
あと2次元の構造体をポインタで確保する方法もお願いします
0871デフォルトの名無しさん
2007/11/03(土) 22:27:14構造体の二次元配列をポインタで確保するのなら、普通の変数を二次元に確保するときと同様でいい。
0872デフォルトの名無しさん
2007/11/03(土) 22:28:40あと、後者の方が前者と比べると遅そうだけど、これは実装・環境に依存するのかな。
0873デフォルトの名無しさん
2007/11/03(土) 22:34:47KOUZOUTAI data[10][10]
のようなことです。
二次元配列をポインタで確保するやり方調べてきます。やったことなくて。
>>872
なるほど。
というと、グローバルでKOUZOUTAI data[10]とするのと同じような感じになるのでしょうか?
0874デフォルトの名無しさん
2007/11/03(土) 22:49:420875デフォルトの名無しさん
2007/11/03(土) 23:25:23int value;
};
int main(){
struct e **p,(*q)[5];
int i;
//こんな方法とか
p = (struct e**)malloc(10 * sizeof(struct e*));
for(i=0; i<9; ++i){
p[i] = (struct e*)malloc(5 * sizeof(struct e));
}
//こんな方法がある
q = (struct e(*)[5])malloc(5 * 10 * sizeof(struct e));
//こんな風に使う
p[0][0] = 0;
q[0][0] = 0;
//忘れずに解放
for(i=0; i<9; ++i){
free(p[i]);
}
free(p);
//qの方が解放は楽
free(q);
return 0;
}
0876875
2007/11/03(土) 23:26:22for(i=0; i<9; ++i)
↓
for(i=0; i<10; ++i)
0877デフォルトの名無しさん
2007/11/03(土) 23:38:360878デフォルトの名無しさん
2007/11/03(土) 23:42:07int i;
char b;
char a[] = "abcdefg";
scanf("%s",&b);
while(b != a[i])
i++;
・・・略
みたいなbで打たせた文字をaの配列から探させるようなプログラムを書くとwhile文のところで、
「char型はchar*型に変換できない」
というエラーが出ます。どうすればbの文字ををaの配列から参照できますか?
わかりにくくてごめんなさい
0879デフォルトの名無しさん
2007/11/03(土) 23:46:27>534の下3行。
0880デフォルトの名無しさん
2007/11/03(土) 23:49:25とりあえずそのようなエラーは出なかった
0881デフォルトの名無しさん
2007/11/03(土) 23:50:30ありがとうございます。%cにすればいいってことですか…?
0882デフォルトの名無しさん
2007/11/03(土) 23:56:23上のプログラムだと、例えばscanfでdを打ったらiが3になった時点でwhile文から出るはずですよね?
0883デフォルトの名無しさん
2007/11/03(土) 23:57:230884デフォルトの名無しさん
2007/11/04(日) 00:01:00しています。無限ループではなく他のどこかがおかしいのかもしれません。
もう一度しっかり見てみます。
ありがとうございました。
0885デフォルトの名無しさん
2007/11/04(日) 00:03:57bにhを入れたらどこで止まると思う?
0886デフォルトの名無しさん
2007/11/04(日) 00:06:17そうなると無限ですか?
でも実際はこの配列はa〜zで、cとかdとかを入れても次の動作にいきません。
0887デフォルトの名無しさん
2007/11/04(日) 00:08:040888デフォルトの名無しさん
2007/11/04(日) 00:08:12>>883みたいな細々したことを指摘しないといけなくなるから
0889デフォルトの名無しさん
2007/11/04(日) 00:08:54その実際のソースを書け
0890デフォルトの名無しさん
2007/11/04(日) 00:12:11scanfの%指定ミスでこんなエラー出ないよな? せいぜい実行時エラーであって
0891デフォルトの名無しさん
2007/11/04(日) 00:15:44#include<stdio.h>
int main(void){
char a;
char letter[] = "abcdefghijklmnopqrstuvwxyz";
int i = 0;
printf("半角英小文字を1文字入力。:");
scanf("%s",&a);
while(a != letter[i])
i++;
printf("%s",letter[i]);
return 0;
}
です。
0892デフォルトの名無しさん
2007/11/04(日) 00:18:270893デフォルトの名無しさん
2007/11/04(日) 00:20:18%sを%cに置換してこい。printf("%s",letter[i]);文字コードがポインタだと解釈されてしまう
0894デフォルトの名無しさん
2007/11/04(日) 00:20:290896デフォルトの名無しさん
2007/11/04(日) 00:23:01直す前のを載せたんじゃないの?
>>891
printf("%s",letter[i]);
↓
printf("%c",letter[i]);
0897デフォルトの名無しさん
2007/11/04(日) 00:23:210898デフォルトの名無しさん
2007/11/04(日) 00:26:450899デフォルトの名無しさん
2007/11/04(日) 00:32:21おかげでなんとかできました。
1つ気になるのですが"%c"と" %c"の違いはなんですか?
0900デフォルトの名無しさん
2007/11/04(日) 01:04:58%cと%sの違いなら、
・scanfの場合
%cなら、引数として渡されたアドレスの指し示す先に、標準入力からとってきた一文字を入れる
%sなら、引数として渡されたアドレスの指し示す先を配列の頭と見て、文字列を入れていく。最後に\0を付加
・printfの場合
%cなら、引数として渡された数値に対応した一文字を標準出力に出力
%sなら、引数として渡されたアドレスを配列の頭と見て、その指し示す先を\0にぶち当たるまで出力する
0901デフォルトの名無しさん
2007/11/04(日) 01:10:390902デフォルトの名無しさん
2007/11/04(日) 01:22:51ありがとうございます。
よくわかりました!
0903デフォルトの名無しさん
2007/11/04(日) 10:02:070904デフォルトの名無しさん
2007/11/04(日) 10:25:43↓
え・・ポインタのポインタ?関数ポインタ?どうだったっけ?
↓
まだまだだな俺 ←この辺から入門卒業
0905デフォルトの名無しさん
2007/11/04(日) 11:07:39それ面白いなw
初心者に教えてるつもりが逆に初心者から教わってることに気付いたあたりも入門卒業っぽいぜ。
もう一歩踏み込む気構えが出来た頃合がそうなのかもね。
0906デフォルトの名無しさん
2007/11/04(日) 11:37:37俺的にはそこで、宣言の問題だと気がついたら卒業としたい。
0907デフォルトの名無しさん
2007/11/04(日) 11:44:380908デフォルトの名無しさん
2007/11/04(日) 12:29:280909デフォルトの名無しさん
2007/11/04(日) 12:42:34んなわけあるか
0910デフォルトの名無しさん
2007/11/04(日) 12:57:44コピペで終わりじゃねーかw
0911デフォルトの名無しさん
2007/11/04(日) 14:17:190912デフォルトの名無しさん
2007/11/04(日) 14:24:09*****pくらいついたらわけがわかりません。
const ***p
***const p
とかなったらわかりません
関数ポインタなんて使ったことありません。なんで使うんですか。
GUIなんて作ったことなんてありません
でも入門卒業したいです><
0913デフォルトの名無しさん
2007/11/04(日) 14:57:080914デフォルトの名無しさん
2007/11/04(日) 15:13:41私は、DLLを使うときくらいですかね。
0915デフォルトの名無しさん
2007/11/04(日) 15:17:290916デフォルトの名無しさん
2007/11/04(日) 15:37:45{
char *str;
int (*myfunc)();
} object;
int main()
{
object obj;
obj->str = malloc(sizeof(char) * 256);
fgets(obj->str, 256, stdin);
obj->myfunc();
puts(obj->str);
free(obj->str);
return 0;
}
int myfunc()
{
〜
}
0918デフォルトの名無しさん
2007/11/04(日) 16:23:53え、そんなやり方でmyfuncを呼び出せるの?
いつ関数ポインタをセットした?
0920デフォルトの名無しさん
2007/11/04(日) 16:54:01int main(void)
{
int c;
c = getchar();
printf("%d\n", c);
c = getchar();
printf("%d\n", c);
return 0;
}
このプログラムをBCC5.5.1でコンパイルして実行し、"a"と"Ctrl+Z"を1度に入力した場合、
D:\c\my\test2>test2.exe
a^Z
97
-1
このような結果になりました。
ところが、VC++2005EEのcl.exeでコンパイルし、同じように実行すると、
D:\c\my\test2>test2.exe
a^Z
97
26
このような結果になります。なぜVC++20005では正しい結果が得られないのでしょうか。
0921デフォルトの名無しさん
2007/11/04(日) 16:59:04これを main の return の前に。
0922デフォルトの名無しさん
2007/11/04(日) 17:06:20の違いがわかりません><
0923デフォルトの名無しさん
2007/11/04(日) 17:07:390924デフォルトの名無しさん
2007/11/04(日) 17:08:000925デフォルトの名無しさん
2007/11/04(日) 17:10:33stdinの初期設定が違うんじゃね?
^C が受けられるかどうかの設定もできるし。
あるいは ^D とか。
0926デフォルトの名無しさん
2007/11/04(日) 17:10:561+2 と (1+2) の違いを考えてみるといいよ
0927デフォルトの名無しさん
2007/11/04(日) 17:17:19ありあとやんしたー
0928デフォルトの名無しさん
2007/11/04(日) 17:44:16コレってマジ?
なんで今更こんなバグが残ってんの?
0929デフォルトの名無しさん
2007/11/04(日) 17:52:38そのようにしても結果は変わりませんでした。
>>925
どうやって設定すればいいのでしょうか?
0930デフォルトの名無しさん
2007/11/04(日) 19:11:13うちでも確認できた。これはひどいな。
0931デフォルトの名無しさん
2007/11/04(日) 19:22:15バグだとか、どっちが間違ってるとかでは無いんじゃね?
0932デフォルトの名無しさん
2007/11/04(日) 19:55:34でも、stdio.hでは#define EOF (-1)となっているし、^Zだけならちゃんと-1と表示される。
0933デフォルトの名無しさん
2007/11/04(日) 20:55:140934デフォルトの名無しさん
2007/11/04(日) 21:57:55プログラム終了時に、標準入出力もふくめてファイルは全部フラッシュ&クローズされるから、
それは意味ない。
0935デフォルトの名無しさん
2007/11/04(日) 22:20:44{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19}
};
関数に配列の{5,6,7,8,9},とかを1行だけ送りたいのですが
どういう風にやればいいのでしょう?
0936デフォルトの名無しさん
2007/11/04(日) 22:41:030937デフォルトの名無しさん
2007/11/04(日) 22:59:13MSのドキュメント調べたけど、記述が見つからなかったので仮説。
てゆーか、コマンドプロンプトの制御文字に関する仕様のドキュメントてどこさ?
行頭にある^Zはコマンドプロンプトが解釈してプログラムに「データ無し」を通知する。
行中にある^Zは文字「0x1A」をプログラムに通知する。
という理由で>>932な動きをするっぽい。
ここはコマンドプロンプトの仕様だと思うんだけど、文献ミツカンネ。
stdinをバイナリモードで開くと同じ挙動をするので、
テキストモードでのデータ中の0x1A(制御コードのEOF)の扱いの差のようだ。
バグというよりは仕様の範疇っぽいね。
0x1Aを含むファイルをテキストモードでオープンして読んでみれば
もうちょい分かりそうなんだけど、データ作るのめんどかったんで誰か頼む。
○ バイナリで開き直したサンプル
#include <stdio.h>
int main()
{
int c;
freopen("CON", "rb", stdin);
do{
printf("%d\n",c = getc(stdin));
}while(c != EOF);
return 0;
}
0938デフォルトの名無しさん
2007/11/04(日) 23:10:31受け取る方を1次元にしてやれば、まとめて受け取られるんですね。
できました!ありがとうございました!
0939デフォルトの名無しさん
2007/11/04(日) 23:18:03VC++2005でもファイル中の0x1Aは、getcで読んだらEOFが返ってきた。
やっぱバグじゃねーの?
0940デフォルトの名無しさん
2007/11/04(日) 23:24:30無償のアプリケーション開発環境
http://www.forest.impress.co.jp/lib/stdy/program/progdevenv/turboexplor.html
0941デフォルトの名無しさん
2007/11/04(日) 23:27:37今度は
num[4][5]={
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19}
};
の 0 5 10 15 の縦の列の総和を出したいだけなんですが
これも丸々関数に送りたいのです。。。
1次元配列にいっそのこと退避させたほうがいいんでしょうか
0942デフォルトの名無しさん
2007/11/04(日) 23:36:020943デフォルトの名無しさん
2007/11/04(日) 23:42:071000×1000と大きい場合を想定しています。
numごと渡したら、メモリがムダに消費されるとかポインタの解説ページとかで見た気がして
0944デフォルトの名無しさん
2007/11/04(日) 23:44:370945デフォルトの名無しさん
2007/11/04(日) 23:44:400946デフォルトの名無しさん
2007/11/04(日) 23:47:36一次元配列を使うと32*1000バイト消費するが
そのままだと何も新規に生成しないから0バイトで済む
0947デフォルトの名無しさん
2007/11/04(日) 23:50:24ところでnumそのものの値も更新したい場合は、参照渡しするのですよね?
0948デフォルトの名無しさん
2007/11/04(日) 23:51:170949デフォルトの名無しさん
2007/11/04(日) 23:53:11コピーを渡す方は難しい
0950デフォルトの名無しさん
2007/11/04(日) 23:57:50クソの集まり創価学会
偽善者が政治活動、公明党
キチガイ集団が政治活動、公明党
池田狂信ネズミ講が政治活動、公明党
騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
0951デフォルトの名無しさん
2007/11/05(月) 00:10:49すみません。。。混乱してきてしまって。
今は総和だけ求めてるのですが
やりたいのは行で計算をして、その行の値を全部更新して
その更新された状態で列を計算して、全部の列を更新するということをしようとしてます。
配列と関数の関係をやりなおしてきます。
0952デフォルトの名無しさん
2007/11/05(月) 00:31:26それならなおさらアドレス渡しでいいじゃん
0953デフォルトの名無しさん
2007/11/05(月) 00:38:26>C言語では,特別なことをしない限り,変数は値渡し,配列は参照渡しになる
今まで配列も値渡しだと思っていました…納得できました。
ありがとございましたー
0954920
2007/11/05(月) 11:44:12#include <stdio.h>
int main(void)
{
int c;
do {
printf("%d ", c = fgetc(stdin));
} while (c != EOF);
return 0;
}
このプログラムを実行し、
コマンドラインから"abc^Zdef"を入力すると、(^ZはCtrl+Z)
D:\c\my\test5>test5.exe
abc^Zdef
97 98 99 26
と表示され、入力待ちになります。
0955920
2007/11/05(月) 11:44:5261 62 63 1A 64 65 66
の内容のテキストファイル(↑は16進ダンプしたもの)をstdinにリダイレクトして
実行してみたところ、
D:\c\my\test5>test5.exe < test.txt
97 98 99 -1
このような結果になり、プログラムが終了しました。
プログラムは全てVC++2005でコンパイルしました。
どうやらコマンドラインの行中にEOF(0x1A)があった場合、
stdio.hで定義されたEOF(-1)ではなく、
テキストファイルでのEOF(0x1A)として読み込むようです…。
BCC5.5.1ではどちらの場合も、
97 98 99 -1
と表示され、プログラムが終了します。
0956デフォルトの名無しさん
2007/11/05(月) 12:56:46一応、MSに報告したらどうだろ。
0957デフォルトの名無しさん
2007/11/05(月) 13:09:38EOFのASCIIコードを表示しているのだから
0958デフォルトの名無しさん
2007/11/05(月) 13:11:090959デフォルトの名無しさん
2007/11/05(月) 13:12:35つーか単なる ^Z だが。
0960920
2007/11/05(月) 13:52:32http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
>ASCIIでは例えば、改行文字は0x10、水平タブは0x09、EOF(End Of File、ファイル終端マーク)は0x1Aである。
0961920
2007/11/05(月) 14:01:52コマンドラインの行頭にあるEOFや、リダイレクトされたファイルにあるEOFは
stdio.hに定義されたEOF(-1)と読み取ることを考えると、一貫性が無いように思えます。
0962デフォルトの名無しさん
2007/11/05(月) 14:12:08それ書いたの誰だよ?
ttp://e-words.jp/p/r-ascii.html
ttp://ja.wikipedia.org/wiki/ASCII
ttp://www.mew.org/Newsletters/6.html
0963デフォルトの名無しさん
2007/11/05(月) 18:42:180964デフォルトの名無しさん
2007/11/05(月) 21:29:32わかる方がいればよろしくお願いします
0965デフォルトの名無しさん
2007/11/05(月) 22:03:20コンパイラによるんじゃないでしょうか。
あと、たぶん、かなりアセンブラよりの質問だと思います。
0966デフォルトの名無しさん
2007/11/05(月) 22:04:36浮動小数点や整数演算はハードでします
0967デフォルトの名無しさん
2007/11/05(月) 22:09:110968デフォルトの名無しさん
2007/11/05(月) 22:13:310969迷い人
2007/11/05(月) 22:36:251を入力すると
x
2を入力すると
x
xx
x
4を入力すると
x
xx
x
xxx
x
xx
x
xxxx
x
xx
x
xxx
x
xx
x
となるようなものです。途中まではかけたのですが肝心なところがよくわかりませんでした。
途中までは次のようになりました
0970迷い人
2007/11/05(月) 22:37:28void X_sequence (int n);
void X_triangle (int n);
main()
{
int n;
printf("Enter a number : ")
scanf("%d",&n);
X_triangle(n);
}
void X_sequence(int n)
{
int i;
for (i=1; i<=n; i++)
printf("X");
printf("\n");
}
void X_triangle(int n)
{・・・・こっからわかりません!
教えてくださいおねがいします
0971デフォルトの名無しさん
2007/11/05(月) 22:39:06X_sequence(n);
if (n > 2) X_triangle(n - 1);
0972デフォルトの名無しさん
2007/11/05(月) 22:39:22x\n
2を入力すると\n
x\n
xx\n
x\n
4を入力すると\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
xxxx\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
");
0973デフォルトの名無しさん
2007/11/05(月) 22:39:38X_sequence(n);
if (n >= 2) X_triangle(n - 1);
0974デフォルトの名無しさん
2007/11/05(月) 23:01:21どれくらい経験つめばこれくらい書けるようになるんですかね・・・
0975デフォルトの名無しさん
2007/11/05(月) 23:15:155000時間くらい。
0976デフォルトの名無しさん
2007/11/06(火) 00:19:12rand関数とか、abs関数とか、stdlib.hで宣言されてるってことを聞きました。
で、stdlib.hを探してみて実際に見たところ、確かに宣言されてたんですが、
これら関数の実体って、どのファイルに定義されているんでしょうか。
もしくは、ソースファイルはついてないんでしょうか?(当方Mac OSXです)
見てみたいな、と思いまして・・
0977デフォルトの名無しさん
2007/11/06(火) 00:27:18そういう関数はライブラリに中身がある
ヘッダーには呼び出しかたが書いてある。
実体を見たいなら、使ってるコンパイラメーカーに聞くしかない。
0979デフォルトの名無しさん
2007/11/06(火) 00:33:50続く処理をして、それ以外は再度入力を促すプログラムを作りたいです。
入力された値のエラーのチェックにはどんな処理が必要か
わからないので教えてください。
あと数値を入力してEnterを押して実行したあとに
前回入力した数値が残ったままになっているのを
消すにはどうすればいいですか?
0980デフォルトの名無しさん
2007/11/06(火) 01:14:14#include <stdio.h>
int main()
{
int num;
char buff[12] = {'\0'};
do{
puts("1〜100の数値入力");
fgets(buff,sizeof(buff),stdin);
sscanf(buff,"%d",&num);
}while(1 >= num || num >=100);
/*
1以上100以下の数値が入力されたときの
処理をここに書けば〜
*/
return 0;
}
0981980
2007/11/06(火) 01:35:49while(1 >= num || num >=100);
↓
while(1 > num || num >100);
0982デフォルトの名無しさん
2007/11/06(火) 01:58:33俺ならこう書くぞ
} while (!(1 <= num && num <= 100));
0983デフォルトの名無しさん
2007/11/06(火) 02:02:570984デフォルトの名無しさん
2007/11/06(火) 02:30:32!についての質問なんですが、
if ( !(fp = fopen("a.c","r")) )
もしこれでfpがNULLでない場合(どこかのメモリアドレスつまり正の整数値)、
if文が偽(つまりNULLつまり0)となると思うのですが、
何故、!(正の整数値)がNULLつまり0になるのですか??ANSIのそういう仕様ですか?
if ( !5 )は偽でNULLつまり0??
(ちなみに、現在ほとんどのstdio.hで #define NULL 0 となっている)
0985デフォルトの名無しさん
2007/11/06(火) 02:33:540986デフォルトの名無しさん
2007/11/06(火) 02:47:08int main(void)
{
FILE *fp;
if ( fp = (FILE*)(NULL == NULL))
;
printf("fp = %p\n", fp);
printf("(int)fp = %d\n", (int)fp);
printf("!5 = %p\n", !5);
return 0;
}
結果
fp = 0x1
(int)fp = 1
!5 = 0x0
0987デフォルトの名無しさん
2007/11/06(火) 02:58:340988デフォルトの名無しさん
2007/11/06(火) 05:52:39!5は「5以外」じゃないよ。
5を真偽値として評価して真、その否定で結果偽。そんだけ。
0989デフォルトの名無しさん
2007/11/06(火) 09:23:160990デフォルトの名無しさん
2007/11/06(火) 22:06:26なんか自分で書いたソースなのに、うまく説明できなくて凹みまくってる・・・。
頭の中じゃどんな風に動くのかわかってるんだけど、説明となると10あるうち2しか伝える事ができない・・・
0991デフォルトの名無しさん
2007/11/06(火) 22:41:32凡人なら説明できない程度の理解としか周囲には写らないだろうよ。
誰にでも納得できる説明をする必要があるの?
仕事でレビュア対象に説明するだけなら、レビュアに疑問点・不明点を上げてもらって
それに回答することで納得して貰うのじゃダメ?
レビューの経験を積めば、レビュアの傾向が見えて対策も打てるけど、
例え経験不足だとしてもレビューの前に事前にレビュアと調整しておくって手もある。
凹む前にもっと考えて行動すべきだと思うけどね。
0992979
2007/11/06(火) 22:43:34色んなサンプルソース読んでみても
scanfはあまり使われてないみたいなので
gets,fgetsに変更してみようとおもいます。
なぜなのかは、ぐーぐるさんに聞いてきます
ありがとうございました
0993デフォルトの名無しさん
2007/11/06(火) 22:55:21あ、えーと、
現状まだまだ勉強の段階なんですが、
int main(void) じゃあそのvoidってナニ?なんでここにintとかおいてるの?っていう
いわば基礎中の基礎の部分なので、プログラムに一切関係のない人でも理解できるように発言して欲しい=学べる
ということなのでやってるんですが、経験をとにかく詰むしかないんですかね・・・うーん。
0994デフォルトの名無しさん
2007/11/06(火) 23:20:34相談できる人が身近にいればその人に協力して貰うのがいい。
相談できる人がいない、探す気もないならここにソース晒してコメントを貰うのでもいいんじゃね?
0995デフォルトの名無しさん
2007/11/06(火) 23:50:36struct _TEST a
{
int num;
char ch;
}test[100] = {0};
こうした場合、test配列の中身が全て0クリアされる動作は保証されていますか?
testが配列でない場合は動作が保証されているとどこかで伺った気はしたのですが
0996デフォルトの名無しさん
2007/11/07(水) 00:10:581が入るのはtest[0].numだけであって、残りは全て0になる。
0997デフォルトの名無しさん
2007/11/07(水) 01:06:24ありがとうございます!
0998デフォルトの名無しさん
2007/11/07(水) 04:38:52こちらのプログラムをVS2005でそのまま実行しても'fopen'の宣言を確認してくださいと出ます。
同HP (ttp://www.geocities.jp/horie_ryu/page01.html) にあるc1.wavやらを読み込ませて実行したいのです。
fopenで配列を読んでいるのですが、ここにどうやってc1.wavなどを読み込ませればいいのでしょうか?
0999デフォルトの名無しさん
2007/11/07(水) 05:12:451000デフォルトの名無しさん
2007/11/07(水) 05:29:0510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。