☆C/C++☆ちょっと役立つプログラム作らない?
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/07/10(日) 14:46:400002デフォルトの名無しさん
2005/07/10(日) 15:21:53モノにもよるんだが、概ねshとかvbsで何とかならないか?
と俺は思うわけだが。
0003デフォルトの名無しさん
2005/07/10(日) 17:42:55> ちょっと役立つプログラム
ってlintみたいなの?
それとも関数とかライブラリのこと?
00041
2005/07/10(日) 18:56:16例えばC/C++でCGIやるためのライブラリ作るとか、SQLへのアクセスを簡単にする
クラス作るとか。
0005デフォルトの名無しさん
2005/07/10(日) 19:14:25【フリー】こういうソフトを作って下さい リク2
http://pc8.2ch.net/test/read.cgi/tech/1120404369/
C/C++のみでいくということか
00061
2005/07/10(日) 21:01:14まぁホントの最速はアセンブラだけど実用的なのはちょっとつくれないし。
0007デフォルトの名無しさん
2005/07/10(日) 21:05:2500081
2005/07/10(日) 21:15:02ソースによるのでは?
ともかく、何をつくるかだけどCGI用のライブラリはどうでしょう?
0009デフォルトの名無しさん
2005/07/10(日) 21:38:44#include <math.h>
typedef unsigned int uint_t;
/*@function 素数リスト生成)
@param [in] max : max 未満の素数リストを生成。
@param [out] size : 生成された素数の数。不要ならNULLを指定。
@return 素数リスト(uint配列先頭アドレス)。0ターミネイト。異常時NULL。
@note ヒープからメモリを割り当てるので呼び出し側で開放すること。
*/
uint *create_prime_list(const uint max, size_t *size)
{
uint_t *buf = NULL;
if(size != NULL) *size = 0;
if( max == 0 ) return NULL;
if(NULL != ( buf = calloc(1,sizeof(uint_t)*max)))
{
uint_t i,j;
for(i = 2; i < sqrt(max); ++i)
{
if( buf[i] ) continue;
for(j = i+i; j < max; j += i) buf[j] = 1;
}
for(i = 2, j = 0; i < max; ++i)
if( !buf[i] ) buf[j++] = i;
buf[j] = 0;
if((NULL != (buf = realloc(buf, sizeof(uint)*(j+1)))))
if(size != NULL) *size = j;
}
return buf;
}
0010デフォルトの名無しさん
2005/07/11(月) 01:25:21誰かこれを詳しく説明してくれ。
0011デフォルトの名無しさん
2005/07/11(月) 18:19:000012デフォルトの名無しさん
2005/07/11(月) 18:23:50結局みんな自分で作ってるね
ここで作らない?
0013デフォルトの名無しさん
2005/07/11(月) 18:24:3400141
2005/07/11(月) 21:58:34いいですね。
手始めはそんなところで
0015デフォルトの名無しさん
2005/07/12(火) 12:15:100016デフォルトの名無しさん
2005/07/12(火) 16:10:52まず>>1が口火を切って欲しい
00171
2005/07/12(火) 16:17:1100181
2005/07/12(火) 21:55:07#include <stdlib.h>
char **split(char cutter, char* string);
int main(void)
{
char string[256];
char** strings;
int i;
printf("Enter a string including '@':");
scanf("%s",string);
strings = split('@',string);
for(i=0;strings[i] != '\0';i++)
{
printf("%s\n",strings[i]);
}
}
00191
2005/07/12(火) 21:55:53{
int i,j,k,n=0;
char** strings;
for(i=0;string[i] != '\0';i++)
{
if(string[i] == cutter)n++;
}
n+=2;
strings = (char **)malloc( n * sizeof(char *) );
00201
2005/07/12(火) 21:56:22{
if(cutter == string[i] || string[i]=='\0')
{
*(strings + n) = (char *)malloc( (i-j+1) * sizeof(char *) );
for(k = 0; k < i-j; k++)
{
strings[n][k] = string[j+k];
}
strings[n][k+1] = '\0';
j = ++i;
n++;
}
}
*(strings + n + 1) = (char *)malloc(sizeof(char *));
strings[n+1][0] = '\0';
return strings;
}
00211
2005/07/12(火) 21:57:34あと、なんかまずいとことか指摘してほすぃ。
00221
2005/07/12(火) 21:58:560023デフォルトの名無しさん
2005/07/12(火) 22:00:3600241
2005/07/12(火) 22:06:02やる前に言ってくれorz
0025デフォルトの名無しさん
2005/07/12(火) 22:10:25boost使用禁止なんつー所もあるわけだし。
00261
2005/07/12(火) 22:51:06おれがやるかどうかはわからんケド。
0027レイナ
2005/07/12(火) 23:25:4100281
2005/07/13(水) 00:37:54これを応用して正規表現にも挑戦する猛者はいませんか?
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
int isMatch(char* string,char* pattern);
int main(void)
{
char string[256];
char pattern[256];
printf("Enter a string:");
scanf("%s",string);
printf("Enter a pattern:");
scanf("%s",pattern);
if(isMatch(string,pattern))
{
printf("This string includes this pattern.\n");
}
else
{
printf("This string does'nt include this pattern.\n");
}
}
00291
2005/07/13(水) 00:38:18int isMatch(char* string,char* pattern)
{
int i,j,temp;
for(i = 0;string[i] != '\0';i++)
{
if(string[i] == pattern[0])
{
temp = ++i;
for(j = 1;string[temp] == pattern[j];j++,temp++)
{
if(strlen(pattern) - 1 == j)return TRUE;
}
}
}
return FALSE;
}
0030デフォルトの名無しさん
2005/07/13(水) 00:43:020031デフォルトの名無しさん
2005/07/13(水) 00:43:160032デフォルトの名無しさん
2005/07/13(水) 07:26:561ガムバレ。
0033デフォルトの名無しさん
2005/07/13(水) 07:33:150034デフォルトの名無しさん
2005/07/13(水) 07:43:1100351
2005/07/13(水) 09:34:35なんかだんだんやる気が・・・
0036デフォルトの名無しさん
2005/07/13(水) 19:22:1200371
2005/07/13(水) 19:49:140038デフォルトの名無しさん
2005/07/13(水) 19:51:13頑張ったな>>1
0039デフォルトの名無しさん
2005/07/13(水) 20:17:200040デフォルトの名無しさん
2005/07/13(水) 20:26:260041デフォルトの名無しさん
2005/07/13(水) 20:39:20問題はそれなんだよな
汎用性と利便性がないとなると作る根拠が無いし
0042デフォルトの名無しさん
2005/07/13(水) 22:17:00ちょっとしたものではないか。cygwinあるし。
0043デフォルトの名無しさん
2005/07/13(水) 22:49:02次は strtol() とかがちょうどいいかな?
00441
2005/07/13(水) 22:57:04>>18のsplitをperl版に近づけようと奮闘してみたもののうまくいかない。
これはなかなかムズかすぃ
00451
2005/07/13(水) 23:03:56仕様は区切り文字に任意の文字列または文字を指定でき、かつ、複数の区切り
文字列または文字を指定できるsplit関数です。
一応、現在作成中の駄目コード置いときますね。
00461
2005/07/13(水) 23:05:04#include <stdlib.h>
int *isMatch(char* string,char* pattern);
char **split(char *cutter, char* string);
int main(void)
{
char string[256];
char ** strings;
int i;
int *info;
printf("Enter a string including \"cut\":");
scanf("%s",string);
info = isMatch(string,"cut");
for(i=0;i<=info[0]+1;i++)
{
printf("%d\n",info[i]);
}
strings = split("cut",string);
for(i=0;strings[i]!='\0';i++)
printf("%s\n",strings[i]);
}
00471
2005/07/13(水) 23:06:00char **split(char *cutter, char* string)
{
int i,j=0,n=0,len = strlen(cutter);
char** strings;
int *info;
if(len > strlen(string))return NULL;
info = isMatch(string,cutter);
for(i=0;i<=info[0]+1;i++)
{
printf("%d\n",info[i]);
}
strings = (char **)malloc( (info[0]+2) * sizeof(char *) );
00481
2005/07/13(水) 23:06:54{
*(strings + i) = (char *)malloc( (info[i+1]+1) * sizeof(char *) );
for(j=0;j<info[i+1];j++)
{
strings[i][j] = string[n+j];printf("i=%d\ninfo[i+1]=%d\n",i,info[i+1]);
}
strings[i][j] = '\0';
n=j+len;
}
strings[i][0] = '\0';
return strings;
}
00491
2005/07/13(水) 23:07:29//1番目以降にはマッチしたパターンとの間の文字数を格納し、その配列を返す
int *isMatch(char* string,char* pattern)
{
int i,j,k=1,temp,count = 0;
int *info,len = strlen(pattern);
for(i = 0;string[i] != '\0';i++)
{
if(string[i] == pattern[0])
{
temp = ++i;
for(j = 1;string[temp] == pattern[j];j++,temp++)
{
if(len - 1 == j)count++;
}
}
}
00501
2005/07/13(水) 23:10:19info[0] = count;
if(count == 0)return info;
//loop till string[i] will be \0.
for(count = 0, i = 0;string[i] != '\0';i++)
{
if(string[i] == pattern[0])
{
temp = i + 1;
for(j = 1;string[temp] == pattern[j];j++,temp++)
{
if(len - 1 == j)
{
info[k] = i-count;
i = i+len;
count = i;
k++;
if(string[i-1]=='\0')
{
info[k]=0;
return info;
}
}
}
}
}
info[k]=i-count;
return info;
}
0051デフォルトの名無しさん
2005/07/14(木) 12:08:340052デフォルトの名無しさん
2005/07/14(木) 13:03:540053デフォルトの名無しさん
2005/07/14(木) 14:30:060054デフォルトの名無しさん
2005/07/14(木) 20:42:56.r-‐i'''''''''''i''''‐-、
o| o! .o i o !o
.|\__|`‐´`‐/|__/|
|_, ─''''''''''''─ ,、 /
、-' u -、
/ U 0 \
/ / i
| ● ,,. .,, ● |
__ . ! (_人__) ノ
/´ ̄ `!. 丶_ u U ノ
| `にこ匸'_ノ . '-、、,,,,,,_______,,,,,,、、-'
ノ u { _.. -―| :{ ,/ / \
. / l | __ / ̄ ̄`>'´ ノ' ´ {、 \
/ |/ {'´ `ヽ. " ̄\ U `ヽ. __,,.. -‐丶 u ヽ
| / ヾ、.. } u' 〉、 } `ー''´ /´ ̄ `ヽ '" ̄\
! :} )「` ノ、 ノ l\"´_,,ニ=-― <´ ヽ{ ノ( `、 |
l 、_,/j `ー一''" }, ノ , '''''"" \ ヽ ⌒ヾ v |
ヽ _ / } {. { l ┌n‐く ヽ/ ``\ ノ
`¨´ `¨¨¨¨´ ̄`{ 0 `'^┴'ー┘|ヾ }、 u' ` --‐r'′ キングヤッタッス!!
0055デフォルトの名無しさん
2005/07/19(火) 08:40:46だけどテキストエディタやsedやawkでバイナリエディットできるので便利。
// bin2hex
int main(void) {
int c;
// if windows set stream binary mode
while ((c=getchar())!=EOF) printf("%02x\n");
return 0;
}
// hex2bin
int main(void) {
int c;
// if windows set stream binary mode
while (scanf("%x", &c) != EOF) putchar(c);
return 0;
}
0056デフォルトの名無しさん
2005/07/19(火) 09:10:24前者がodではいけない理由は何?
私の場合はpgmのバイナリ⇔アスキー変換使ったりもするけど。
0057デフォルトの名無しさん
2005/07/19(火) 12:32:35odはアドレスの出力がじゃまだし1行1バイトじゃないけど
フィルタ通せばいいことだし。
1行1バイトにしたい理由はsedやawkでアドレス指定が簡単だから。
あと関係ないけどこんな練習問題みたいなプログラムが実用的に機能し
他のコマンドと組み合わせることで強力なツールになる驚きと
自分で書いたプログラムが役に立つ喜び。
0058デフォルトの名無しさん
2005/07/19(火) 14:09:17od -v -t x1 -w1 -An
オプションの意味は、
-v verbose:'*'の抑制
-t type:フォーマット指定
x1 16進で1バイトずつ
c キャラクタダンプ
d 10進
f 浮動小数点数
...
-w1 width:出力カラム数(=バイト数)指定
-An address:アドレス表示の進法指定(d:10進、n:none、...)
或いは、
od -Ax -t cx2d4f8
なんてこともできる。
道具の再生産もいいけど、既にある道具は積極的に利用しようや。
0059デフォルトの名無しさん
2005/07/19(火) 15:35:41ちなみにうちのodには-wがないのでこんなかんじになる。
$cat bin2txt
#!/bin/sh
od -t x1 | awk '{for(i=2;i<=NF;++i)print $(i)}'
0060デフォルトの名無しさん
2005/07/19(火) 22:03:25【仕様諸元】
- 言語:C++(gnu 表記に準じること)
- 行数:30行前後
- 1行1項目のテキスト整数値(マイナスあり)の約6千行のデータをパイプ入力して
プラス(>0)の最大値、最小値、平均値、マイナス(<0)の最大値、最小値、平均値と
絶対値平均、プラスマイナス全ての総合平均、計算対象となった件数を計算し、結果を
標準出力する。数値間は1つのスペース。
- 入力された数値がゼロならば計算対象から省く。
- 総合平均のための変数は浮動小数点で定義してもよい。
- 依頼元:○徳高校
- 対価:氏名或いはハンドル名の公開。
0061デフォルトの名無しさん
2005/07/19(火) 23:19:250062デフォルトの名無しさん
2005/07/20(水) 03:06:53これをいったいなにに使うのかちょー気になる。
>>61 何が十分なのか、意味分かんない。もしかしてawkだとワンライナーなのか?
#include <stdio.h>
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a<b?a:b
int main(void) {
int p_max=0,p_min=0,p_cnt=0; double p_ave=0;
int m_max=0,m_min=0,m_cnt=0; double m_ave=0;
double t_ave=0;
int i;
while (scanf("%d", &i) == 1) {
if (i > 0) {
if (p_cnt == 0) p_min = i;
p_max = MAX(p_max, i); p_min = MIN(p_min, i); ++p_cnt; p_ave += (i - p_ave) / p_cnt;
} else if (i < 0) {
if (m_cnt == 0) m_max = i;
m_max = MAX(m_max, i); m_min = MIN(m_min, i); ++m_cnt; m_ave += (i - m_ave) / m_cnt;
}
if (i != 0) t_ave += (i - t_ave) / (p_cnt + m_cnt);
}
printf("%d %d %.0f %d %d %.0f %.0f %.0f %d\n",p_max,p_min,p_ave,m_max,m_min,m_ave,-m_ave,t_ave,p_cnt+m_cnt);
return 0;
}
006360
2005/07/20(水) 06:20:18>マイナスの絶対値平均ってなに?
絶対値は、プラスとマイナスを対象なのでマイナスだけの処理でないという
ことですた。
>これをいったいなにに使うのかちょー気になる。
防災科研の未公開のデータ(日本中の地下で起きている極微小振動)をグラフ
にするための前処理です。
php のスクリプトと比較して10倍以上速いです。システムのオーバーヘッド
も4分1に低減しました。感謝致します。
URL は置き換え作業後、明らかに致します。
0064デフォルトの名無しさん
2005/07/20(水) 08:40:02006561
2005/07/20(水) 11:22:03>62は仕様も読めないらしいし、余り効率いいとは思えないコードだし。
>63も手放しで誉めずにきちんと仕様を満たしているのか確認しろよ。
あー、ついでに>61に回答しておくと、awkで書いてもワンライナーと言うわけにはいかない。
単にC++であるメリットを感じないだけ。
006661
2005/07/20(水) 12:08:11>C++であるメリットを感じないだけ
C++で書く楽しみを感じないだけ
>60はもう見てないかな。見てるんだったら少なくとも仕様を満たすものを載せるけど。
つーか、phpのスクリプトがあるなら先に提示しろと思うのだが。
006760
2005/07/20(水) 20:25:13#include <stdio.h>
#include <stdlib.h>
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a<b?a:b
int main(void) {
int p_max=0,p_min=0,p_cnt=0; double p_ave=0;
int m_max=0,m_min=0,m_cnt=0; double m_ave=0;
double a_ave=0, t_ave=0;
int i;
while (scanf("%d", &i) == 1) {
if (i > 0) {
if (p_cnt == 0) p_min = i;
p_max = MAX(p_max, i); p_min = MIN(p_min, i); ++p_cnt; p_ave += (i - p_ave) / p_cnt;
} else if (i < 0) {
if (m_cnt == 0) m_max = i;
m_max = MAX(m_max, i); m_min = MIN(m_min, i); ++m_cnt; m_ave += (i - m_ave) / m_cnt;
}
if (i != 0) {
t_ave += (i - t_ave) / (p_cnt + m_cnt);
a_ave += (abs(i) - a_ave) / (p_cnt + m_cnt);
}
}
printf("%d %d %d %d %.0f %0f %.0f %.0f %d\n",p_max,m_max,p_min,m_min,p_ave,m_ave,a_ave,t_ave,p_cnt+m_cnt);
return 0;
}
006860
2005/07/20(水) 20:26:43防災科研の元ページ(地震速報が気象庁よりも速い。約1分後に発表):
ttp://www.hinet.bosai.go.jp/
ここの連続波形データを元から1分値を算出して最終的には下のグラフ用の
データセットにつなげるということでした。
今回の役立ったプログラムの成果物:
ttp://eq.nazarite.jp/hinet.php
0069デフォルトの名無しさん
2005/07/20(水) 21:49:06ループ中で毎回平均値が必要になるなら兎も角、
最後に必要になるならそのロジックは毎回平均値を求めると言う
誤差を累積させてしまう糞コードだ。
おまけに、折角入力値の正負を判断しているのに改めて絶対値を求めたり、
突っ込みどころが満載のゴミの山と化しているな。
#まぁ、官公庁で稼動しているコードがゴミの山なのは先刻承知だが。
0070デフォルトの名無しさん
2005/07/21(木) 01:33:31平均値を蓄積する方法と最後に割算して求める方法を
ランダムな入力で試すと常に同じ結果になりましたがそれでも不満ですか?
あなたが想定するまずいケースはどんな場合ですか?
多少無駄でもコードを意味的に分けるのは絶対に間違っていますか?
あなたが61だとすると、awkで十分と言うわりには
数クロックの無駄にめくじら立てたりおもしろい人ですね。
あとどこら辺が仕様を満たしてないのか興味あります。
まさかインデントが...とか言わないよね。
それより早く「正解」を見せてね(ハート)
0071デフォルトの名無しさん
2005/07/21(木) 07:45:05何むきになってるの? >>61(=>>65)言うところの「あまり効率いいとは思えないコード」を書く
「仕様も読めないらしい」>>62本人?
平均値は入力値を積算してループ脱出後に件数で割るのが「ふつー」。
ふつーじゃないコードを私ゃ糞とまでは言わないけどね。
それと、>>69は速度を云々しているわけではないんでないかな?
それさえ読み取れないから>>61に馬鹿にされているんでしょ。
で、もし>>70=>>62なら、自分のコードが仕様を満たしてないことにホントに気付いてないの?
>>69は>>67のコードのことしか書いてないのに自分が攻撃されてると思ってファビョってるのかな?
0072デフォルトの名無しさん
2005/07/21(木) 10:12:16> ランダムな入力で試すと常に同じ結果
for (unsigned j = 0; j < 30000; ++j) {
int i = rand();
sum += i;
++count;
printf("%d %d %d %d %f %0f %f %f %d\n",p_max,m_max,p_min,m_min,p_ave,m_ave,a_ave,t_ave,p_cnt+m_cnt);
printf("%f\n", ((double)sum)/count);
printf("%f\n", ((double)sum)/count - t_ave);
32765 0 1 0 16489.450448 0.000000 16489.450448 16489.450448 29999
16488.900800
-0.549648
007361=65
2005/07/21(木) 12:56:39一応呼ばれたみたいだから書くけど、
自分のソースの間違いを>67が修正して使っているということは理解できてんの?
あんたの場合「必要充分」の意味自体も取り違えていそうだけど、
仕様を満たしていないものしか書いてないのだからそれ以前なんだけど。
後は>71と>72が指摘してくれているので割愛。
まぁ、普段はそんな必要もないけど、有効精度の求め方も知らないんだろうなぁ。
ここからは余談というか愚痴。
Excelでstdevの計算値がおかしいと思ったらバージョンによって結果が違う罠。
自作のawkスクリプトに通したらそれでも未だ変。
結局、long doubleの精度が必要だった。CV値1e-7なんてそんなもんさ……
007472
2005/07/21(木) 14:01:19do i=rand(); while (i == 0); としてみた。
32765 0 1 0 16489.199800 0.000000 16489.199800 16489.199800 30000
16489.199800
-9.45874e-011
同じに見えても誤差はあるってことだな。
0075デフォルトの名無しさん
2005/07/21(木) 14:29:21お互いうっとうしいだろうから最後にするよ。
絶対値平均については、それは意味が分からないと言ってあるでしょ。
なにも問題ない。
それ以外になにかあるなら言ってみなよ。もう反応しないから
言わなくてもいいけど。
おまえは間違っている、何が間違っているかは自分で考えろ
なんてヤクザか新興宗教のセリフだよ。
誤差についてはまぁ誤解のある表現だったね。
結果とは%.0fの出力であって、doubleどうしの比較のつもりじゃなかった。
そして6000くらいのデータで無視できない程の誤差はでないということね。
0076デフォルトの名無しさん
2005/07/21(木) 15:42:061 -1 1 -1 1.000000 -1.000000 1.000000 -0.000000 6000
^^^^^^^^^
なんて出てテラキモス
0077デフォルトの名無しさん
2005/07/21(木) 18:27:52どこに波線? 見たところ1.000000に引いてあるようだけど、問題視しているのは-0のことだよね?
0078デフォルトの名無しさん
2005/08/04(木) 20:13:58// 各整数型のビット数を数える関数
// >>が多過ぎって怒られたから≫で代用w
static inline unsigned count(unsigned long bits)
{
bits -= bits ≫ 1 & 0x55555555;
unsigned tmp = (bits & 0x33333333) + (bits ≫ 2 & 0x33333333);
tmp += tmp ≫ 4;
tmp &= 0x0f0f0f0f;
tmp += tmp ≫ 8;
tmp += tmp ≫ 16;
return (unsigned char) tmp;
}
static inline unsigned count(unsigned short bits)
{
bits -= bits ≫ 1 & 0x5555;
unsigned tmp = (bits & 0x3333) + (bits ≫ 2 & 0x3333);
tmp += tmp ≫ 4;
tmp &= 0x0f0f;
tmp += tmp ≫ 8;
return (unsigned char) tmp;
}
static inline unsigned count(unsigned char bits)
{
bits -= bits ≫ 1 & 0x55;
unsigned tmp = (bits & 0x33) + (bits ≫ 2 & 0x33);
tmp += tmp ≫ 4;
return tmp & 0x0f;
}
0079デフォルトの名無しさん
2005/08/07(日) 01:45:09テンプレートにまとめた方がよくね?
0080デフォルトの名無しさん
2005/08/07(日) 02:07:17そのメリットを感じないのだけれど、何かあるかね。
■ このスレッドは過去ログ倉庫に格納されています