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


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

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



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

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

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

467 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:24:39 ]
内部的にどのタイミングで処理してても、変わらないんだが。

468 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:26:04 ]
ということはgetcharでabcdefと入力した場合は
aからfまで順に1つ1つ処理していくということになるんですか?

469 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:30:56 ]
while ((c = getchar()) != EOF) {
puts("なんか入力された\n");
}

470 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:34:00 ]
エンターを押した時点で処理が開始されるが、文字列をまとめてじゃなくて一文字ずつ読み込む

471 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:35:44 ]
#include <stdio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF) {
printf("%d\n" ,c);
}
return 0;
}

出力した結果、>>470さんの言ったとおり、例えばAAA(リターン) の場合綺麗に65656510と表示されました!
これで問題に取り組んでみたいと思います!
ありがとうございます!!!

472 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:37:46 ]
あれ?Enter待ちになるのか/(^o^)\
引っ込んでようorz

473 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:40:34 ]
いえいえ、協力してくれようとしてくれただけでも感謝感激雨霰です。
皆さん本当にありがとうございました。

474 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:41:46 ]
霰が霧に見えた orz

475 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 09:44:07 ]
goto嫌いな人が do{}while(0) で break を使っているのを見て泣けた。



476 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 11:44:11 ]
VisualStudio2008で作ったプログラムなんですが、
重複したシンボルがある(?)とか怒られてて困っています
原因がわかる方いませんか?おねがいします

www.uploda.org/uporg1085799.zip.html
一応ファイルをうpしました

477 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 11:56:55 ]
>>476
マルチうざい

478 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:19:04 ]
>>476
どのシンボルが重複してるかまで表示されてるだろ?
それが重複してるんだよ。

479 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:41:16 ]
>>478
ありがとうございました。よく見たら書いてました。

480 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 15:03:31 ]
2バイト文字の扱いがよくわからないです
例えば、配列の中身を順に表示させようと思っても文字化けします
array[11] = {"しーげんご"};
Shift-Jisとかに変換してから使うんですか?

481 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 15:17:35 ]
>>480
> 配列の中身を順に・・・
1バイトずつの表示はできない。

482 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 15:30:49 ]
>>481
そうなんですか・・・
じゃあ半角英字みたいに平仮名でも文字コードに数字を足して
次の文字へ!みたいな処理はできますか

483 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 15:54:37 ]
なんの文字コードを使っているのかわからないが、
いちど使用している文字コードの文字コード表を見ることを薦める。

ちなもに、S-JISでは、「あ」「い」「う」は,それぞれ,0x82a0, 0x82a2, 0x82a4

484 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 16:02:41 ]
>>483
調べてみたんですが、SーJISで「あ」を表示させるには
%cを2回と0x82,0xa0をつかって表示させると書いてありました。
ほかの表示方法は見つけられなかったのですが、ありますか?

485 名前:452 mailto:sage [2007/10/28(日) 17:12:30 ]
無事できました!
が、次の問題で一点引っかかる事が('A`
終了条件eまたはEってどういう風に記述するんですか?
while(gets(str) != ○○)
の○○にeかEを入力した場合で終了という風にしたいのですが・・・。
'e' とか'E'は駄目みたいです。



486 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:13:57 ]
なんでgetsになってんの?

487 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:17:56 ]
あ、ごめんなさい。
習う順番でgetchar+putchar → gets+putsという風になってて
問題が、
gets() を用いて、テストの点数を文字列として入力しなさい。
上記処理中、eかEを入力した場合は下記処理をスキップさせ、内容を出力せよ っていう問題なんです。
考え方としては、今まで習ってきたように ○○が入力されるまでは処理を続けるというwhileループでの処理だと思うんですが・・・。

488 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:21:55 ]
文字列の中に'e'か'E'があるかどうかをチェックする

489 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 17:33:29 ]
ありがとうございます><
int変数aというものを新たに用意し、
getsで入力した中に、a = 'e' か a='E' での判定を入れたら無事とおりました><

490 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:18:39 ]
どうしてもwhile内で済ませたかったら、
while(gets(str)[0] == 'E')
とか? 試してないけど

NULLが返ってきた時に危険だなw

491 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:42:10 ]
ttp://a-draw.com/contents/uploader2/src/up0121.txt
できたました!
こんな長い(すごい短いんだろうけど・・・)の書いたの初めてです・・・。

492 名前:デフォルトの名無しさん [2007/10/28(日) 19:47:06 ]
3つの整数値を読み込んでそれらの値がすべて等しければ「3つの値は等しいです」と、
どれか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つの値は等しいですと表示されてしまいます
問題点を教えてください><

493 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:53:17 ]
n1==n2==n3 は n1==(n2==n3) で、意味が違う。
n2||n3 n2||n1 n1||n3 は、それぞれ両方0のとき0、それ以外だと1になる。

494 名前:デフォルトの名無しさん [2007/10/28(日) 19:55:04 ]
#include <stdio.h>
int 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つの値は異なります");
}

495 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:56:48 ]
問題点を聞かれてるのに、俺プログラムを自慢されても困る



496 名前:492 [2007/10/28(日) 20:05:56 ]
>>493-494
ありがとうございました。||の使い方をかんちがいしていました。。。

497 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 20:33:46 ]
>>491
なんか無駄が多い気がするが、まあそれは眼をつむっておこう


だがgetsの入力先配列が要素数2てのは……誤入力もあるだろうし、せめて256くらい確保した方が良い気がする

というか、要素数2だとヌル文字入らないじゃん(というか100も入らないし)
atoiってヌル文字入らないと変な動作になることあるはず

498 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:06:24 ]
>>497
むむ、
getsでの取得は 例えば入力が50なら、charだから配列[0]に50 で配列[1]に\0が入る=2個で足りるってことじゃないですか?
もしgetsでの取得変数がintの場合なら点数最大100(つまり3桁)は最低でも[4]になるのはわかります。

まぁでも、教えてもらっている人にも、配列は無駄でもいいから多く取った方がいいと教わりましたので、多くとる事を、この先心がけていきます!
ありがとうございました!

499 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:21:49 ]
ごめんなさいボクが馬鹿でした。
ためしにcharでの変数aに入力したものを、出力させるのかいてみて
a[0]をやったら、最初の1文字しか出力されませんでした。
本当にありがとうございました。

500 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 22:56:33 ]
int *foo
int* foo
の違いを教えてください><

今までint *foo しか使ってなくて
いきなりint* fooが出てきてわけわかりません><

501 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 22:57:42 ]
>>500
次は int * foo だ

502 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:00:18 ]
宣言時のアヌスの位置くらい自由にさせてあげてください

503 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:03:21 ]
いまだにforの無限ループを見ると悲しくなる( ; ; )

504 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:04:11 ]
>>501
そんなのもあるのですか

ソース解読してる途中にこんなの出てきてわけわからんのです
すいませn助けてください。ほんと

何でグぐれ場いいのかもわからなくて
すんません、マジで

505 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:07:39 ]
>>504
int *foo;
int* foo;
int * foo;
は全部一緒



506 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:09:54 ]
ありがとうございます

なんでこんな風に書き方分けてるのか

507 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:14:35 ]
*は型名にも変数名にも使えないから問題ない

508 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:35:53 ]
初歩的な質問なのですが

for(int i = size >> 1 ; ; i >>= 1)

というループがあったのですが
size >> 1 や i >>= 1 というのはどういう意味なのですか?




509 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:37:41 ]
int*foo;もいけるんじゃない?

510 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:40:19 ]
>>508
ビットシフト

511 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:44:55 ]
>>508のだとiをビットシフトするとどうなるんでしょう

あとforの2つ目のところが空白なのもわけがわかりません

512 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:46:35 ]
i >>= 1 すると i の各ビットが右へ 1 桁ずつずれる

forの2つめが空白の場合は条件なしの繰り返し=無限ループ

513 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:53:43 ]
>>511
iが10(2進数で1010)だとすると5(101)になる
5だとすると2(10)になる。その次はもう予想できるよな?

514 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 00:07:56 ]
>>512-513
ありがとうお兄ちゃんたち!

515 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:18:22 ]
>>506
俺は
int* foo;
のほうが好きかな
「int型へのポインタを返す」ってのをあらわしてる感じで



516 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:35:28 ]
俺は
int *foo;
のほうが好きかな
int *foo, *bar;
みたいに複数いっぺんに宣言するときわかりやすいし

517 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:35:53 ]
しかしそれだと、2個目以下に*付け忘れる可能性がある。

518 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:37:09 ]
517は>>515

519 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 02:21:33 ]
大きな配列の初期化って
どうしていくべきですか?
100X100くらいの配列の

520 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 02:23:34 ]
あんな風にしていくべきだと俺は思っている
だがそういう風にするとああいうことも起きるわけでいちがいに
どちらがいいとは判断しかねるな

521 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 06:11:01 ]
ど素人におすすめの参考書を教えてください。

522 名前:380 [2007/10/29(月) 11:19:52 ]
先週質問させていただいた者ですが、mallocでどうしても組めません。
mallocでメモリに格納→格納した文字列を検索後抜き出す動作をもう一度ご教示いただけないでしょうか。

523 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 12:46:28 ]
>>522
先ずは試しにfgets()版を見せてくれ。

524 名前:380 [2007/10/29(月) 13:16:03 ]
>>523
void 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);
}
}

525 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:31:08 ]
>>524=380
「えらい時間」とあるけど、どれくらい掛かるの?
試しに>524相当のロジックを書いて10万と1行のファイルで動かしてみたが、1秒も掛からないんだが。



526 名前:380 [2007/10/29(月) 13:37:22 ]
>>525
これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。
それで更にその中に計算式が組み込まれていますので・・・・

527 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:45:24 ]
>これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。
>524からこれは読み取れないわけだがw
つーか、それはそもそもアルゴリズムに問題がないか?
オンメモリでもそれだけアクセスすればそれなりに遅いと思うぞ。

528 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:49:43 ]
どうでもいいが、10万行^5は10^25だな。
仮に1nsで処理できる凄まじいコンピュータがあったとして、ざっと3億年掛かる計算だが。

529 名前:デフォルトの名無しさん mailto:sage [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)

次レス以降にソースを書きます

530 名前:1/2 mailto:sage [2007/10/29(月) 14:58:49 ]
#include "stdio.h"
#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");
}


531 名前:2/2 [2007/10/29(月) 14:59:25 ]
int main (void){
structQ *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;
}

532 名前:デフォルトの名無しさん [2007/10/29(月) 15:05:00 ]
>>529
STL使っておけ

vector< string > x;

x.push_back("文字列");
x.push_back("名無しです");

x[0],x[1]で文字列にアクセスできる

533 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:09:27 ]
>scanf("%s", &op);

文字列を入力したいんなら、char じゃだめだろ
char には 1 文字しか入らない
char の配列にしないと

534 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:11:49 ]
>>532
突っ込みどころだらけ。

>#include "stdio.h"
cの規格にあるインクルードファイルは""で括ってはいけません。
また、一般的にプロジェクトローカルなもの以外は<>で括るべきです。

>ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、
%d指定で整数値を入力する場合、入力に失敗した場合は変数が更新されないので、「0と認識してしまう」というのは間違い。

>scanf("%s", &op);
文字型への%s指定は行なってはいけません。%sはあくまでも、文字列入力です。
この呼び出しで恐らくスタック領域の破壊が起こり、他の変数の値がおかしくなったせいでキュー登録に失敗した可能性があります。

535 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:12:45 ]
>>532
cにはSTLなどありません。スレタイも読めないくらい頭が回らないのであれば、無理に回答しなくて宜しいかと。



536 名前:デフォルトの名無しさん [2007/10/29(月) 15:26:38 ]
>>533
opはオペレーション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)

537 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:30:17 ]
>>536
"%c"を" %c"にして味噌。

538 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:32:33 ]
>>537
できました!
ありがとうございます。
%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)

539 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:35:11 ]
>>524
ファイルのデータをすべてmallocで確保したヒープ領域に読み込む。
1.fstat関数でファイルサイズを取得する。
2.そのファイルサイズ分をmallocし、そこにファイルの全レコードを読み込む。
  レコードサイズ64バイトで10万レコードだと、6.4Mバイトほど。
3.検索はmallocで確保したバッファの中を検索する。


540 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:36:30 ]
>>538
いや、今回はたまたまその前の%sの喰い残しの改行文字を破棄する必要があるので、空白を入れることで回避したと言うだけ。
毎回空白が必要だと言うわけではない。

scanf()の振る舞いについて、下手な入門書に頼らずきちんと確認しておくことをお勧めしておきます。
因みに、printf()とscanf()の指定子を互換性があるかのごとく並列で解説しているような入門書が多く出回っていますが、
互換性はないものと思って理解しておく方が間違いがありません。

541 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:42:20 ]
>>540
scanfについて調べたら、改行の読み捨てが必要な場合があるみたいですね。
勉強になりました、ありがとうございます。

542 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 18:05:25 ]
2ちゃんのトリップ生成法なんですがC言語板をしりたいです

$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";

543 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 19:59:39 ]
丸投げはスレ違い

544 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:36:42 ]
printf系の関数使わないで、浮動小数点数を文字列に変換するにはどうしたらいいでしょうか?

545 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:47:48 ]
インクルードひとつも使わないやつ書いてやるぜ



546 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:51:06 ]
面倒になったので一部日本語で説明する

double x;;
char top[100] down[100],t,d;


小数点の一から始めて、下向きに数字を読み取ってdownにいれて
一より大きいなら上向きにtopに入れていく

最後に出力

547 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 21:53:10 ]
>>544 行数の関係上汚いコードで申し訳ない。
単なる思いつきで書いたから、特に色々とは突っ込まないで欲しい。
あと、こっちの環境ではまともに動いてくれない。 小数点の精度上、
下位ビットにゴミがあってそれを取り込んでしまう。
まぁ、その辺はなんとかしてくれい。 

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); }

548 名前:プリンがー mailto:aaa [2007/10/29(月) 22:16:02 ]
100個の実数データを配列a[100]に読んで、その最大値をmaxという
変数に求め、結果を出力するプログラムを書きなさい。

#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) ;
}

 これであってますか?


549 名前:aho mailto:sage [2007/10/29(月) 22:17:53 ]
>>548
あってるよ〜

550 名前:プリンがー mailto:aaa [2007/10/29(月) 22:22:29 ]
>>549
ありがとうございます。


551 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:22:40 ]
あってねぇーよ

double a[100]で100個用意したのはいいが
for(i=0;i<=100;i++){ の行で101個目にアクセスしてるだろ。

for(i=0;i<100;i++){ が正解

552 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:24:32 ]
実験データは正数だけかな?
配列に入れる必要性がわからんけど後でプログラムを拡張するのかな

553 名前:aho mailto:sage [2007/10/29(月) 22:25:39 ]
>>550
ばれたか。
やるな、おぬし!

554 名前:プリンがー mailto:aaa [2007/10/29(月) 23:00:39 ]
1から1000までの数値の中で、2または3の倍数でかつ4の倍数でないものを
出力するプログラムを書きなさい。

#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);
}

これであってますか?

555 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:02:21 ]
memcpy(input,output,size<<1);

//array copy
for(i=0; i < (size<<1); i++)
output[i] = input[i];

すみません、この二つの違いを教えてください。
初めに下のほうで計算していたら望む結果が出てこなくて
上のとおりやったら出来ました…

同じことをやっていると思ったのですが、どう違うのでしょうか



556 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:03:12 ]
if ((i % 2 == 0 || i % 3 == 0) && (i % 4 != 0))

557 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:04:33 ]
>>554
回したら、ものすごい数の改行が出た。

558 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:07:51 ]
>>555
outputとinputの型によって差がでるんじゃないかな

559 名前:プリンがー mailto:aaa [2007/10/29(月) 23:08:15 ]
>>554
訂正

#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);
}

これでいいでしょうか??


560 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:09:29 ]
×putchar('\n');
○printf("%d ", i);

561 名前:プリンがー mailto:aaa [2007/10/29(月) 23:12:32 ]
>>560
ありがとうございます。


562 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:13:39 ]
あってませんよ

563 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:15:45 ]
>>558
どちらもint型のポインタ(1次元配列)なのですが。

単に求めた結果が出ればいいだけなら、これでいいのですが
初めのソースが合ってると信じて、違う原因がわからないのは自分でも納得がいかないので

564 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:15:54 ]
テキストファイルに aあ と書いてそれを16進形式でテキストファイルに出力すると、
61 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);
見たいな感じで出力しました。

565 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:22:43 ]
>>564
char tmp[10];
tmp[0] = (char)strtol("82", NULL, 16);
tmp[1] = (char)strtol("A0", NULL, 16);
tmp[2] = '\0';

printf("%s", tmp);




566 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:23:54 ]
>>555>>563
その二つはinputとoutputがchar型配列でない限り、違う結果になる


>memcpy(input,output,size<<1);
ここの第三引数は、バイト単位でのサイズを指定する

>for(i=0; i < (size<<1); i++)
>output[i] = input[i];
こっちで指定するのは、配列の要素数

567 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:25:46 ]
>>564
printf("%c%c%c",0x61,0x82,0xA0);






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

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

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