08/05/19 21:06:56
言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 27
スレリンク(tech板)
過去スレ
URLリンク(makimo.to:8000)
教えて欲しいのではなく宿題を丸投げしたいならこちらへ
C/C++の宿題を片付けます 107代目
スレリンク(tech板)
2:未定義の名無しさん
08/05/19 21:07:23
Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板)
Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)
Part 12 スレリンク(tech板)
Part 13 スレリンク(tech板)
Part 14 スレリンク(tech板)
3:未定義の名無しさん
08/05/19 21:07:45
Part 15 スレリンク(tech板)
Part 16 スレリンク(tech板)
Part 17 スレリンク(tech板)
Part 18 スレリンク(tech板)
Part 19 スレリンク(tech板)
Part 20 スレリンク(tech板)
Part 21 スレリンク(tech板)
Part 22 スレリンク(tech板)
Part 23 スレリンク(tech板)
Part 24 スレリンク(tech板)
Part 25 スレリンク(tech板)
Part 26 スレリンク(tech板)
Part 27 スレリンク(tech板)
4:デフォルトの名無しさん
08/05/19 21:43:15
0~Nの間の数値の内、3の倍数と3のつく数字の時だけ”アホ”と表示したいのですが
「3のつく数字の時」
を高速に判定するにはどうするのがベストですか
5:デフォルトの名無しさん
08/05/19 22:12:08
>>4
全部の数字に対してアホと表示することをどうして考えないのでしょうか?
仕様レベルから見直して下さい。
6:デフォルトの名無しさん
08/05/19 22:12:44
>>4
事前に「N以下で3のつく数字」のテーブルを作っておき、
対象の数字がそのテーブルにあるかチェックする。
7:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/19 22:29:02
>>4
> 「3のつく数字の時」
> を高速に判定するにはどうするのがベストですか
sprintf関数で文字列にして、strchr関数で'3'を見つける。
9:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/19 23:42:50
パスワードのプログラムでキーボードから入力された文字数が9文字以上ならやり直し
8文字以下なら同意済みのpass{9}にコピーであらかじめ設置済みのパスワードと比較して
一致ならok、不一致ならやり直しってプログラム作りたいんだけど作れない
誰か親切な方教えてください
11:デフォルトの名無しさん
08/05/19 23:47:58
宿題なら宿題スレへ。
そうじゃないなら、どこがどうわからないのかをもっと具体的に。
12:デフォルトの名無しさん
08/05/19 23:48:05
>>4
高速にということになれば絶対的な解は存在しない。
常に処理系依存であり、実測によって確認する必要がある。
一般的な考え方は、コンピュータ上での整数は2進数であり、
10進数としての見かけを扱うなら10進数(の規則)に変換する必要があるということである
(たとえばsprintfと%d指定子を使って文字列を作り出すことによって。
ただし、文字列にすることは常にバッファの確保の問題を内包しているし、
sprintfのような強力な関数を呼ぶことは多くの場面で大きなコストとなることは覚えておくこと)。
単に10進数の各桁の数字を順に取り出したいなら、%演算子で10の剰余(最小の桁の数字)を得た後で
/=演算子で1/10にすることを繰り返す昔ながらのアルゴリズムが最も汎用的な解で、ほとんどの処理系で十分に高速である。
しかし、いずれにせよ後で標準出力等に数字を文字列にして出力しようとしているなら、
あらかじめsprintfで文字列を作って(恐らくはポインタを操作して)1文字ずつ解析したほうが速い可能性は高い。
13:デフォルトの名無しさん
08/05/20 00:05:37
>>10
まず、以下の単語の意味を適切な日本語で説明すること。
・同意済みの
・pass{9}
・設置済みの
14:デフォルトの名無しさん
08/05/20 01:15:45
>>10
> 入力された文字数が9文字以上ならやり直し
これ不要だと思うが?
15:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/20 01:57:38
>>14
同意 あからさまに不必要情報
18:16
08/05/20 02:05:56
ゴメソ
バグってた.
各自で直してくれ
19:16
08/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:デフォルトの名無しさん
08/05/20 03:55:12
ヘッダファイルが沢山インクルードされているソースだといちいち使われている変数の型をヘッダファイルに確認しなきゃいけないんですがそれが煩わしいです
なにかソースを読むときのコツとか心構えがあれば教えてください
21:デフォルトの名無しさん
08/05/20 04:03:38
URLリンク(www.kouno.jp)
22:デフォルトの名無しさん
08/05/20 04:42:32
このサイトのどこを読めばいいんでしょう?
23:デフォルトの名無しさん
08/05/20 04:46:24
>>22
最初から読めよ
24:デフォルトの名無しさん
08/05/20 06:23:41
コードリーディングって言うんですね、VBのデバッグツールは変数の内容をポップアップで表示できますがそれと似た感じで、ソースコードにある変数名からその型や構造体の詳細を表示できるリーディングツールとかがあるんでしょうか?
っていうかもう朝だw
25:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/20 08:15:22
fgetsの入力バッファ(stdin)をクリアはどうすれば良い?
言語:C
OS:Win
コンパイラ:Borland bcc55
27:デフォルトの名無しさん
08/05/20 08:36:49
>>26
空読み。
28:デフォルトの名無しさん
08/05/20 08:47:29
rewind(stdin)
29:デフォルトの名無しさん
08/05/20 09:12:59
>>28
それって動作未定義じゃなかったっけ?
30:デフォルトの名無しさん
08/05/20 09:14:38
>>20
まっとうなライブラリなら提供する変数やシンボルについて詳細な説明を文書にしてあるはずである。
標準ライブラリの規格や、開発環境が独自に用意したものなら付属のマニュアルを読むこと。
もし不親切なライブラリや出所の怪しいライブラリを使うはめになったら、まずは開発環境のコード支援機能を活用すること。
どうしてもヘッダファイルの中身を直接読まなければならないなら、grepツールを使うことが多くの場合で助けになる。
一方で、変数の型は必ずしも確認する必要があるわけではない。
特にtypedefや#defineによってわざわざ元の型を隠そうとしている場合には、むしろ元の型が何であるか考えないことが、
ライブラリ作成者が意図した使い方のはずである(もちろん、これもタコなライブラリに関しては当てはまらない)。
31:デフォルトの名無しさん
08/05/20 09:37:20
>>27
㌧クス
解決しますた
32:デフォルトの名無しさん
08/05/20 10:05:26
>19
正しいアルゴリズムを書けないのに
自分は頭がいいんだと勘違いして
他人を嘲ることほど恥ずかしいことはない
33:デフォルトの名無しさん
08/05/20 10:21:55
4==16
としか思えないのだが...
34:デフォルトの名無しさん
08/05/20 10:28:32
正しいアルゴリズムを書けて頭も良く人を嘲ることがでいる>>32
さんに>>19のコードのどこを修正したら正しく動作するか
やってもらいましょうw
35:デフォルトの名無しさん
08/05/20 10:39:30
他の板なら 4=16 と書かれるであろうところを
ちゃんと 4==16 と書くところにこの板の格調の高さを感じる
36:デフォルトの名無しさん
08/05/20 10:47:04
もしかして>>4=>>16ってことか?
4と16の比較でもしてるのかと思った
37:デフォルトの名無しさん
08/05/20 10:59:51
>>32
頭が悪いからこそ普段からバカにされてるストレスの発散として他人を嘲る
でも、頭が悪いから嘲ろうとしても逆にバカにされ余計ストレスをためる
の悪循環にはまってるから何言ってもムダだよ
38:デフォルトの名無しさん
08/05/20 11:09:11
>>34
不可能である。
>19は3の倍数と3のつく数字の数を数えようとしている(それすら間違っているが)。
対して、>4が要求しているのは、任意のある数字に3がつくかどうかを効率よく知る方法である。
アルゴリズムの修正とは手段を訂正することであって目的を訂正することではない。
目的を訂正するならそれはアルゴリズムの完全な書き直しである。
39:デフォルトの名無しさん
08/05/20 11:51:38
>>38
貴方はなぜそんなにムキになってるんですか?w
40:デフォルトの名無しさん
08/05/20 12:07:36
おまえら・・・一体ナニヤツ?