[表示 : 全て 最新50 1-99 2chのread.cgiへ]
Update time : 05/10 01:23 / Filesize : 14 KB / Number-of Response : 41
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



1 名前:未定義の名無しさん mailto:sage [2008/05/19(月) 21:06:56 ]
言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 27
pc11.2ch.net/test/read.cgi/tech/1209429897/
過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

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

2 名前:未定義の名無しさん mailto:sage [2008/05/19(月) 21:07:23 ]
Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/

3 名前:未定義の名無しさん mailto:sage [2008/05/19(月) 21:07:45 ]
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/
Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/
Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/
Part 25 ttp://pc11.2ch.net/test/read.cgi/tech/1203343907/
Part 26 ttp://pc11.2ch.net/test/read.cgi/tech/1206196600/
Part 27 ttp://pc11.2ch.net/test/read.cgi/tech/1209429897/

4 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 21:43:15 ]
0〜Nの間の数値の内、3の倍数と3のつく数字の時だけ”アホ”と表示したいのですが

「3のつく数字の時」
を高速に判定するにはどうするのがベストですか

5 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:12:08 ]
>>4
全部の数字に対してアホと表示することをどうして考えないのでしょうか?
仕様レベルから見直して下さい。

6 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:12:44 ]
>>4
事前に「N以下で3のつく数字」のテーブルを作っておき、
対象の数字がそのテーブルにあるかチェックする。

7 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:27:08 ]
>>4
#include <stdio.h>

main(){
int n;
printf( ">>" );
scanf( "%d", &n );
while( n%10!=3 && n>10 ){ n/=10; }
if( n%10==3 ){
printf("3のつく数字です。");
}
}


8 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:29:02 ]
>>4
> 「3のつく数字の時」
> を高速に判定するにはどうするのがベストですか
sprintf関数で文字列にして、strchr関数で'3'を見つける。

9 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:30:53 ]
>>4
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
int BuffSize(int n)
{
int num = n;
int size=0;
while(num){ num /= 10; size++; };
return ++size;
}
int main()
{
int i,n,nabeatu=0;
char *nstr;
printf("%dまでの数値を入力\n",INT_MAX);
scanf("%d",&n);
nstr = malloc(sizeof(char)*(BuffSize(n)));
for(i = 1; i < n; i++){
sprintf(nstr,"%d",i);
if(i % 3 == 0 || strchr(nstr,'3')){
printf("%s%c\n",nstr,'!');
nabeatu++;
}else
printf("%s\n",nstr);
}
printf("ナベアツ数%d回\n",nabeatu);
free(nstr);
return 0;
}

10 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 23:42:50 ]
パスワードのプログラムでキーボードから入力された文字数が9文字以上ならやり直し
8文字以下なら同意済みのpass{9}にコピーであらかじめ設置済みのパスワードと比較して
一致ならok、不一致ならやり直しってプログラム作りたいんだけど作れない

誰か親切な方教えてください



11 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 23:47:58 ]
宿題なら宿題スレへ。
そうじゃないなら、どこがどうわからないのかをもっと具体的に。

12 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 23:48:05 ]
>>4
高速にということになれば絶対的な解は存在しない。
常に処理系依存であり、実測によって確認する必要がある。

一般的な考え方は、コンピュータ上での整数は2進数であり、
10進数としての見かけを扱うなら10進数(の規則)に変換する必要があるということである
(たとえばsprintfと%d指定子を使って文字列を作り出すことによって。
ただし、文字列にすることは常にバッファの確保の問題を内包しているし、
sprintfのような強力な関数を呼ぶことは多くの場面で大きなコストとなることは覚えておくこと)。

単に10進数の各桁の数字を順に取り出したいなら、%演算子で10の剰余(最小の桁の数字)を得た後で
/=演算子で1/10にすることを繰り返す昔ながらのアルゴリズムが最も汎用的な解で、ほとんどの処理系で十分に高速である。
しかし、いずれにせよ後で標準出力等に数字を文字列にして出力しようとしているなら、
あらかじめsprintfで文字列を作って(恐らくはポインタを操作して)1文字ずつ解析したほうが速い可能性は高い。

13 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 00:05:37 ]
>>10
まず、以下の単語の意味を適切な日本語で説明すること。
・同意済みの
・pass{9}
・設置済みの


14 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:15:45 ]
>>10
> 入力された文字数が9文字以上ならやり直し
これ不要だと思うが?


15 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:19:44 ]
>>10
#include <stdio.h>
#include <string.h>
int comp(char copy[],char pass[])
{ return strcmp(copy,pass); }
int main()
{
char buff[100] = {'\0'};
char copy[9] = {'\0'};
char pass[] = "password";
char *temp;
int len,i,r;
while(1){
do{
puts("passを8文字以下で入力");
fgets(buff,sizeof(buff),stdin);
if(temp = strrchr(buff,'\n'))
*temp = '\0';
if(9 <= strlen(buff))
puts("9文字以上になってます。");
}while(9 <= strlen(buff));
for(i = 0; buff[i]; i++)
copy[i] = buff[i];
copy[i] = '\0';
r = comp(copy, pass);
if(r==0){ puts("認証成功"); break;
}else if(r != 0){ puts("認証失敗"); }
}
return 0;
}

16 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:57:06 ]
>>4
#include <stdio.h>
#define N 10000
int main(int argc,char **argv){
int i,ii,j,k,times=0;
for(i=1;i<=N;i++){
if(i % 3==0){times++;continue;}
ii=i;j=1;
while(j*10<=ii)j*=10;
do{
if(ii/j==3){times+=j;break;}
else{ii-=(ii/j)*j;j/=10;}
}while(j>=1);
}
for(i=1;i<=times;i++)
printf(
(i%61==0)
?"やってみたお前が一番阿呆¥n"
:(i%47==0)
?"なんとやらの一つ覚えのなんとやらテーブル参照¥n"
:(i%19==0)
?"あほんだらの下からスキャン¥n"
:"こんな問題だした>>4はアホ¥n");
}

17 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:57:38 ]
>>14
同意 あからさまに不必要情報

18 名前:16 mailto:sage [2008/05/20(火) 02:05:56 ]
ゴメソ
バグってた.
各自で直してくれ


19 名前:16 mailto:sage [2008/05/20(火) 02:26:44 ]
受けた仕事は最後迄というセオリーに沿って修正したの貼っとく
#include <stdio.h>
#define N 10000
int main(int argc,char **argv){
int i=1,ii,j,k,times=N/3;
while(i<=N){
if(i % 3==0){i++;continue;}
ii=i;j=1;
while(j*10<=ii)j*=10;
do{
if(ii/j==3){times+=j-1;i+=j;break;
}else{ii-=(ii/j)*j;j/=10;}
}while(j>=1);
i++;
}
for(i=1;i<=times;i++)
printf(
(i%61==0)
?"やってみたお前が一番阿呆¥n"
:(i%47==0)
?"なんとやらの一つ覚えのなんとやらテーブル参照¥n"
:(i%19==0)
?"あほんだらの下からスキャン¥n"
:"こんな問題だした>>4はアホ¥n");
}

20 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 03:55:12 ]
ヘッダファイルが沢山インクルードされているソースだといちいち使われている変数の型をヘッダファイルに確認しなきゃいけないんですがそれが煩わしいです
なにかソースを読むときのコツとか心構えがあれば教えてください




21 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 04:03:38 ]
ttp://www.kouno.jp/home/c_faq/c_faq.html#contents

22 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 04:42:32 ]
このサイトのどこを読めばいいんでしょう?

23 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 04:46:24 ]
>>22
最初から読めよ

24 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 06:23:41 ]
コードリーディングって言うんですね、VBのデバッグツールは変数の内容をポップアップで表示できますがそれと似た感じで、ソースコードにある変数名からその型や構造体の詳細を表示できるリーディングツールとかがあるんでしょうか?

っていうかもう朝だw

25 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 07:51:51 ]
>>10
#include <stdio.h>
#include <string.h>
#define TRUE 1
int main( void );
char pass[] = "hogehoge";
int main(){
char s[100];
while( TRUE ){
printf( "pass>>" );
scanf( "%s", s );
if( strcmp( s, pass )==0){ break; }
}
return 0;
}

26 名前:デフォルトの名無しさん [2008/05/20(火) 08:15:22 ]
fgetsの入力バッファ(stdin)をクリアはどうすれば良い?

言語:C
OS:Win
コンパイラ:Borland bcc55


27 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 08:36:49 ]
>>26
空読み。

28 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 08:47:29 ]
rewind(stdin)

29 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 09:12:59 ]
>>28
それって動作未定義じゃなかったっけ?

30 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 09:14:38 ]
>>20
まっとうなライブラリなら提供する変数やシンボルについて詳細な説明を文書にしてあるはずである。
標準ライブラリの規格や、開発環境が独自に用意したものなら付属のマニュアルを読むこと。

もし不親切なライブラリや出所の怪しいライブラリを使うはめになったら、まずは開発環境のコード支援機能を活用すること。
どうしてもヘッダファイルの中身を直接読まなければならないなら、grepツールを使うことが多くの場合で助けになる。

一方で、変数の型は必ずしも確認する必要があるわけではない。
特にtypedefや#defineによってわざわざ元の型を隠そうとしている場合には、むしろ元の型が何であるか考えないことが、
ライブラリ作成者が意図した使い方のはずである(もちろん、これもタコなライブラリに関しては当てはまらない)。



31 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 09:37:20 ]
>>27
dクス
解決しますた

32 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:05:26 ]
>19
正しいアルゴリズムを書けないのに
自分は頭がいいんだと勘違いして
他人を嘲ることほど恥ずかしいことはない

33 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:21:55 ]
4==16
としか思えないのだが...

34 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:28:32 ]
正しいアルゴリズムを書けて頭も良く人を嘲ることがでいる>>32
さんに>>19のコードのどこを修正したら正しく動作するか
やってもらいましょうw

35 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:39:30 ]
他の板なら 4=16 と書かれるであろうところを
ちゃんと 4==16 と書くところにこの板の格調の高さを感じる

36 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:47:04 ]
もしかして>>4=>>16ってことか?
4と16の比較でもしてるのかと思った

37 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:59:51 ]
>>32
頭が悪いからこそ普段からバカにされてるストレスの発散として他人を嘲る
でも、頭が悪いから嘲ろうとしても逆にバカにされ余計ストレスをためる
の悪循環にはまってるから何言ってもムダだよ

38 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 11:09:11 ]
>>34
不可能である。
>19は3の倍数と3のつく数字の数を数えようとしている(それすら間違っているが)。
対して、>4が要求しているのは、任意のある数字に3がつくかどうかを効率よく知る方法である。
アルゴリズムの修正とは手段を訂正することであって目的を訂正することではない。
目的を訂正するならそれはアルゴリズムの完全な書き直しである。

39 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 11:51:38 ]
>>38
貴方はなぜそんなにムキになってるんですか?w

40 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 12:07:36 ]
おまえら・・・一体ナニヤツ?








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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