C言語なら俺に聞け( ..
[2ch|▼Menu]
481:デフォルトの名無しさん
07/10/28 15:17:35
>>480
> 配列の中身を順に・・・
1バイトずつの表示はできない。

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

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

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

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

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

486:デフォルトの名無しさん
07/10/28 17:13:57
なんでgetsになってんの?

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

488:デフォルトの名無しさん
07/10/28 17:21:55
文字列の中に'e'か'E'があるかどうかをチェックする

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

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

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

491:デフォルトの名無しさん
07/10/28 19:42:10
URLリンク(a-draw.com)
できたました!
こんな長い(すごい短いんだろうけど・・・)の書いたの初めてです・・・。

492:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/28 19:53:17
n1==n2==n3 は n1==(n2==n3) で、意味が違う。
n2||n3 n2||n1 n1||n3 は、それぞれ両方0のとき0、それ以外だと1になる。

494:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/28 19:56:48
問題点を聞かれてるのに、俺プログラムを自慢されても困る

496:492
07/10/28 20:05:56
>>493-494
ありがとうございました。||の使い方をかんちがいしていました。。。

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


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

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

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

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

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

500:デフォルトの名無しさん
07/10/28 22:56:33
int *foo
int* foo
の違いを教えてください><

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

501:デフォルトの名無しさん
07/10/28 22:57:42
>>500
次は int * foo だ

502:デフォルトの名無しさん
07/10/28 23:00:18
宣言時のアヌスの位置くらい自由にさせてあげてください

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

504:デフォルトの名無しさん
07/10/28 23:04:11
>>501
そんなのもあるのですか

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

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

505:デフォルトの名無しさん
07/10/28 23:07:39
>>504
int *foo;
int* foo;
int * foo;
は全部一緒

506:デフォルトの名無しさん
07/10/28 23:09:54
ありがとうございます

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

507:デフォルトの名無しさん
07/10/28 23:14:35
*は型名にも変数名にも使えないから問題ない

508:デフォルトの名無しさん
07/10/28 23:35:53
初歩的な質問なのですが

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

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




509:デフォルトの名無しさん
07/10/28 23:37:41
int*foo;もいけるんじゃない?

510:デフォルトの名無しさん
07/10/28 23:40:19
>>508
ビットシフト

511:デフォルトの名無しさん
07/10/28 23:44:55
>>508のだとiをビットシフトするとどうなるんでしょう

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

512:デフォルトの名無しさん
07/10/28 23:46:35
i >>= 1 すると i の各ビットが右へ 1 桁ずつずれる

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

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

514:デフォルトの名無しさん
07/10/29 00:07:56
>>512-513
ありがとうお兄ちゃんたち!

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

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

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

518:デフォルトの名無しさん
07/10/29 01:37:09
517は>>515

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

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

521:デフォルトの名無しさん
07/10/29 06:11:01
ど素人におすすめの参考書を教えてください。

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

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

524:380
07/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:デフォルトの名無しさん
07/10/29 13:31:08
>>524=380
「えらい時間」とあるけど、どれくらい掛かるの?
試しに>524相当のロジックを書いて10万と1行のファイルで動かしてみたが、1秒も掛からないんだが。

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

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

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

529:デフォルトの名無しさん
07/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
07/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
07/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:デフォルトの名無しさん
07/10/29 15:05:00
>>529
STL使っておけ

vector< string > x;

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

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

533:デフォルトの名無しさん
07/10/29 15:09:27
>scanf("%s", &op);

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

534:デフォルトの名無しさん
07/10/29 15:11:49
>>532
突っ込みどころだらけ。

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

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

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

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

536:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/29 15:30:17
>>536
"%c"を" %c"にして味噌。

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


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

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

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

542:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/29 19:59:39
丸投げはスレ違い

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

545:デフォルトの名無しさん
07/10/29 20:47:48
インクルードひとつも使わないやつ書いてやるぜ

546:デフォルトの名無しさん
07/10/29 20:51:06
面倒になったので一部日本語で説明する

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


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

最後に出力

547:デフォルトの名無しさん
07/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:プリンがー
07/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
07/10/29 22:17:53
>>548
あってるよ〜

550:プリンがー
07/10/29 22:22:29
>>549
ありがとうございます。


551:デフォルトの名無しさん
07/10/29 22:22:40
あってねぇーよ

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

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

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

553:aho
07/10/29 22:25:39
>>550
ばれたか。
やるな、おぬし!

554:プリンがー
07/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:デフォルトの名無しさん
07/10/29 23:02:21
memcpy(input,output,size<<1);

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

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

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

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

557:デフォルトの名無しさん
07/10/29 23:04:33
>>554
回したら、ものすごい数の改行が出た。

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

559:プリンがー
07/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:デフォルトの名無しさん
07/10/29 23:09:29
×putchar('\n');
○printf("%d ", i);

561:プリンがー
07/10/29 23:12:32
>>560
ありがとうございます。


562:デフォルトの名無しさん
07/10/29 23:13:39
あってませんよ

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

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

564:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/29 23:25:46
>>564
printf("%c%c%c",0x61,0x82,0xA0);

568:デフォルトの名無しさん
07/10/29 23:26:00
>>563
memcpyのsize<<1はバイトで
for文のsize<<1はint型(4バイト?)分になるんじゃないかな?
試してないから間違ってるかもしれないけど

569:デフォルトの名無しさん
07/10/29 23:31:11
>>566 >>568
なるほど。。。と違いはわかったのですが
memcpyだとinputからoutputに何がコピーされているのか混乱してきました。

sizeはint型でinput分の要素数を表しています。
0 1 2 3 4 5 6 7 の要素が入っていて

それを計算したものをoutputに出力させているのです
for文の方をmemcpyと同じように働かせるにはどうしたらよいのでしょうか

570:デフォルトの名無しさん
07/10/29 23:31:45
>>380
入力に何を与えたら何が出力されるのか書いてくれれば考えてみる
>>524 >>526 を読んだが訳分からんかった

検索のキーとなるのは64バイトの内最初の固定 n バイトだけ?(>>524 だと n=16)
1行64バイトって改行文字を含まずに64バイト?
読み込むファイルは検索途中で書き換えられる?

571:デフォルトの名無しさん
07/10/29 23:36:06
>>569
要素数を表してるのになんでビットシフトしてるの?

572:デフォルトの名無しさん
07/10/29 23:39:32
フーリエ変換かなんか 2^n 要素数のアルゴリズムじゃね?

573:デフォルトの名無しさん
07/10/29 23:40:24
>>565>>567
どちらもできましたありがとうございます。


574:デフォルトの名無しさん
07/10/29 23:40:48
>>571
階差数列や漸加式をイメージしてもらいたいのですが
長さの半分の式を移していくという処理をやっています。

なんか頭が熱持ってきました。。。

575:デフォルトの名無しさん
07/10/29 23:41:57
>>572
そうです、2^nの式です。。。わかるものなのですね



576:デフォルトの名無しさん
07/10/29 23:44:48
ソースが全部貼り付けられてるわけじゃないからあくまで推測だが、
sizeが正しく使われてるか確認した方がいいと思う。

577:デフォルトの名無しさん
07/10/29 23:48:59
>>576
for(i=0; i < length<<1 ; i++)
input[i] = output[i];

…こうやったら、望む値が出てきました。。。。なぜ。。。。。
計算させるところを勘違いしていたのか、わけがわからなくなってきました。。。。


578:デフォルトの名無しさん
07/10/29 23:50:41
>>569
なんかよく分からんが例として

int a[10],b[10],size=10,i;
//何らかの代入処理
memcpy(b,a,size * sizeof(int));
//↑は↓と等価
for(i=0; i < size; i++)
b[i] = [i];

こんなふうにする
あと今気付いたが、memcpyの第一引数と第二引数が反対になってるよ
第二引数がコピー元で、第一引数がコピー先
代入文と同じ順序ね

579:デフォルトの名無しさん
07/10/29 23:55:00
>>578
ありがとうございます。ちょっと頭冷やして、ソースと頂いたレスを理解します。

ほんとなんかすみません

580:デフォルトの名無しさん
07/10/30 03:23:33
C言語初心者で、教えて欲しいのですが
sin^2(x)
(サインの二乗(x))
はどのようにプログラムに書けば良いのでしょうか?

581:デフォルトの名無しさん
07/10/30 03:34:41
>>580
sin(x)の2乗ということですよね

#include <math.h>

sin(x)*sin(x) /* sin(x)の2畳 */

sin関数を2階呼ぶのが面倒なら
double y;
y = sin(x);
y*y

582:581
07/10/30 03:36:22
pow関数を使うという手もありますが
2乗なら掛け算で十分

583:580
07/10/30 03:41:03
>>581
こんなにも遅い時間にありがとうございます。
プログラミングもですが、数学もやり直してきます

584:デフォルトの名無しさん
07/10/30 03:46:08
2倍角の公式の方が速い

585:デフォルトの名無しさん
07/10/30 03:51:51
exp( ix ) = cos(x) + i sin(x) だから2乗して実部を比較すると

cos(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 が求める値である

586:580
07/10/30 04:01:36
>>585
さらなる補足をありがとうございます。数学の教科書見て勉強してます


587:デフォルトの名無しさん
07/10/30 12:19:41
>>585
>>581 より計算量増えてね?

588:デフォルトの名無しさん
07/10/30 12:48:58
>>587
そもそも移項で間違ってる

589:デフォルトの名無しさん
07/10/30 12:55:03
sin^2(x) == (1-cos(2x))/2だな

>>587
・関数呼び出しが一回でいい(cf.sin(x)*sin(x))
・一時的な代入がいらない(cf.y=sin(x);y=y*y;)
ってことでこの方法が一番いいかと

590:デフォルトの名無しさん
07/10/30 12:58:06
計算増えるっていっても2倍と1/2と足し算だからもとのよりはいいんじゃね?

591:デフォルトの名無しさん
07/10/30 13:26:48
おまえら、数値計算の勉強をやり直せ。
1 - cos(2x) なんて、 x = 0 の近辺で桁落ちして使い物にならないぞ。

double t = sin(x);
double s2x = t * t;
しか、ありえない。


592:デフォルトの名無しさん
07/10/30 13:34:29
桁落ちw

593:デフォルトの名無しさん
07/10/30 15:50:05
->
これはどういう意味があるのでしょうか

594:デフォルトの名無しさん
07/10/30 15:54:29
やじるし

595:デフォルトの名無しさん
07/10/30 15:55:08
アロー演算子
構造体のポインタからメンバにアクセスするときはドット演算子ではなくこれを使う

596:デフォルトの名無しさん
07/10/30 15:57:52
struct point {
int x, y;
};
struct point p;
struct point *pp = &p;
があったとき、

(*pp).x = 1;
pp->x = 1;

が同じxに代入をしている。
構造体へのポインタを使う上での簡略化。

597:デフォルトの名無しさん
07/10/30 16:00:59
>>595>>596
ありがとうございました

598:デフォルトの名無しさん
07/10/30 17:29:44
使ってる教科書に載ってないのか?

599:デフォルトの名無しさん
07/10/30 19:46:39
検索エンジンを作ろうとおもう。
まずEUC-JPに統一する。
旧字体は新字体、カタカナはひらがなにする。
ひらがなと、新字体以外は登録しない。
出現可能な文字に0から順に番号をつけて、N-germ (2-germ) で登録していく
あと、ハッシュを使う為に全角2文字分を圧縮して20数ビットを使う

NKF32.DLL
URLリンク(www.vector.co.jp)

旧字体→新字体
URLリンク(www.ritsumei.ac.jp)
URLリンク(yasuda.homeip.net)
URLリンク(www.toyama-cmt.ac.jp)
URLリンク(www.asahi-net.or.jp)
URLリンク(homepage3.nifty.com)
URLリンク(homepage3.nifty.com)

600:デフォルトの名無しさん
07/10/30 19:56:23
連載:検索エンジンを作る|gihyo.jp
URLリンク(gihyo.jp)

Googleの技術は凄いと思ったがMooterっていうサイトがGoogleを上回る検索力らしい
Mooter
URLリンク(www.mooter.co.jp)
辞書不要の形態素解析エンジン「マリモ」とは
URLリンク(www.atmarkit.co.jp)
形態素解析について
URLリンク(www.gengokk.co.jp)
URLリンク(mecab.sourceforge.net)
Google の秘密 - PageRank 徹底解説
URLリンク(www.kusastro.kyoto-u.ac.jp)
PageRankの基本概念
URLリンク(tnt.math.metro-u.ac.jp)

601:デフォルトの名無しさん
07/10/30 19:58:27
>>599
ガンバレ
そしてこのスレに来るな

602:デフォルトの名無しさん
07/10/30 22:36:04
「関数へのポインタ」は何に使うの?必要(あると便利)な状況がよくわからない。

603:デフォルトの名無しさん
07/10/30 22:39:42
qsort関数がもろに関数ポインタ使用してるじゃないか

604:デフォルトの名無しさん
07/10/30 22:39:56
qsort

605:デフォルトの名無しさん
07/10/30 22:41:46
ある関数を呼ぶときに、呼ばれた関数内部で使う関数を外から指定するときに使います。
このばあい、関数へのポインターを引数で渡します。

例)
コールバック関数
リストに要素をつなげるときに大小比較関数


606:デフォルトの名無しさん
07/10/30 22:44:33
qsort関数もそうですね

void qsort(void *base, size_t num, size_t size,
int (*compare)(const void*, const void*))

この、int (*compare)(const void*, const void*)が関数ポインターで
この場合はソートの並びを呼び出し側で制御できるようにしている。


607:デフォルトの名無しさん
07/10/30 22:56:19
うーむ、わかったようでわからない。
複数の機能(=関数の数)を内包する関数で、引数の指定によって機能を使い分ける場合ってことかな?
でもそれって単なる文字列でも振り分け可能な気がするなぁ…やっぱりわからん。

608:デフォルトの名無しさん
07/10/30 22:59:49
たとえばqsortの場合、qsortの作者が想定してない型のソートもできる

単に引数で文字列を渡すだけじゃ、qsortの作者が想定している型やソート方法しか対応できない


609:デフォルトの名無しさん
07/10/30 23:03:25
>>607
ためしに qsort を使ってみろ
数値のソート、文字列のソート、自前構造体のソート・・・
そしたらわかる

610:デフォルトの名無しさん
07/10/30 23:04:51
ソート機能を提供するけど、その時必要となる比較の機能は自分で作ってね ってこと
一人で作業する分にはあまり使う必要無いと思う

611:デフォルトの名無しさん
07/10/30 23:35:24
比較関数はプログラマ側が用意できるので、昇順や降順、どの値を比較対象とするか等を任意に作れる。
そしてどんな比較関数でも同じ手続きで利用するために、関数へのポインタを使っている。

…で合ってる?

612:デフォルトの名無しさん
07/10/30 23:37:46
ポインター自体を完全に把握してないんじゃないかね?
あれ覚えるのやっかいだし

613:デフォルトの名無しさん
07/10/30 23:38:33
ソート関数とかわかりずらい STLつかっとけ

614:デフォルトの名無しさん
07/10/30 23:50:45
ポインタはそんなに分かりづらいとは思わなかったなぁ。
いっぺん練習で、全ての変数をポインタとmallocでコーディングしたらイヤでも理解出来るよ。

615:デフォルトの名無しさん
07/10/31 00:00:58
EUC-JPコードをファイルから読み込んだとき、char やstringでは何コードで記録されるんですか?
指定できますか?

616:デフォルトの名無しさん
07/10/31 00:29:42
OSは何を使ってるとか、コンパイラは何とかそういう情報も書いておこうぜ

617:プリンがー
07/10/31 00:47:58
データa1,a2---,a10及びb1,b2,----b10を読み、積和
S=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);
}

これであってますか??

618:デフォルトの名無しさん
07/10/31 00:49:34
>>617
・Sの初期化がされていない。
・a[i]*b[i];

619:デフォルトの名無しさん
07/10/31 00:49:35
>>617
>S+=a[i]b[i]
とりあえずコレが間違ってる
*と;が足りない

620:プリンがー
07/10/31 01:07:16
>>618>>619
S=0
S+=a[i]*b[i];
ですね。
ありがとです。


621:デフォルトの名無しさん
07/10/31 01:12:26
>>620
セミコロン(;)忘れるなよ

622:プリンがー
07/10/31 01:31:53
うるせーバーカ

623:デフォルトの名無しさん
07/10/31 02:04:27
かなり初心者です。
unsigned char afo_1,afo_2,afo_3,...afo_n;
とafo_1からafo_nまで宣言したい時はどうしたら良いですか?

624:デフォルトの名無しさん
07/10/31 02:09:22
>>623
配列じゃダメなの?n=10なら
unsigned char afo[10];

配列の各要素へのアクセスは添字を指定する。
afo[0] = 'a';
afo[1] = 'b';

afo[9] = 'j';

625:デフォルトの名無しさん
07/10/31 02:09:30
>>623
全部書くしかない。
配列でいいなら配列使え。

626:623
07/10/31 02:15:12
>>624,>>625
nが決まった値では無いので、今の路線は無理ですねー。。
配列で頑張ってみます。夜遅いのにすみません。素早い対応ありがとうございます。

627:627
07/10/31 04:16:28
明日提出のレポートのプログラムなのですが
どうしても実行後うまくいきません
簡単なプログラムで
入力された文字を”#”で表すというものですが
指摘お願いします

URLリンク(upsurusuru.hp.infoseek.co.jp)
にアップしましたので怪しいむと思いますが
助けてくださいお願いします
07/10/31(Wed),04:10:07
この時刻にアップしました
拡張子を.cに変更してください
だれかおねがいします

628:デフォルトの名無しさん
07/10/31 04:30:05
>>627
うちの環境だとコンパイルできないから確認してないけど、
isalphaとisdigitが逆なんでねーの?

629:Pもかっこわりぃなぁ
07/10/31 10:42:33
>>627
どうでもいいけど、ABCDEFGHIしKLMNOPQRSTUVWXYZになっている。

630:デフォルトの名無しさん
07/10/31 13:33:38
printfとprintf_Pの違いを教えてください

631:デフォルトの名無しさん
07/10/31 13:43:36
printfで数字を表示するときも”123”のように”を使いますか?


632:デフォルトの名無しさん
07/10/31 14:07:34
数値と数字の違いが分からんのか

633:デフォルトの名無しさん
07/10/31 14:20:54
>>631
5点

634:デフォルトの名無しさん
07/10/31 14:58:30
キーが押されたら何かアクションを起こすってするにはどうすればいい?

例)
enterを押すと計算をするみたいに
enterキーが押されたっていう結果をどうやって取り込むか教えてください

635:デフォルトの名無しさん
07/10/31 15:09:11
>>631
いいえ
”ではなく"を使いましょう

636:デフォルトの名無しさん
07/10/31 15:21:24
>>634
getchar()でもしておいたら?

637:デフォルトの名無しさん
07/10/31 15:28:13
>>634
環境による。つかキーボードドライバの仕様による。

638:デフォルトの名無しさん
07/10/31 16:35:44
>>634
コンソールで?
ウィンドウで?

639:デフォルトの名無しさん
07/10/31 16:41:08
ウインドウだってコンソールの一種だろ。


640:デフォルトの名無しさん
07/10/31 17:22:57
>>639
>>639
>>639

641:プリンがー
07/10/31 17:45:50
>>622
俺の猫かぶりすんなや!

642:デフォルトの名無しさん
07/10/31 23:16:08
OSかかないと困るんだなって今日始めてしった
MS-DOSで実行した場合int型って2バイトづつのメモリじゃん?
でもXP上で実行したらint型だと4バイトづつになって超悩んでた結果、
16ビットマシンと32ビットマシンって事って始めて知ったよ・・・

643:デフォルトの名無しさん
07/10/31 23:23:53
System.arraycopy(コピー元,コピー開始位置,転送先,転送開始位置,要素数)
のJAVAの関数を

memcpy(コピー先,コピー元,, n バイト分)
に置き換えたいのですが

要素数をnバイト分であらわすか、
nバイト分を要素数に変えるにはどうすればいいか教えてください

sizeof(nバイト分)ではダメでした

644:デフォルトの名無しさん
07/10/31 23:24:58
>>643
sizeof(要素)*要素数

645:デフォルトの名無しさん
07/10/31 23:27:05
>sizeof(nバイト分)
その発想は無かったわ

646:デフォルトの名無しさん
07/10/31 23:38:59
>>644
できました!!!!!!!!!!!!!!!!!!!11
すいませんが、何をやっているのか教えていただけませんか?

>>645
バカですいません

647:デフォルトの名無しさん
07/10/31 23:50:11
>>646
sizeof(要素)で1つあたりのバイト数が出る
要素数をかけ算すればn バイト分が求まる。
かけ算は小学校三年生だっけ?

648:デフォルトの名無しさん
07/10/31 23:55:23
理解できました。

memcpyではあくまでバイトを扱うのであって
要素数分のバイトを3つ目に入れないとダメなわけですね。。。ありがとうございました

649:デフォルトの名無しさん
07/11/01 01:53:40
ここのスレのひとはgdbの
使い方完全に理解してるのかな?

関数の中の関数とかどうやって見るの?

650:デフォルトの名無しさん
07/11/01 02:03:28
>>640
コンソールって何のことだと思ってんの?

651:デフォルトの名無しさん
07/11/01 07:16:51
unsigned int **pi, i, j;

if ((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] のアドレスが一緒になっちゃうんだけど、なんで?

652:650
07/11/01 07:26:15
>>651
自己解決しました。バカだなオレ…orz

653:デフォルトの名無しさん
07/11/01 07:37:41
>>650
ウィンドウって何のことなの?

654:デフォルトの名無しさん
07/11/01 12:06:05
構造体配列を宣言するとき二次元配列として宣言できますか?

typedef struct bridge{
int a;
int b;
int c;
}DATA;

DATA m[5][5];

こんな感じです。

655:デフォルトの名無しさん
07/11/01 12:09:01
>>654 全然おk

656:デフォルトの名無しさん
07/11/01 12:10:10
>>655
すばやいレスありがとうございます。

657:デフォルトの名無しさん
07/11/01 13:21:06
先ほどの654のものですが宣言で以下のようにしましたがうまくいきません。
typedef 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}
};
構造体を二次元配列で宣言する場合はどのようにすればよいのでしょうか。
アドバイスお願いします。

658:デフォルトの名無しさん
07/11/01 13:32:45
>>657
DATA m[5][5] = {
{{-1, 0, 0}, ...},
...
};

659:デフォルトの名無しさん
07/11/01 13:40:09
>>658
本当に申し訳ありません。
単純なミスでしたorz
ありがとうございます。

660:デフォルトの名無しさん
07/11/01 14:29:42
>>639
CUI || GUI ?

661:デフォルトの名無しさん
07/11/01 14:57:27
int型の数値をchar型の文字列配列に入れたいんですけどできますか?

662:デフォルトの名無しさん
07/11/01 15:05:21
>>661
char ci[100];
int i = 2007;
sprintf(ci, "%d", i);

663:デフォルトの名無しさん
07/11/01 15:09:29
そういう意味だったのか
さすがエスパー

664:デフォルトの名無しさん
07/11/01 15:12:44
>>662
ありがとうございます!

665:デフォルトの名無しさん
07/11/01 16:18:05
>>660
URLリンク(www.excite.co.jp)

666:デフォルトの名無しさん
07/11/01 16:20:06
>>660
こっちのほうが解りやすいかな。
URLリンク(www.excite.co.jp)

667:デフォルトの名無しさん
07/11/01 16:25:24
>>665
え?
>>634
のプログラムの話なんだけどなんなの?

668:デフォルトの名無しさん
07/11/01 20:52:53
ポインタ意味わかんねええええええええええええええええ
*pだとしたら
p = &a ってアドレスのみ格納?
でこの場合
*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。
これでいいのかい!?
でポインタのポインタとかイミフ!

669:デフォルトの名無しさん
07/11/01 21:04:02
>>668
>*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。
>これでいいのかい!?
まあ大体はおk

>でポインタのポインタとかイミフ!
単純に上のaがポインタだと考えればいいんだよ

670:デフォルトの名無しさん
07/11/01 21:33:12
>>669
ソノハッソウハナカッタワ
すげー単純にわかった。thx

671:デフォルトの名無しさん
07/11/01 22:42:44
while(count < 20)
{
  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が返ってくる。
なんでなんだぜ?
二次元目って変数指定できないの?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5164日前に更新/251 KB
担当:undef