[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:45 / Filesize : 237 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 23



1 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:49:22 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 22
pc11.2ch.net/test/read.cgi/tech/1196489491/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 101
pc11.2ch.net/test/read.cgi/tech/1197132472/

75 名前:デフォルトの名無しさん [2007/12/24(月) 20:48:00 ]
>>74
そうなんですね。読むだけにして、使わないようにします。
この場合、

return( adataadd );
...

p = Open_Kansumei(...);

とするのが普通なんでしょうか?これでも同じ意味になります?

76 名前:デフォルトの名無しさん [2007/12/24(月) 20:50:06 ]
なんで ? は、エスケープシーケンスで \? としなければいけないの?
何と区別がつかないのだ?

77 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:50:28 ]
そもそもOpen_Kansumei関数の戻り値の型をstruct S1 *にしておく。

78 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:54:32 ]
>>76
なんで ? を、エスケープシーケンスにしなければいけないの?

79 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:57:48 ]
>>76
三項演算子とエスパーしてみる

80 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:08:23 ]
>>76
「シェルが展開しようとするから」って回答がお望み?

81 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:16:04 ]
>>76>>78
3文字表記(トライグラフ)のため。
3文字表記は、Cが多用する記号を使えない文字コードのための代替表記を与えるもの。
まあ過去の遺物と言っていい。

??=include <stdio.h>

int main(int argc, char *argv??(??))
??<
  printf("%d??/n", argc);
??>

82 名前:デフォルトの名無しさん [2007/12/24(月) 21:43:36 ]
>>77
int Open_Kansumei( ... , ... , ... , ... )
{
  struct S1 *adataadd; /* データアドレス */
  ...処理...
  return( adataadd );
}

p = Open_Kansumei( ... , ... , ... , ... );

てな感じでしょうか。
この場合、
struct S1 *p;
をグローバルで宣言しないといけない訳ですね。

83 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:01:29 ]
いや,グローバルかどうかは関係ない.
struct S1 * Open_Kansumei( ... , ... , ... , ... )
{
  struct S1 *adataadd; /* データアドレス */
  ...処理...
  return adataadd;
}
とするのがベター.




84 名前:デフォルトの名無しさん [2007/12/24(月) 22:12:04 ]
>>83
ああ、なるほど〜
関数の戻り値の型を変えるってのは、struct S1 * Open_Kansumei() の部分を
変えないと駄目ですよね。

あとは、Open_Kansumei()関数の定義側と、呼び出し側で、
struct S1 の中身が書いてある .h ファイルを include しとけばいいってことですね。
include が嫌だったから、 return( (int)adataadd ); ってしたのかもしれないな・・・

85 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:17:26 ]
今ぷよぷよを作ってて、4つ以上繋がっているか上下左右をチェックする再帰処理で
スタックオーバーフローになってしまうのですが
11*20程度のフィールドでありえるんでしょうか
僕のプログラムがおかしいだけなんでしょうか

86 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:20:31 ]
スタックオーバーフローってメモリ不足だろ?
MSDOSでやってるならわからんでもないけど、Winでそれが出るならプログラムがおかしいかと

87 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:31:35 ]
やっぱりそうですよね・・・
こことほとんど同じやり方してるんですけど駄目みたいです
ttp://www13.plala.or.jp/kymats/study/game_other/TOKOPUYO/tokopuyo.html

88 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:34:46 ]
>>85
メモリのオーバーフローかもしれないと思うなら、
試しにチェックする数を3とか2とか、もっと少ない再帰で終わるものにしてみるといい
それでもプログラムが落ちるなら、無限再帰とかに陥っている可能性が高い

89 名前:87 mailto:sage [2007/12/24(月) 22:35:48 ]
あれ、スタックオーバーフローってメモリ不足でいんだっけ?
用語分かんね

90 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:37:15 ]
>>85
再帰だとありうるかも知れんが、まずは処理を見直したほうが良い。
再帰のネストが深すぎるかもしれない。
おかしくなさそうだったらmallocで。

>>86
スタックサイズはリンク時に決まる。
実メモリのサイズとは関係ない。
VisualC++の場合、デフォルトは1MBらしい。


91 名前:デフォルトの名無しさん [2007/12/24(月) 22:42:14 ]
動的メモリが動作中のプログラムと同じOS上で、デフラグをするとメモリの
内容が移動してしまったり、、、って事態は起こるんでしょうか?

他に、デフラグをするとおかしくなっちゃうような組み方ってどんなのがあります?

92 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:46:21 ]
>>88
カウントが3900とかになってるので無限ループっぽいですw
ちなみに右方向限定とかならエラーは出ないです
ありがとうございました

93 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:06:38 ]
>>91

デフラグ、ってHDDのデフラグだよね?
いくらなんでもそんなへぼいメモリ管理をしてない。




94 名前:デフォルトの名無しさん [2007/12/24(月) 23:08:30 ]
>>93
ですよね・・・。
デフラグでどうにかなっちゃうような実装があるとしたらC言語以外の何かなのか・・・。
とりあえず、C言語ではそういう実装はありえない、ってことでいいんですよね?

95 名前:デフォルトの名無しさん [2007/12/24(月) 23:11:56 ]
C でよく、int argc; とか、char *argv; なんて名前の変数をみかけるんですが、
どんな役割を持つ変数なんでしょうか?一般的に・・・。たいていコメントがないので・・。



96 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:14:36 ]
>>95
コマンドライン引数が格納される

97 名前:デフォルトの名無しさん [2007/12/24(月) 23:17:25 ]
>>96
なるほど。ありがとうございました。

98 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:21:07 ]
>>94

C言語は関係なく、OSの実装次第。
デフラグでおかしくなるとしたら、
デフラグツールがおかしいか、OSがおかしいかのどっちか。


99 名前:デフォルトの名無しさん [2007/12/24(月) 23:34:17 ]
>>98
datファイルなんかを動的に持つってことは可能でしょうか?
で、また読み込みに行ったときに、デフラグされてると、どこにあるか分からなくなる、、とか。。

基本的にファイルはHDDに保存するもので、「動的」って概念すらないんですよね・・・?
あるいはファイル名を動的メモリに持つ・・・とか?う〜ん・・・

どう頑張っても、Cの実装次第で、デフラグされるとおかしくなるようなプログラムは作れない・・・ですよね?

100 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:46:02 ]
OSのファイルシステムドライバを通さずにディスクを直に読み書きしてたりすると、
デフラグでおかしくなるようなことはあるだろう。

101 名前:デフォルトの名無しさん [2007/12/24(月) 23:51:23 ]
>>100
なるほど。。それかもしれないです。
OSのファイルシステムドライバを通さないと、実装がカンタンとか、
そういうメリットがあるんでしょうか?

102 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:54:14 ]
>datファイルなんかを動的に持つってことは可能でしょうか?

ファイルを動的に持つ、ってどういう意味?

>で、また読み込みに行ったときに、デフラグされてると、どこにあるか分からなくなる、、とか。。

そうはならない。そのあたりはファイルシステムがどうにかする。


>どう頑張っても、Cの実装次第で、デフラグされるとおかしくなるようなプログラムは作れない・・・ですよね?

CじゃなくてOSの実装だってば。
C言語的には、HDDのセクタを直接読み書きするような物だったら、
デフラグでおかしくなる可能性はある。
が、まともなOSならドライバじゃない限り
HDDのセクタを読み書きできないようになってる。

HDDのセクタを直接読み書きせず、ファイルシステムを経由してアクセスするなら、
おかしくなることはない。



103 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:55:28 ]
>>101

逆に実装が難しくなるので、特殊な用途にしか使わない。
データ復旧ツールとか。




104 名前:デフォルトの名無しさん [2007/12/25(火) 00:08:09 ]
>>102-103
う〜ん・・・そうですか。ありがとうございます。
ドライバやデータ復旧ツールを開発する訳でもないので、
私の聞き間違いか、言った人の勘違いかなんかでしょう・・・。
ありがとうございました。

105 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:15:19 ]
>>101
それこそ自分でデフラグするソフトを作るのでもない限り不要だね

106 名前:デフォルトの名無しさん [2007/12/25(火) 00:42:37 ]
お初です。

getch関数の質問なんですが

文字入出力関数を作成したのですが2バイトキーを無視する処理で

iKey = getch();

if ((0x00 == iKey) && (0xe0 == iKey)) {
getch();
}

というソースを書いたのですが、iKeyの型をintからcharにするとなぜかifの条件に引っかからなくなってしまうんですが、なぜなのでしょう???

知恵をお貸しください。

107 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:55:10 ]
△ char
○ unsigned char

char が符号無しな環境なら char でも動くが。

0xe0 の型は int 型で、これは 224 という値に相当するけど、
char が符号つきだと、iKey = 0xe0 として iKey に入っている値はまあ大抵は -32 になる。

108 名前:デフォルトの名無しさん [2007/12/25(火) 00:58:11 ]
こんなソースがあるんですが、

int a;

struct S1 {
  struct {
    int i;
    HANDLE h;
  }S2[100];
} ;


...
S1->S2[a].i = 001519 ;   /* 001519は時分秒 */


S2[100]とされているものに対して、S2[a] を入れることによってどうなるのかが
よく分かりません。これは、構造体の配列・・・?

109 名前:デフォルトの名無しさん [2007/12/25(火) 01:04:32 ]
早速の返答ありがとうございます。

このことをC言語の初心者にも分かり易く説明してくださいと言われたらどう答えますか?

110 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:05:38 ]
>>109
そのまま教えればいいだろ。
わからなかったら分かるまで考えてもらえばいい。

111 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:13:13 ]
本気で話し出すと汎整数拡張の話になってしまうが、
まあ簡単に言うなら char が符号つきだと
0xe0 は値の範囲から外れちゃうから等しくなんないよ、と。

112 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:13:52 ]
>>108
構造体の配列。

113 名前:デフォルトの名無しさん [2007/12/25(火) 01:14:03 ]
ちなみに説明するというのがメインの課題なので

おしえてもらった通りに説明したいと思います。

ありがとうございました。



114 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:19:48 ]
ビットシフト操作に関して、算術シフトと論理シフトの、
どっちを行うかは、規格できっちり決まっているものですか?

115 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:22:24 ]
>>114
signed なら算術
unsigned なら論理

116 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:23:18 ]
>>115
unsigned なら論理シフトだが、
signed の場合にどうするかは規格で決められていない。処理系定義。

117 名前:115 mailto:sage [2007/12/25(火) 01:25:34 ]
>>116
ぅぉ、マジカ。知らんかった…トンクス。

118 名前:デフォルトの名無しさん [2007/12/25(火) 01:27:04 ]
>>112
なるほど・・・。

int a = 5;

だとしたら、S2構造体の 5番目の変数 i にアクセスしてるってことなんですね。

  S1->
となってるのは、なんでなんでしょうか?

119 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:29:09 ]
S1-> なんてできるはずがないんだが。

120 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:31:30 ]
× S2構造体の 5番目の変数 i
○ S1 のメンバである、無名の構造体の配列 S2 の 5 番目の要素の、メンバ i

121 名前:デフォルトの名無しさん [2007/12/25(火) 01:32:23 ]
>>119
そうなんですか?
至るところで、

S1->

をやってます。。そもそもなんで入れ子なんだろう・・・構造体要素1個なのに
至るところで入れ子やってます・・。

122 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:33:46 ]
struct {
 struct {
  int i;
  HANDLE h;
 } S2[100];
} S1[1];

となってないか?

123 名前:デフォルトの名無しさん [2007/12/25(火) 01:36:54 ]
>>120
「S2」は「構造体の配列名」であって、「構造体名」ではないんですね。
構造体名は無名なんですね。

メンバ i
は、構造体配列 S2 の5番目の要素の無名構造体のメンバ i
って感じでしょうか。



124 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:41:05 ]
まあ言葉で表現すると難しいが、とりあえず

                       こいつのことだ
                              ↓
  S2[100]  [i | h] [i | h] [i | h] [i | h] [i | h] [i | h] [i | h] ... [i | h]
         S2[0] S2[1] S2[2] S2[3] S2[4] S2[5] S2[6] ... S2[99]

125 名前:デフォルトの名無しさん [2007/12/25(火) 01:41:56 ]
>>122
あ、すみません!
S1->S2[a].i = 001519 ;
をやる前に、

struct S1 *S1 ;

となってました。
この場合、また型名と変数名が同じなので、
S1->
がどっちを指してるか分からないのですが・・・(n

126 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:42:53 ]
>>125
単に構造体タグ名と変数名が同じというだけだな。
S1-> の S1 は変数名。

127 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:45:39 ]
001519 ってのが凄く気になる。
こう書くと 8 進数になるけど 9 ってのが入ってて、
エラーになるはずだが。

128 名前:デフォルトの名無しさん [2007/12/25(火) 01:49:53 ]
>>124
どうもご丁寧にありがとうございます。
なるほど。分かり易いです。
>>126
struct S1 *p ;
p->
ってことですね。なんで分かるんですかぁぁ・・??

p->
だとすると、なんでわざわざポインタ型にして、入れ子の中の構造体に
アクセス??あああ訳が分からない・・・・結局 i には何が入っているの・・・

129 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:56:13 ]
>ってことですね。なんで分かるんですかぁぁ・・??
構造体タグ名を使って S1-> という風にはできないから
S1 は何らかのポインタであるはずだ、ということになる。
C だと構造体タグ名と同名の変数を作る事はできるけど、普通は紛らわしいのでやらない。

>結局〜
例えば

struct S1 hoge;
struct S1 *S1 = &hoge;

とした場合、S1->S2[a].i は hoge.S2[a].i と同じことになる。

130 名前:デフォルトの名無しさん [2007/12/25(火) 01:59:49 ]
>>127
すみません。001519 に入ってる値は、ビット演算子で時分秒をいろいろ
ゴチャゴチャやっていた値が入っていて、ビット演算子がよく分からなかったので、
>>105 の書き込み時間を適当に入れてみただけなんです。

晒してしまうと、

struct tm tagTime;
  pstm = &tagTime;
    nRunTime =      /* 時分秒設定 */
     (((((((pstm->tm_hour / 10) << 4) | (pstm->tm_hour % 10)) << 8) |
     ((pstm->tm_min / 10) << 4) | (pstm->tm_min % 10)) << 8) |
     ((pstm->tm_sec / 10) << 4) | (pstm->tm_sec)) << 8 ;

S1->S2[a].i = nRunTime ;

ってなことをやってます。

131 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:01:03 ]
まあ、ちゃんとやってるのならいいのよ。

132 名前:デフォルトの名無しさん [2007/12/25(火) 02:03:20 ]
#include<stdio.h>
int gcm(int a,int b);
int gcm(int a,int b){
int amari;
if( a < b ){
while(1){
amari = b % a;
if( amari == 0 ){
return amari;
break;
}else{
a = b;
b = amari;
}
}
}else{
while(1){
amari = a % b;
if( amari == 0 ){
return amari;
break;
}else{
b = a;
a = amari;
}
}
}
}

133 名前:デフォルトの名無しさん [2007/12/25(火) 02:04:01 ]

int main(void){
int x,y;
int ans;

printf("*********最大公約数の計算をします********\n\n\n");
printf("1つ目の整数値を入力してください:");
scanf("%d",&x);
printf("\n2つ目の整数値を入力してください:");
scanf("%d",&y);
ans = gcm(x,y);
printf( "\n\n\nGCM(%d %d) = %d", x, y, ans);

return 0;

}



134 名前:デフォルトの名無しさん [2007/12/25(火) 02:06:00 ]
>>132
>>133
ユークリッドの互助法のプログラムを書いてみたんですが、
二つの数値入力してエンターキー押したらコマンドプロンプトの画面がすぐ消えてしまいます。

自分ではこれであってると思うのですがどこがおかしいか見てもらえますか。
お願いします。

135 名前:デフォルトの名無しさん [2007/12/25(火) 02:07:28 ]
>>129
>S1->S2[a].i は hoge.S2[a].i と同じ
が難解すぎる・・・orz

>>129を考えながら寝ることにします。
夜分遅くまでお付き合いいただき、大変ありがとうございました!
おやすみなさい。

136 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:08:21 ]
>>134
Ctrl+F5 で実行すると消えない。
あるいは、最後にもう1つ入力をいれておくか。

まあ、まだバグがあるようだが、それは考えてくれ。

137 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:09:10 ]
>>135
図を書くといいよ。

138 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:10:18 ]
>>134
一瞬で終わる計算なんだからそれで正しいだろう

139 名前:デフォルトの名無しさん [2007/12/25(火) 02:15:39 ]
>>136
>>138
Ctrl+F5なら消えないんですかほむほむ。
return amariを return bに直したら正常に計算する事ができました。
ありがとうございます。


140 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:20:07 ]
>>135
(*S1).S2[a].i と同じではどうだ。

141 名前:デフォルトの名無しさん [2007/12/25(火) 09:48:22 ]
失礼します。
現在、MSNメッセンジャーで受信したメッセージから特定のコマンドを抜き出して
別のアプリケーションへ送るというソフトを作ろうとしています。


そこで、まず、あらかじめアクティブにしておいたメッセンジャーで受信した文字列を
1秒間隔でCTRL+A CTRL+Cを利用して取り込む・・・という方法を調べているのですが分かりません。

どなたか答えていただける方がいればよろしくお願いいたします。

142 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 09:57:58 ]
>>141
メッセンジャーでやったことはないけど
直接ウインドウテキスト取れないか?

143 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 09:58:48 ]
>>141

スレ違い。
VisualC++スレへ。
pc11.2ch.net/test/read.cgi/tech/1196430042/




144 名前:デフォルトの名無しさん [2007/12/25(火) 10:02:25 ]
>>142
SetWindowText()ってやつでしょうか?

>>143
あれ・・・ここじゃだめなんでしょうか?

145 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 10:14:18 ]
>>144
スレタイ読める?

146 名前:デフォルトの名無しさん [2007/12/25(火) 10:17:47 ]
>>145
いや、C言語・・・。

147 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 10:18:40 ]
>>146
Win32API質問箱 Build60
pc11.2ch.net/test/read.cgi/tech/1196874830/

148 名前:デフォルトの名無しさん [2007/12/25(火) 10:42:28 ]
>>146ですが移動します。

149 名前:デフォルトの名無しさん [2007/12/25(火) 11:57:03 ]
初心者ですが。
データ型って意味あんすか?・・・
signed long intとか long intと同じじゃないすか?

undigned型とかって使ったりすんでしょうかね?

150 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 12:05:08 ]
>>149
long intはsigned long int の省略みたいな物だからまあ同じだろうね

unsignedは使うだろ
signedで桁数が足りなくて、負数を扱わない時とか

151 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 13:05:17 ]
>>149
・-(マイナス)の値がありえない変数のバグ防止
・char型については、signedを指定しないときの符号の有無は処理系依存

意味無いものなんて無い。必要に応じて使い分けるべし。

152 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:01:54 ]
%lfで表示すると0.0000とかになるんですが、
eを使って表示させると6.111e-20とか、計算誤差の分が表示されてしまいます。

解決する方法はありますか?

153 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:17:04 ]
>>152
どう表示させたいのかわからない。
%3.1e とか?



154 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:26:40 ]
>>153
eを用いて表示させたいんですが、精度は小数点以下5桁ぐらいで、それいじょうはeの表示に反映させないようにしたいです

155 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:33:16 ]
こんな感じか
if (fabs(x) < 0.00001) {
x = 0;
}
printf("%e", x);

156 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:36:21 ]
>>155
0のときだけじゃなく、どんな数字にたいしても精度を切り捨てたいんです

157 名前:デフォルトの名無しさん [2007/12/25(火) 15:50:41 ]
いま、ポインタとファイルオープンまで学んだんだが。
あんたら何作ってる?
俺はアドレス帳など作ってみたんだが他にやりがいのある物はないか?


158 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:58:25 ]
オセロとかテトリスとか簡単なゲームなんかどうかな

159 名前:デフォルトの名無しさん [2007/12/25(火) 16:06:06 ]
テトリスとか敷居高そうっすね。
物体が動くようにしたり

160 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 16:17:08 ]
>>156
つ[%.5g]

161 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:05:39 ]
正数同士の除算の切捨て誤差を
四捨五入で求めたいのですが、
どういう風に書けばいいでしょうか。
今は下記のようにしています。

int n,m,d

n = m / d;
if( (m % d) > (d >> 1) ) n ++;

162 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:20:57 ]
それのどこが切り捨て誤差?

163 名前:デフォルトの名無しさん [2007/12/25(火) 17:26:47 ]
そもそも整数演算で打ち切り誤差など発生しない。




164 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:30:17 ]
>>160
うまくいきません。6.111e-20とかでてきます。

165 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:30:43 ]
>>164
どう表示させたいのかわかんあいんだよ

166 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:36:17 ]
>>165
double型の変数の
小数点以下、例えば5桁だけを利用して表示したいんです。

0.000000002121なら0を表示したいです。
数がでかくなったらeを使ってすっきり表示したいです

167 名前:デフォルトの名無しさん [2007/12/25(火) 17:42:13 ]
#include<stdio.h>


char pai[3][9] = { {'1','2','3','4','5','6','7','8','9'},
{'@','A','B','C','D','E','F','G','H'},
{'一','二','三','四','伍','六','七','八','九'},
};
int main (void){
printf("%c",pai[0][2]);

return 0;

}
これで3という文字が表示されるはずなんですがうまくいきません。
どうなおせばいいのでしょうか。

168 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:43:44 ]
>>166
こうか?
if(fabs(x)>=1000){
printf("%e", x);
}else{
printf("%f", x);
}

169 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:46:20 ]
>>167
Warningいっぱい出なかった?
3はマルチバイト文字だから、'3' とやったら半分しか入らんぞ

170 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:48:37 ]
>>166
二度手間だけど、丸めと表示の二段階で行なう。
void print(double foo)
{
char buf[20];
sprintf(buf, "%.5g", 1 + foo);
printf("%.5g", atof(buf) - 1);
}

171 名前:デフォルトの名無しさん [2007/12/25(火) 17:50:40 ]
>>166
自分の好きにフォーマットをコントロールしたいなら、
もうprintfのフォーマット機能に頼らず、
自分でフォーマットするプログラムを書いた方が早くないか?
いや、そんな気がする。どうだろう?

172 名前:デフォルトの名無しさん [2007/12/25(火) 18:18:21 ]
てす

173 名前:デフォルトの名無しさん [2007/12/25(火) 18:27:50 ]
>>169
3をいれるのにはどうやればいいんですか?



174 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 18:35:19 ]
>>173
そりゃキミがどうしたいのかによって変わってくるが・・・
char pai2[3][9*2+1] = {
{"123456789"},
{"@ABCDEFGH"},
{"一二三四伍六七八九"},
};

printf("%c%c",pai2[0][2*2],pai2[0][2*2+1]);
これでも一応出るんで、あとは考えて。

175 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 18:36:41 ]
>>167,173
●文字列にする方法
char pai ⇒ const char *pai
'3'など ⇒ "3"
printf() ⇒ printf("%s", ...


●ワイド文字にする方法
char pai ⇒ wchar_t pai
'3'など ⇒ L'3'
printf() ⇒ wprintf(L"%lc", ...

かなあ? いまいち自信なし。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<237KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef