宿題とか手伝えます

このエントリーをはてなブックマークに追加
>>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みたいにし、その待避した値を返すのが一番いい?
964963:02/07/27 01:44
それとも添え字を使った方がいい?
>>962
キャストするまで。

void (*mystrcat)(char *s1, const char *s2) = (void (*)(char *, const char*))strcat;
>>951
そりゃ正規表現じゃなくてワイルドカードだな。

それとiの初期化。
967デフォルトの名無しさん:02/07/27 01:54
http://users.powernet.co.uk/eton/kandr2/krx503.html
こんなの拾ったよ。K&Rの解答みたいだけど。
956がいいみたい。954は""な\0だけの文字列でダメになるよ。
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)をしらなくても
自分で考えつければプログラムできる。
973ボケ倒してみる:02/07/27 04:37
/*
問題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);
977975=976:02/07/27 05:30
これ動くかな?
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言語」片手に努力しましたがどうにもならず書き込みしました
誰か代わりに作っては頂けないでしょうか。
コラッツの予想てなんじゃ?
980978:02/07/27 07:03
ある正の整数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
>>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
983978:02/07/27 07:10
ありがとうございます
ただp(n)とかその最大値とかをどう扱ったらいいんでしょう。
>>983
p(n)の最大値は>>982のプログラムでprintfしてるよ。
985978:02/07/27 07:23
本当にありがとうございました
本当に助かりました
986982:02/07/27 07:25
>>985
そのものずばりのコードを書いたのはよくなかったかも。
将来プログラマになるつもりがあるのなら、
よくコードを読んで何をやってるのか理解してくれ。
難しいことは一切やってないから。
987 :02/07/27 09:46
>>986
そのものずばりのつもりだったのか。
1 < n <= 10000 ではないし、nも求めてないが。
>>982
オーバーフローチェックもやった方がいいかも。
989デフォルトの名無しさん:02/07/27 10:54
>>973
再帰マニアですか?
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
キャッシュミスがどうとかいうんなら、
ソース、コンパイルオプション、実行環境のスペック等を教えてもらわんと。
995 :02/07/27 16:14
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);
}
>>997
再帰好きだね
999Rina ◆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;
}

全角スペース→半角スペースに変えてください.
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。