2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

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

前スレ
C言語なら俺に聞け(入門篇) Part 4
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/

関連スレ
C/C++の宿題を片付けます 80代目
http://pc8.2ch.net/test/read.cgi/tech/1166969820/
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/l50
【初心者歓迎】C/C++室 Ver.33【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1164376287/l50

2 :デフォルトの名無しさん:2006/12/29(金) 02:07:40
あー、前スレ誘導リンクはPart 5だが、タイトルがPart 4になったままだorz

3 :デフォルトの名無しさん:2006/12/29(金) 02:33:27
前スレの組合せのヤツ
kaijoがs<0だと0しか帰ってこないのはおいといても、関数ncmもおかしいな
kaijoを使うんなら
int ncm(int n, int m){
return kaijo(n)/kaijo(m)/kaijo(n-m);
}
こうだろ。
書き方見る限り再帰で呼び出したいように見えるんだけど。
int ncm(int n, int m){
return (n==m || m==0) ? 1 : ncm(n-1,m-1) + ncm(n-1, m);
}

ついでに宿題スレにあった別パターンの再帰
int ncm(int n, int m){
return m==0 ? 1 : ncm(n, m-1) * (n-m+1) / m;
}


4 :デフォルトの名無しさん:2006/12/29(金) 04:03:33
俺としては間違って、n < m と入力してしまった時には
きちんとエラーを吐き出すようにして欲しいものだな。

5 :デフォルトの名無しさん:2006/12/29(金) 09:30:40
>>1

6 :ぼるじょあ ◆yBEncckFOU :2006/12/29(金) 12:54:15
 _, ,_
(・3・) エェー 重複だYOp

ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc8.2ch.net/test/read.cgi/tech/1165718021/

7 :デフォルトの名無しさん:2006/12/29(金) 13:07:45
今更何を言うか

8 :デフォルトの名無しさん:2006/12/29(金) 13:38:01
>>6
宿題片付けるのと初心者の質問を答えてやるのでは趣旨が違うだろ?

9 :デフォルトの名無しさん:2006/12/29(金) 13:58:28
D:\clang\bintori2>bcc32 bintori2.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
bintori2.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_janken' が未解決(D:\CLANG\BINTORI2\BINTORI2.OBJ が参照)

以前は問題なくコンパイル出来たのですがこんなエラーが出てコンパイル出来ません。
どこがおかしいのでしょうか?
一応ソースとobjファイルとtdsファイルです。
http://eggrice.no.land.to/up/src/tohoh0090.zip

10 :デフォルトの名無しさん:2006/12/29(金) 14:10:56
何かテジャブな気がする…
今月の頭か先月見たような…
そのjankenとやらを

11 :デフォルトの名無しさん:2006/12/29(金) 14:12:11
>>9
つ bcc32 bintori2.c janken.c

ソースの中身までは見てないので、ちゃんと動くかどうかは知らん。

12 :デフォルトの名無しさん:2006/12/29(金) 14:16:02
アッー
久しぶりだったのですっかり忘れてました(;´д`)
>>11
ありがとうございました。

>>10
参考書のソース改変しただけなので・・・

13 :デフォルトの名無しさん:2006/12/29(金) 14:19:38
>アッー
どう発音するんだ?

14 :デフォルトの名無しさん:2006/12/29(金) 14:32:39
レス、声に出して読んでるの

15 :デフォルトの名無しさん:2006/12/29(金) 14:39:26
あついち

16 :デフォルトの名無しさん:2006/12/29(金) 14:40:17
struct hoge
{
int i,j,k;
hoge(){}
hoge(int _i, int _j, int _k){
i = _i;j = _j;k = _k;
}
};

void func()
{
int a,b,c;
hoge* ph = 0;
〜略
for(〜){
ph[〜] = hoge(a,b,c);
}
}

上のようなプログラムを見たのですが、
構造体をnewもせずに突然hoge(a,b,c)とか書いていいのですか?
特にエラーも出ずにコンパイルできました。
これはどういうことでしょうか?

17 :デフォルトの名無しさん:2006/12/29(金) 14:45:20
>>16
引数付きのコンストラクタを呼び出して 一時オブジェクトを作っている。

が、ここは 「C」スレ。 上記のやっていることは「C++」の範疇であり C では文法違反。

18 :デフォルトの名無しさん:2006/12/29(金) 15:33:23
さまざまな整数が入った配列があるんですが
そのなかで一番多く入ってる整数が何か知るというようなものを
書きたいのですがどうすれば?
一番多いというのは、たとえば13という整数が10個、9が5個入ってたら
13を取り出したいという意味です

19 :デフォルトの名無しさん:2006/12/29(金) 15:35:03
>>17
C++の話しですか。すいませんでした。
一時オブジェクトというんですね。
ありがとうございました。

20 :デフォルトの名無しさん:2006/12/29(金) 15:49:03
int i;
int ary1[NUM]={0};
int ary2[NUM]={0};

while(i=0;ary[i];i++){
  if(ary1[i]==target){
    ary2[i]++;
    break;
  }
}
if(ary2[i]==0){
  ary1[i]=target;
  ary2[i]++;
}

/*あとなんか総当りで比較*/


>>18
こんな感じじゃね?
ソートしてから比較したほうがよさそうな気がしてきたが、こういう方法もあるということで

21 :デフォルトの名無しさん:2006/12/29(金) 15:54:25
typedef struct numcnt_tag
{
int num, cnt;
struct numcnt_tag *next ,prev*;
}numcnt;

こういうのあったよね。
これでどうだ

22 :デフォルトの名無しさん:2006/12/29(金) 15:54:52
>>19
C, C++ 両方をコンパイルできる環境だと、どっちでコンパイルされているかを意識する必要があるよ。
コンパイルできたからといって Cに適合しているとは限らないから。

# >>16 で 「new もせずに」と書いているけど、C には new 演算子無いw

23 :デフォルトの名無しさん:2006/12/29(金) 15:55:28
>>18
やり方はいろいろあると思うけど、とりあえず一例。

元の配列と同じサイズの領域を確保し、内容をコピー。
コピーした配列のほうをソート。
(元の配列の内容を更新可能なら、コピーせずそれを使ってよい。
ソートについてはqsort関数を使うか、ぐぐる。)

ソート済み配列を先頭から見ると、同じ数値は連続して固まって並んでいる。
最初に現れた数値がa, その個数をNaとすると、
 val=a, num=Na
つぎに表れた数値bの個数を数え、それがNbとする。
Nb>numなら val=b, num=Nb
これを配列の最後まで繰り返す。
最終的にvalが求める値。

24 :デフォルトの名無しさん:2006/12/29(金) 16:03:17
>>23
ビットマップの輝度のような(たかだか 0〜255) 整数でかつ値のとりえる範囲が極めて小さいときは
個数カウンタを値域分用意する って手段もありだね

25 :デフォルトの名無しさん:2006/12/29(金) 16:38:14
>>前948さん
有難うございます。
 マイナスが付いてたのが意味が分からなくて困ってました。。
(左詰ってことなんですね。。

26 :デフォルトの名無しさん:2006/12/29(金) 16:47:30
なんか上に似てる質問でてる。。
配列の中身の数がもっとも大きい配列番号をしるには
どうすればいいですか?

27 :デフォルトの名無しさん:2006/12/29(金) 16:48:38
>>26
もっと具体的に。
単に最大値が欲しいのなら、単純なループで探すかソートして端を採るか。

28 :デフォルトの名無しさん:2006/12/29(金) 16:55:19
>>27
単純なループより高速にソート完了できるアルゴリズムなんてあるか?
非難したり馬鹿にしたりしてるわけじゃなくて、興味本位なんだが

29 :26:2006/12/29(金) 16:57:41
array[0]→2,array[1]→13,array[0]→5だとしたら
中身の一番大きいarray[1]の配列番号1がほしいいんですが

30 :27:2006/12/29(金) 17:06:30
>>28
処理速度の問題ではなく、コーディング量の問題。
例えば最大値とその次も欲しいなんてことになったらどのみちソートする羽目になるしね。

31 :デフォルトの名無しさん:2006/12/29(金) 18:43:05
"プログラミング作法"という Kernighan & Pike の本を買ったのですが、
その中の問題の答えがわからないのです。どなたかベストな方法を教えてください。

P.44 問題1-10
「潜在的な間違いを最小限に食い止めるには、次の定義をどのように書き直したらいいだろうか」

#define FT2METER 0.3048
#define METER2FT 3.28084
#define MI2FT 5280.0
#define MI2KM 1.609344
#define SQMI2SQKM 2.589988


整数型のマクロは enum にしたほうがよい、との記述がありました。
問題の主旨は、どうにかしてマクロを避けなさい、ということだと思うのですが。

32 :デフォルトの名無しさん:2006/12/29(金) 19:06:02
助けてください
結構凄いことなってる。助言とかお願いします
http://ex17.2ch.net/test/read.cgi/news4vip/1167379476/



問題の物
ダウンロードパス vip
http://www.uploda.org/uporg635455.rar.html

33 :デフォルトの名無しさん:2006/12/29(金) 19:09:40
>>31
一箇所だけ書くとこんな感じ
#define FT2METER (0.3048)
#define METER2FT (1/FT2METER)

34 :デフォルトの名無しさん:2006/12/29(金) 19:32:33
>>31
#define FT2METER (0.3048)
#define MI2FT (5280.0)

#define METER2FT (1/FT2METER)
#define MI2KM (MI2FT*FT2METER/1000)
#define SQMI2SQKM (MI2KM*MI2KM)

35 :33=34:2006/12/29(金) 19:44:05
違った orz
この場合はこっちのほうが正解
#define METER2FT (3.28084)
#define MI2FT (5280.0)

#define FT2METER (1.0/METER2FT)
#define MI2KM (MI2FT*FT2METER/1000.0)
#define SQMI2SQKM (MI2KM*MI2KM)

36 :デフォルトの名無しさん:2006/12/29(金) 20:02:25
しつこい

37 :35:2006/12/29(金) 20:07:59
自分でも答えられる数少ない質問だったから、うれしくてついやってしもた。スマソ

38 :デフォルトの名無しさん:2006/12/29(金) 20:32:01
>>30
なるほどさんくす
視野が狭かったよ

39 :デフォルトの名無しさん:2006/12/30(土) 01:26:50
英文の書いたファイルを読み取って、英文に使われているアルファベットを
それぞれ何回使われたか集計するプログラムを作りたいです。
txtファイルの入出力はできてるんですが
アルファベットの数を分けるプログラムはどうすればいいですか?

ちなみに問題文は

fgets で文字列にデータを一行づつ読み込み, 文字列中の文字を一文字づつ
調べて出現回数を配列に記録することにより数えよ.
例えば, 配列を int count[26] とすると, 'a' の個数を count[0] で,
'b' の個数を count[1] で, …, 'z' の個数を count[25] で数えるようにすればよい.

とのこと

40 :デフォルトの名無しさん:2006/12/30(土) 01:42:21 ?2BP(202)
>>39
>例えば, 配列を int count[26] とすると, 'a' の個数を count[0] で,

まれに見るクソ問題だ。学校名と担当教官を晒したら教えてやる。

41 :デフォルトの名無しさん:2006/12/30(土) 01:44:37
ASCII前提。書き捨てだから必要なincludeとかは適当に。

main() {
 int count[26], i;
 char buf[128], c;
 for (i = 0; i < 26; i++) {
  count[i] = 0;
 }
 while(fgets(buf, sizeof(buf), STDIN)) {
  for (i = 0; c = buf[i]; i++) {
   if (isalpha(c)) {
    count[tolower(c) - 'a']++;
   }
  }
 }
 for (i = 0; i < 26; i++) {
  printf("%c: %d", i + 'a', count[i]);
 }
 return 0;
}

13 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)