C言語なら俺に聞け(入門篇) Part 26
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/03/22(土) 23:36:40・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 25
http://pc11.2ch.net/test/read.cgi/tech/1203343907/
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 104代目
http://pc11.2ch.net/test/read.cgi/tech/1202135539/
0232デフォルトの名無しさん
2008/04/07(月) 23:36:160233231
2008/04/07(月) 23:37:500234デフォルトの名無しさん
2008/04/07(月) 23:38:22の全部の例を書いてみてくれ
0235230
2008/04/07(月) 23:49:03a[0]=3 b[0]=0
a[1]=4 b[1]=1
a[2]=0 b[2]=2
a[3]=2 b[3]=3
a[4]=1 b[4]=4
を
a[0]=3→b[3]=3
a[1]=4→b[4]=4
a[2]=0→b[0]=0
a[3]=2→b[2]=2
a[4]=1→b[1]=1
に同じ番号のところに転送するにはどうするかという意味です
0236デフォルトの名無しさん
2008/04/07(月) 23:49:15やっぱり言っている意味がわからん。
>例でいうとaの0番目にある3をbの3に入れるということです
b[3] = a[0];
ということだよね?と考えると、一瞬 >>231 (不等号を逆にして)でいい気がするが、
a[3] はどうするの?
0237デフォルトの名無しさん
2008/04/07(月) 23:51:26結局は
b[i]=i;
になるんじゃないの?
0238デフォルトの名無しさん
2008/04/07(月) 23:52:35「転送する」の意味がわからん。
b[0]〜b[4]には元々値が入ってるんでしょ?
並びを
b[3]=3
b[4]=4
b[0]=0
b[2]=2
b[1]=1
としたって、配列の中身は
b[0]=0
b[1]=1
b[2]=2
b[3]=3
b[4]=4
と変わらないよ?
0239230
2008/04/08(火) 00:01:45aの0にある数字3をbの同じ3番目に当てはめる?
にはどうするかってことです。
同じくaの1にある数字4をbの4に当てはめるってことです
あの聞いといてなんですけど意味不だったらスルーしてください
0240デフォルトの名無しさん
2008/04/08(火) 00:09:331回自分で全部代入してみてbの中身全部表示してみると分かると思うけど
b[0] = 0 b[1] = 1 b[2] = 2... となるだけ
0241デフォルトの名無しさん
2008/04/08(火) 00:10:35暗号化がしたいのかな?
0242デフォルトの名無しさん
2008/04/08(火) 00:15:32結局>>231や>>237でいいような気がするが。
あと>>235が「配列bの添字の順番を換えたい」と言っているように思えるので、
一応、それは無理だと言っておく。
そもそも添字というのは「i番目」というような順番を示すものなので、
変更は不可能だ。
わかってるってんだったら、失礼。
0243デフォルトの名無しさん
2008/04/08(火) 00:33:18とあったものを、
a[0] = 1, b[1] = A
a[1] = 2, b[2] = B
a[2] = 0, b[0] = C
== b[0] = C, b[1] = A, b[2] = B
にしたいってことかしらん?
aの中身をbの添字にした時、正しい文字が現れるようにしたい、みたいな。
0244デフォルトの名無しさん
2008/04/08(火) 09:38:29代入は上書きコピーのこと。転送とまちがえてはいけない。
0245デフォルトの名無しさん
2008/04/08(火) 12:33:58何が目的なのかも書き込んだほうがいいんじゃない?
あんたのコード例から目的が推察できないのでみんな
首ひねってるんだと思うよ。
0246デフォルトの名無しさん
2008/04/08(火) 16:51:01int main(void)
{
int n1, n2;
int per;
puts("二つの整数を入力してください。");
printf("整数 A:"); scanf("%d",&n1);
printf("整数 B:"); scanf("%d",&n2);
per = n1 / n2 * 100;
printf("Aの値はBの%d%%です。\n",per);
return (0);
}
実行結果を
2つの整数を入力してください。
整数A:50
整数B:100
Aの値はBの50%です。
と、したいのですが↑のプログラムじゃ動いてくれません;;
「Aの値はB の0%です。」
となってしまいます;;
何故でしょうか?
0247デフォルトの名無しさん
2008/04/08(火) 16:52:090248デフォルトの名無しさん
2008/04/08(火) 17:05:410*100 = 0
0249デフォルトの名無しさん
2008/04/08(火) 18:38:07整数型の計算は、コンピュータでは1より小さい結果になると
答えがゼロになるんだよ。なぜかといわれても、そういうもの
だと思ってくれ。
回避する方法は色々あるが、とりあえず
per = n1 * 100 / n2;
にしたらいい。理由は自分で考えてね。
0250デフォルトの名無しさん
2008/04/08(火) 19:45:39char *buf = FileRead(file_path);
↓
Kaiseki(buf);
free(buf);
または
Kaiseki(file_path);
にするか悩んでいます。
FileRead関数内で動的にメモリを確保して
確保した領域をKaiseki関数に渡し解析するか、
Kaiseki関数内にファイルへのパスを渡して
読み込み、解析をKaiseki関数内で行うか、
どちらが良いと思われますか?
0251デフォルトの名無しさん
2008/04/08(火) 20:13:45マジレスすると場合によるからどっちともいえない
0252デフォルトの名無しさん
2008/04/08(火) 20:21:43どのような場合があるのですか?
0253デフォルトの名無しさん
2008/04/08(火) 20:42:23順列の総数を求めるプログラムを教えてください
考えすぎて頭が痛くナリマスタ
よろしくオナガイシマス
0254デフォルトの名無しさん
2008/04/08(火) 21:09:060255デフォルトの名無しさん
2008/04/08(火) 21:12:34オーバーフローとか一切考えなければ
5!を3!で割るだけじゃんww
なにが分からないの?w
0256デフォルトの名無しさん
2008/04/08(火) 22:20:03ほらよ。
#include <stdio.h>
#include <math.h>
double npm(int n, int m) {return tgamma(n + 1) / tgamma(n - m + 1);}
int main(int argc, char ** argv)
{
printf("%g\n", npm(5, 3));
return 0;
}
0259デフォルトの名無しさん
2008/04/08(火) 22:32:530260デフォルトの名無しさん
2008/04/08(火) 22:34:25おいw
0261デフォルトの名無しさん
2008/04/08(火) 22:48:020262デフォルトの名無しさん
2008/04/08(火) 23:08:45そのままコンパイルすると
error C3861: 'tgamma': 識別子が見つかりませんでした
なのですが?
0263デフォルトの名無しさん
2008/04/08(火) 23:50:070264デフォルトの名無しさん
2008/04/09(水) 19:31:35一旦階乗求めるよりh(ry
0265デフォルトの名無しさん
2008/04/09(水) 21:23:090266デフォルトの名無しさん
2008/04/09(水) 21:26:20#include <stdio.h>
#include <stdlib.h>
int gcd(int a, int b){
int c;
while((c=a%b)) a=b, b=c;
return b;
}
int mPn(int m, int n){
int t, u=1, l=1;
if(m<1 || n<1 || m<n) return 0;
if(m-n<n) n=m-n;
for(;n>0;n--,m--){
l*=n;
t=gcd(u, l);
l/=t;u/=t;
t=gcd(m, l);
l/=t;u*=m/t;
// printf("m=%d n=%d [%d / %d]\n", m, n, u, l);
}
return u/l;
}
int main(int argc, char *argv[]){
int m, n;
if(argc!=3) return 1;
m=atoi(argv[1]);
n=atoi(argv[2]);
printf("%dP%d=%d\n", m, n, mPn(m, n));
return 0;
}
0267デフォルトの名無しさん
2008/04/09(水) 21:42:27#include <studio.h>
int main(void)
{
printf("hello, world\n");
return 0;
}
エラーE2209 sample.c 2: インクルードファイル 'studio.h'をオープンできない
警告 W8065 sample.c 6: プロトタイプ宣言のない関数 'printf'の呼び出し(関数 main)
*** 1 errors in Compile ***
と、何度試行を繰り返してもなります;
このエラーをどう訂正していいのかわからない超初心者です。
設定などもチャート通り何度もやり直しましたが、上手くいきません。
よろしくお願いします。
0268デフォルトの名無しさん
2008/04/09(水) 21:47:430269デフォルトの名無しさん
2008/04/09(水) 21:48:540270デフォルトの名無しさん
2008/04/09(水) 21:48:550271デフォルトの名無しさん
2008/04/09(水) 21:49:170272デフォルトの名無しさん
2008/04/09(水) 22:03:37DWORD gdw2;
gdw1 = timeGetTime();
//処理
gdw2 = (timeGetTime()-gdw1);
printf("%d",gdw1);
としても毎回計測するごとに処理時間が増えているのですが、
何故なのでしょうか?
0273デフォルトの名無しさん
2008/04/09(水) 22:07:55purintfにgdw2を渡すべきなんじゃない?
0274デフォルトの名無しさん
2008/04/09(水) 22:08:490275デフォルトの名無しさん
2008/04/09(水) 22:20:14現在、下記のような感じでプログラムを作ってるのですが、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6212.txt
2つ問題があり、
�@入力していくと次の配列まで入力されてしまう。
�A2つ目のエラー仕様をどこでどう記述していいのか。
初歩的なことで、無駄な文が多いかもしれませんがよろしくお願いします。
また、こうすればもっと判りやすくできるなどあったら教えて欲しいです;
0276デフォルトの名無しさん
2008/04/09(水) 22:54:48「次の配列」が何を指しているのか判りませんが、一文字ずつ入力してチェックするのは標準入力では無理があるかと。
普通に1行入力してから、解析する方がたぶんましです。
0277デフォルトの名無しさん
2008/04/09(水) 22:55:24....
break;
}
}
if((cnt <= 0) && ((c == '-') || (c == '\n'))) {
printf("エラーメッセージ");
exit(1);
}
if(x == 1){
.....
0278デフォルトの名無しさん
2008/04/09(水) 23:10:17>また、こうすればもっと判りやすくできるなどあったら教えて欲しいです;
うまく関数化しよう。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int absolute(int n1, int n2) { return n1>n2 ? n1-n2 : n2-n1; }
void check(const char* s)
{
int i;
for(i=0; s[i]; i++) {
if( !isdigit(s[i]) && s[i]!='-' ) { puts("不正な文字"); exit(EXIT_FAILURE); }
}
if(!s[0] || strcmp(s, "-")==0) { puts("数値ではない"); exit(EXIT_FAILURE); }
}
int input(void)
{
char str[100];
scanf("%99s", str); check(str); str[ str[0]=='-' ? 9 : 8 ] = 0; return atoi(str);
}
int main(void)
{
int a, b;
printf("数値a="); a=input();
printf("数値b="); b=input();
printf("%dと%dの差の絶対値は%d\n", a, b, absolute(a,b));
return 0;
}
0279デフォルトの名無しさん
2008/04/09(水) 23:41:13char str[100], *pstr=str;
int value, index=0, sign=1;
if(scanf("%99s", pstr)!=1){
puts("入力エラー");
return 0;
}
if(sscanf(pstr, "%d%n", &value, &index)>=1 && pstr[index]=='\0'){
if(*pstr=='-') sign=-1,pstr++;
sscanf(pstr, "%8d", &value);
if(p) *p=sign*value;
return 1;
}
printf("不正な文字 %s\n", &pstr[index]);
return 0;
}
0280275
2008/04/09(水) 23:49:48a[0],a[1]でa[0]の入力をすると、a[0]の上限をこえたとき(cnt以上)に、
そのままa[1]の中身まで入力されてしまうってことですね;
>>277様
break;のとこもexit(1);にし、int exit(int);を入れてみたところ、
そこはかとなく�Aの部分はできました。ありがとうございますー。
0281281
2008/04/10(木) 14:58:40ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6215.txt
よろしくお願いします。
0282デフォルトの名無しさん
2008/04/10(木) 15:01:380283デフォルトの名無しさん
2008/04/10(木) 15:13:06課題の言葉の意味もわかってなさそうだ
0284デフォルトの名無しさん
2008/04/10(木) 16:17:51社会に出れば、問題を解決する方法論を持っていればそれが能力と
みなされる。
たとえその方法論が丸無げであってもな。
0285デフォルトの名無しさん
2008/04/10(木) 16:29:120286デフォルトの名無しさん
2008/04/10(木) 16:30:45C言語ならおk
0287デフォルトの名無しさん
2008/04/10(木) 18:57:280288デフォルトの名無しさん
2008/04/10(木) 19:36:170289デフォルトの名無しさん
2008/04/10(木) 23:47:00それはアセンブラでもきびしいだろw
0290デフォルトの名無しさん
2008/04/10(木) 23:54:530291デフォルトの名無しさん
2008/04/11(金) 11:43:11別のファイルに出力するプログラムです
ソース
http://arhp.hp.infoseek.co.jp/omoji.txt
出力されたモノ
http://arhp.hp.infoseek.co.jp/h_omoji.txt
見ての通り日本語が化けてしまいます
どうすれば正しく表示されるでしょうか?
もっと簡単に出来るやり方があればそれも教えて欲しいです
ちなみに
if(ch == komoji[a]) {
fputc(omoji[a],outfp);
のkomojiとomojiを入れ替えて大文字→小文字のモノを作ろうとしましたが
さらに日本語がおかしくなりました
まだ入門書を半分も読んでいない初心者が思いつきでやったので
色々突っ込みどころはあるかと思いますがよろしくお願いします
0292デフォルトの名無しさん
2008/04/11(金) 12:45:21漢字コードでググルのだ。
0293デフォルトの名無しさん
2008/04/11(金) 13:07:06当方で確認した環境は WindowsXP, 使用した処理系は cygwin(gcc 3.4.4) です。
以下のプログラムで問題が発生するかどうか、確認してみてください。
問題が発生しなければ、これが解決方法です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6217.txt
古いし、問題もあるようですが、参考にした書籍をあげておきます。
応用C言語, 三田 典玄, アスキー 1988, ISBN4-7561-0056-2
第3章
0294デフォルトの名無しさん
2008/04/11(金) 13:13:56突っ込みどころ満載だな。
・komoji, omojiは配列にする必要がない。const char * komoji = "abcde...z"でいい。
・bについては、要素数を固定値で持つな。ましてそれを変数に代入するな。
・forの条件もおかしい。このまま直すならa < bではなくa <= bだが、そもそもここはkomoji[a] != '\0'にすべきだ。
・strcpy(), strcat()を並べて使うくらいならsprintf()でも使え。この場合、sprintf(newfilename, "h_%s", filename)でいい。
・fgetc()の戻り値をcharで受けてはいけない。fgetc()の仕様を確認すればわかるが、intで受けるべきだ。
・cも要らない。小文字と判断したときにfputc()するのではなく、その場はchを書き換えておくだけでいい。
・>292も書いているが、Windowsで普通に扱う文字コードでは漢字コードの一部が英小文字に一致してしまう。
真面目に対処すると意外に面倒だから、他の問題を全てクリアしてから改めて挑戦しろ。
0295デフォルトの名無しさん
2008/04/11(金) 13:17:08その本はゴミだ。いや、作者がゴミそのものだ。
>>291
>293を見て気付いた点をもう一つ追加。
・小文字と判断したら、forからは脱出しておけ。
・gets()は使うな。fgets(filename, sizeof(filename), stdin)にしておけばいい。
0296293
2008/04/11(金) 13:29:55まあまあ、せっかくソースをさらして質問している(質問作法としては最上です。)のだから、
まずい点をことさらに列挙するのはどうでしょうか。
それはそうと、
fgets() の第一引数はファイル名ではなくて、バッファなんですけど。
> その本はゴミだ。いや、作者がゴミそのものだ。
netnews の時代からいろいろいわれていたようですけど、
具体的にどこが悪いんでしょうか。おしえていただけるとうれしいです。
0297デフォルトの名無しさん
2008/04/11(金) 13:36:34漢字というか多バイトコードが何なのかによって変わっちゃうから
0298291
2008/04/11(金) 13:36:57今からお二人のアドバイスを参考にやってみます!
0299デフォルトの名無しさん
2008/04/11(金) 13:37:550300295
2008/04/11(金) 13:39:07もうかなり前だから何を以ってゴミと判断したかは忘れたが、
当時本人にも直接メールして本の不備を詳細に指摘したことがある。
言い訳だけが返ってきた。
それはそうと。
>fgets() の第一引数はファイル名ではなくて、バッファなんですけど。
もとのソースを見たか?
> gets(filename);
これ以上必要もない恥の上塗りはやめておけ。
>まずい点をことさらに列挙するのはどうでしょうか。
真摯に聞く態度を示す質問者だからこそ、列挙した。
つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
0301291
2008/04/11(金) 13:41:58やっぱり初心者がやるにはちょっと面倒なモノだったようですね
皆さんの言ってることがある程度理解出来たら自己満足したいと思いますw
0303293
2008/04/11(金) 13:47:03そうですね。gets() はまずいですね。
提示されたプログラムでは、128 文字以上入力されるとおかしくなってしまいます。
> 真摯に聞く態度を示す質問者だからこそ、列挙した。
> つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
たしかに。
0304デフォルトの名無しさん
2008/04/11(金) 13:49:090305295
2008/04/11(金) 14:03:04入門の域を超えるから自分で調べてくれ。
と、それでは不親切なので、Asciiと共存できる文字コードを簡単に。
# つーか詳しくないので間違っていたら失敬。
・シフトJIS、SJIS、CP932、MS漢字など
Windowを中心に広く使われる。基本的に漢字などは2バイトで表現できるが、
2バイト目のコードがAscii文字の領域に重なるために何かと厄介。
特に、大文字小文字変換やディレクトリの区切り(\)のためにバグが出た商品も多々ある。
・(狭義の)EUC、EUC-JP
一部のUnixなどで使われる。狭義のEUCでは基本的に漢字は2バイトだが、
(所謂)半角カナも2バイトになってしまう罠。広義のEUCはEUC-KRなどの日本以外のものも含む。
・UTF-8、(狭義の)Unicode
最近のLinuxやMac(これも実はUnix系)などで一句使われる。基本的に漢字などは3バイトになる。
厳密に解釈しだすと切りがないので省略。UTF-8以外のUnicodeとは表現方法が随分異なる。
・ISO-2022-JP、(狭義の)JIS
メールなど、7ビット通信環境でも使えることを前提とした環境で使われる。
漢字などはasciiと同じような範囲を使うので単純にチェックすることは不可能。
asciiとの境界にEsc符号列を用いることで状態を切り替えるので、手間さえ掛ければ勿論チェック可能。
但し、改行前後でAsciiに戻さないといけないなど制約が多いので、内部コードとして使うことはお勧めできない。
0306293
2008/04/11(金) 14:08:01補足。
>>293 ではシフトJIS(MS漢字コード)の古い時代のものを仮定しています。
>>293 で作成・検証に使用したコンパイラは、まさにシフトJIS には対応していない
ので、提示されたプログラムにある日本語メッセージは、なくなく削除しました。
0307デフォルトの名無しさん
2008/04/11(金) 14:18:05cygwinなら、gccのオプションに--input-charset=cp932 --exec-charset=cp932を書くといいかも。
応用で、EUCで書かれたソースをcygwin用にコンパイルすることもできますぜ。
0308デフォルトの名無しさん
2008/04/11(金) 16:45:27感謝です。gnu の libiconv/iconv_open() の指定方法でいけばいいんですね。
またひとつ賢くなりました。
0309デフォルトの名無しさん
2008/04/11(金) 20:16:02Aどころか女と付き合ったこともないお前が言うと笑えるw
0310デフォルトの名無しさん
2008/04/11(金) 20:34:220311デフォルトの名無しさん
2008/04/11(金) 21:18:17C#ってなに?
0312デフォルトの名無しさん
2008/04/11(金) 21:20:080313デフォルトの名無しさん
2008/04/11(金) 22:40:220314デフォルトの名無しさん
2008/04/11(金) 22:40:400315デフォルトの名無しさん
2008/04/11(金) 22:45:33プログラムを記述するのに使う言語も色々ある。
その1つがC#。もちろんCも1つの言語だ。
0316デフォルトの名無しさん
2008/04/12(土) 00:00:10まぁC#とか触ったこともないけどなw
0317デフォルトの名無しさん
2008/04/12(土) 00:28:350318デフォルトの名無しさん
2008/04/12(土) 01:04:350319デフォルトの名無しさん
2008/04/12(土) 12:44:080320デフォルトの名無しさん
2008/04/12(土) 12:52:04実装されている、出来ることを知ることの方が重要。
あとは、用意されているライブラリをきちっと使えれば、どの言語だろうと関係ねぇ
限定した言語でしか通用しないような奴は、どこへ行っても使い物にならない。
とりあえず、コンピュータの仕組みを知ることが出来たんで、大学に通っておいて正解だったぜ。
0321デフォルトの名無しさん
2008/04/12(土) 14:10:500322デフォルトの名無しさん
2008/04/12(土) 14:15:56それをチャット上などで動作させることはできないのですか?
コマンドプロンプトの中でしか出力できないのですが
0323デフォルトの名無しさん
2008/04/12(土) 14:17:00そう。
0324デフォルトの名無しさん
2008/04/12(土) 14:34:24チャット上に文字出力するプログラム作ればいいじゃん
0325デフォルトの名無しさん
2008/04/12(土) 14:36:31出力先をコマンドプロンプトじゃなくて、チャット上にするやり方が分からない
本にもそういうの載ってないんだが
すべてが独学だから聞く人もいないし・・
0326デフォルトの名無しさん
2008/04/12(土) 14:38:40そのチャットソフトが外部プログラムを呼び出すようにできていれば、可能かもしれない。
# まぁ無理だ。
0327デフォルトの名無しさん
2008/04/12(土) 14:40:46そうなんですか?teacupチャットだけど
ホットコーヒーのやつでは出来てたような。。。
とりあえず外部プログラムを呼び出すようにできてるかも分からないので、もちと勉強してきます!
ありがとうございました!
0328デフォルトの名無しさん
2008/04/12(土) 21:26:46または2チャンネルのスレッドでそういうスレがあったらきぼん。
0329デフォルトの名無しさん
2008/04/12(土) 21:27:35大学へGO!
やっぱり基礎が大事だから
0330デフォルトの名無しさん
2008/04/13(日) 07:30:38そして極め付けが、君が日ごろ見ている文字、絵、動画、音声、それらはすべて
ある法則に則って記録された数値データ、その数値データを人間で言う動物細胞
物質の原子レベルまで追求して話をすると、0と1の組み合わせ、すなわちバイナリーデータとは
0と1、あるかないか、磁石で言う+と-、電気信号でそれらを管理、制御しているのさ。
ほら、いつもニヤニヤしながら見ているエロ画像、それがだんだん・・・ただの色の集まり、
その色は0と1の組み合わせで構成されているデータに見えてきただろ?
PCに色や文字、音声が人間が解釈できる形で表現できる機能が実装されているから
その0と1の無機質なデータがエロ画像に見えるのさ。グロだろうと。
0331デフォルトの名無しさん
2008/04/13(日) 09:52:55という話と同等のどうでもいい話
■ このスレッドは過去ログ倉庫に格納されています