>>931 long mystrlen(const char *str)
{
long i;
for(i=0;str[i]!='\0';i++);
return i;
}
void mystrcat(char *s1,const char *s2)
{
long i,j;
i=mystrlen(s1);
j=mystrlen(s2);
memcpy(s1+i,s2,j+1);
}
>952
memcpy使うんかい!って話やな
void mystrcat(char *s1, const char *s2) {
while ( *s1 != '\0' ) s1++;
while ( *s2 != '\0' ) *(s1++) = *(s2++);
*s1 = '\0';
}
954 :
デフォルトの名無しさん:02/07/27 01:33
削れ削れ。
void mystrcat(char *s1, const char *s2) {
while (*++s1);
while (*s1++ = *s2++);
}
955 :
デフォルトの名無しさん:02/07/27 01:37
削れ削れ
void mystrcat(char *s1, const char *s2) {
strcat(s1,s2);
}
956 :
デフォルトの名無しさん:02/07/27 01:37
void mystrcat(char *s1, const char *s2) {
while (*s1) s1++;
while (*s1++ = *s2++);
}
957 :
デフォルトの名無しさん:02/07/27 01:38
削れ削れ
#define sc(s1,s2) strcat(s1,s2);
void mystrcat(char *s1, const char *s2) {
sc(s1,s2);
}
void (*mystrcat)(char *s1, const char *s2) = strcat;
みたいにできたかな?
959 :
デフォルトの名無しさん:02/07/27 01:40
>>958 宿題内容は関数をつくれってことだからそれは駄目。
960 :
デフォルトの名無しさん:02/07/27 01:40
#define mystrcat(s1,s2) strcat(s1,s2)
;書いていいの?
お前ら全員クビ!
962 :
デフォルトの名無しさん:02/07/27 01:42
strcatはchar *を返すぞ。
963 :
デフォルトの名無しさん:02/07/27 01:44
strcatと同じようにする場合は、s1の内容をあらかじめ他の変数に待避しておいて、
>>954みたいにし、その待避した値を返すのが一番いい?
それとも添え字を使った方がいい?
>>962 キャストするまで。
void (*mystrcat)(char *s1, const char *s2) = (void (*)(char *, const char*))strcat;
>>951 そりゃ正規表現じゃなくてワイルドカードだな。
それとiの初期化。
967 :
デフォルトの名無しさん:02/07/27 01:54
968 :
デフォルトの名無しさん:02/07/27 01:56
>>967 俺だったら
for(;*s1;s1++) ;ってやるな
俺はやらんが
s1 += strlen(s1);
こんなんどうかな。
char *strend(char *s){
while (*s) s++;
return s;
}
size_t strlen(char *s) {
return strend(s)-s;
}
char *strcpy(char *s, const char *t) {
char *u = s;
while (*u++ = *t++);
return s;
}
char *strcat(char *s, const char *t) {
strcpy(strend(s), t);
return s;
}
正規表現は非決定性有限状態オートマトン(NFA)をしらないと
プログラムできない。
非決定性有限状態オートマトン(NFA)をしらなくても
自分で考えつければプログラムできる。
/*
問題1
文字列strの長さを返す関数mystrlenをつくれ。
プロトタイプはlong mystrlen(const char *str)とする。
*/
long mystrlen(const char *str)
{
return *str ? mystrlen(str+1)+1 : 0;
}
/*
問題2
文字列s1の後ろに文字列s2を連結する関数mystrcatを作れ。
プロトタイプはvoid mystrcat(char *s1,const char *s2)とする。
*/
void mystrcat(char *s1,const char *s2)
{
if (*s2)
{
s1 += mystrlen(s1);
s1[0] = *s2;
s1[1] = 0;
mystrcat( s1, s2+1 );
}
}
void main( int ac, char *av[] )
{
char str[11];
printf( "%d\n", mystrlen("1234567890") );
str[0] = 0;
mystrcat( str, "12345" );
mystrcat( str, "67890" );
puts( str );
}
>>973 わははは。ワラターヨ
何でそこでそんな飛び道具使う(w
975 :
デフォルトの名無しさん:02/07/27 05:16
if (*s1) s1 += mystrlen(s1);
if (*s2) {
s1[1] = *s1;
*s1 = *s2;
mystrcat(s1, s2+1);
}
*s1++ = *s2++;
mystrcat(s1, s2);
これ動くかな?
void mystrcat(char *s1,const char *s2) {
if (*s1) s1 += mystrlen(s1);
if (*s1++ = *s2++) {
*s1 = 0;
mystrcat(s1, s2);
}
}
978 :
デフォルトの名無しさん:02/07/27 06:39
コラッツの予想が1<n<=10000について正しいことを確かめよ
またnに対してこの操作を施す回数をp(n)と表し、このp(n)の最大値と
それを与えるnを求めるc言語のプログラムを作成せよ
という宿題で大変困ってます c言語というかプログラミング自体ほぼ初めてで
「初めてのc言語」片手に努力しましたがどうにもならず書き込みしました
誰か代わりに作っては頂けないでしょうか。
コラッツの予想てなんじゃ?
ある正の整数nに対して、nが偶数なら2で割る。nが奇数なら3倍
して1を加えるという作業を繰り返すといつか必ず1になるという予想です。
例えば3→10→5→16→8→4→2→1のようになるというものです
>>978 コラッツの予想は
ttp://www.gt.sakura.ne.jp/~nyagy/integer/collatz.html か。こんな名前ついてるの知らなかったよ。
プログラムはこんな感じかな。
#include <stdio.h>
#include <ctype.h>
#define even(n) (!((n) & 1))
unsigned long collatz(unsigned long n)
{
unsigned long p = 0;
while (n != 1) {
p++;
if (even(n)) {
n /= 2;
}
else {
n = n * 3 + 1;
}
}
return p;
}
int main(int argc, char * argv[])
{
unsigned long i, n, r, max = 0;
/* オプションのチェック */
if (argc < 2 || !isdigit(*argv[1])) {
fputs("数字を指定してYO!\n", stderr);
return 3;
}
n = strtoul(argv[1], NULL, 10);
for (i = 1; i <= n; i++) {
r = collatz(i);
if (max < r) {
max = r;
}
}
printf("%lu\n", max);
return 0;
}
って、プログラム書いてる間に、同じサイトが出てたね(w
ありがとうございます
ただp(n)とかその最大値とかをどう扱ったらいいんでしょう。
本当にありがとうございました
本当に助かりました
>>985 そのものずばりのコードを書いたのはよくなかったかも。
将来プログラマになるつもりがあるのなら、
よくコードを読んで何をやってるのか理解してくれ。
難しいことは一切やってないから。
>>986 そのものずばりのつもりだったのか。
1 < n <= 10000 ではないし、nも求めてないが。
>>982 オーバーフローチェックもやった方がいいかも。
989 :
デフォルトの名無しさん:02/07/27 10:54
990 :
デフォルトの名無しさん:02/07/27 14:29
なぜ、行列積のループ順を変えると演算時間が変わるのです?
キャッシュミスとかが絡んでくると思うんだけど、誰かわかりやすく
教えてくれませんか?
単純に考えたのは
for(i=0;i<n;i++)
for(j=0;j<n;j++)
tbl[i][j] = tbl[j][i];
てのがあったとして
jのループの中でtbl[i]は一定だから最適化しても
tbl[j][i]をいちいち求めてると遅くなる。
tbl[0][i]からポインタ演算してくれるコードをはいてくれると
速度的には変わらないかなと思うが。
>>990 ページを超えてジャンプしたら遅いんじゃないの?
次スレ
>>990 キャッシュミスがどうとかいうんなら、
ソース、コンパイルオプション、実行環境のスペック等を教えてもらわんと。
n次元ベクトルの内積を求める関数
double inprod(doble a[],double b[],int c);
はどのように書けばいいのでしょうか?
ご教授おねがいします
>>995 すでに数学の領域かと。宿題なら習っただろうて。
997 :
デフォルトの名無しさん:02/07/27 16:22
double inprod(doble a[],double b[],int c) {
return c == 0 ? 0.0 : *a * *b + inprod(a + 1, b + 1, c - 1);
}
999 :
Rina ◆tI333vNE :02/07/27 16:26
非再帰ならこれでいいかと.
double inprod(double a[], double b[], int n) {
int i;
double tmp = 0;
if (n == 0) {
return 0.0;
}
for (i = 0 ; i < n ; i++) {
tmp += a[i] * b[i];
}
return tmp;
}
全角スペース→半角スペースに変えてください.
あ
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。