カオスの定義に用いられるリアプノフ数を
実験値(時系列データ)から求めたいのですが,
何か参考になる文献(論文)などあったら
教えてください.
某論文によれば,Wolfのアルゴリズムを用いるのが
一般的とありましたが,
もし,Wolfのアルゴリズムを用いてリアプノフ数の
算出するプログラムが一般に公開されているなら
そのソースを教えてください.
よろしくお願いします.

このQ&Aに関連する最新のQ&A

A 回答 (1件)

えっと、全然答えられる内容ではないので恐縮ですが、ここではなくて「数学」のところで質問されてはどうでしょう。

もしかしたら分かる人がいるかも知れませんよ。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q近頃、片手運転をしている運転手が多く又、そんな方程ボーー?として運転し

近頃、片手運転をしている運転手が多く又、そんな方程ボーー?として運転しますがどうしてキチンとした姿勢で運転しないんですか?そんな方がよく運転中に携帯で話をしてますが違反て知らないの?

Aベストアンサー

質問者さんは変な人間だけです。

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

Q2階線形同次微分方程​式

以下の問題の解き方が理解できません。

途中の計算なども詳しく教えて頂けると幸いです。


(1) 2階線形同次微分方程式の関数と,二つの関数y1とy2および初期条件の対が与えられている.最初に二つの関数y1とy2が微分方程式の解であることを確認せよ.次に,初期条件を満たす特殊解を求めよ.

(1) y''-y=0; y1=e^x, y2=e^-x; y(0)=0, y'(0)=5


(2) y''+4y=0; y1=cos2x, y=sin2x; y(0) = 3, y'(0)=8


(3) y''-3y'+2y=0; y1=e^x, y2=e^2x; y(0)=1, y'(0)=0

Aベストアンサー

いずれも 2 次。
(3) をサンプルに堅実な手口で。
ほかも同様…なので割愛。

>(3) y''-3y'+2y=0; y1=e^x, y2=e^2x; y(0)=1, y'(0)=0

「最初」に「方程式の解であることを確認」
 y1=e^x → y1'=e^x → y1''=e^x  …(1)
 y2=e^(2x) → y2'=2e^(2x) → y2''=4e^(2x)  …(2)
     ↓
(1) を原方程式へ代入。
 y''-3y'+2y = e^x - 3e^x + 2e^x = 0  … OK
(2) を原方程式へ代入。
 y''-3y'+2y = 4e^(2x) - 6e^(2x) + 2e^(2x) = 0  … OK

一般解は、
 y = C1e^x + C2e^(2x)
 y' = C1e^x + 2C2e^(2x)
らしいから、これに「初期条件」 y(0)=1, y'(0)=0 を代入し、
 1 = C1 + C2  …(3)
 0 = C1 + 2C2  …(4)

残務は、(3), (4) から {C1, C2} を勘定すること…だけ。

  

いずれも 2 次。
(3) をサンプルに堅実な手口で。
ほかも同様…なので割愛。

>(3) y''-3y'+2y=0; y1=e^x, y2=e^2x; y(0)=1, y'(0)=0

「最初」に「方程式の解であることを確認」
 y1=e^x → y1'=e^x → y1''=e^x  …(1)
 y2=e^(2x) → y2'=2e^(2x) → y2''=4e^(2x)  …(2)
     ↓
(1) を原方程式へ代入。
 y''-3y'+2y = e^x - 3e^x + 2e^x = 0  … OK
(2) を原方程式へ代入。
 y''-3y'+2y = 4e^(2x) - 6e^(2x) + 2e^(2x) = 0  … OK

一般解は、
 y = C1e^x + C2e^(2x)
 y' = C1e^x + 2C2e^(2x)
らしい...続きを読む

Q1,1,2,3,5,8,13の合計

初心者ですみませんが、1,1,2,3,5,8,13の合計を出すプログラミングがどうしてもわかりません。どなたかご教示頂けましたら助かります。
宜しくお願いいたします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
   printf("%d\n", 1+1+2+3+5+8+13);
}

Q気体の状態方程についての質問が2つあります。

(1)気体の状態方程式PV=nRTにおいて、比例、反比例、一定値を選べ。
(1)n、Tが一定のときのPVとP
(2)n、Vが一定のときのPとT
(3)P、Vが一定のときのnとT

まず、上記3つの一定のときとはどういうことなのでしょうか?
答えの考え方を教えてください。

(2)ある液体物質を約10mlとり、容積500mlのフラスコに入れ、小さな穴をあけたアルミ箔でふたをして、沸騰水(100℃)で完全に気化させた後、放冷して液化したところ、残った液体の質量は1.20gであった。この液体物質の分子量を求めよ。ただし、大気は1.0×10^5Paとする。

PV=n/MRTに当てはめたとき
V=ある液体物質を約10mlと容積500mlのフラスコの2つがあてはまると思うのですが、計算のしかたはどうにすれば良いのでしょうか?

Aベストアンサー

(1)と(2)では難しさに大きな違いがあります。

(1)は式の中にある量と実験条件との対応です。
状態方程式をただ与えられた公式として使おうとしておられるようですね。それが得られた場面を考えるという作業が必要です。
ボイルの法則、シャルルの法則を習ったと思います。
容器の中に気体を入れて圧力や温度を変えて体積の変化を調べます。圧力や温度を変える時に容器の中の気体が容器外に漏れてしまうとダメだというのは実験上の注意としては当然のことです。学校で実験をする場合でも一番素直に納得してもらえることです。これは式でいうと「n:一定」という条件です。

ボイルの法則は
温度を一定に保って(温度が変わらないようにして)圧力を増加させると体積が減少する。体積は圧力に反比例する。

シャルルの変化は
圧力を一定に保って(圧力が変わらないようにして)温度を高くすると体積が増加する。体積は絶対温度(摂氏温度+273)に比例する。

ボイルの法則では「n,T:一定」という条件を使っています。
シャルルの法則では「n、P:一定」という条件を使っています。

ある量を一定にして考えるというのが状態方程式で初めて出てきたわけではないはずです。
状態方程式はボイルの法則とシャルルの法則、アボガドロの法則を1つの式にまとめたものですから同じ考え方を使っています。

習ったばかりで馴れていない表現ということでは(1)のPVとPの関係は戸惑うかもしれません。2つの量をまとめて1つの量として考える時の関係です。
Pを横軸、(PV)を縦軸にしてグラフを書くとPをかえてもPVは変わりません。一定になります。(#2、「PV/PはPに反比例」は見当違いの回答です。)
※実験値をグラフにするときに使います。ばらつきのある測定値を1つの式に当てはめる時は、曲線よりも直線の方が扱いやすいです。精度も高くなります。反比例の双曲線のグラフに合わせるのは難しいです。
実在の気体の体積、圧力の変化がボイルの法則にどの程度合うかを調べる時にも使います。
※反比例の関係の場合、V=a/Pは分かるがPV=一定がピンと来ないという高校生がかなりいるようです。数学で比例はy=ax、反比例はy=a/xという式で出てくるからです。

(2)
>PV=n/MRTに当てはめたとき
V=ある液体物質を約10mlと容積500mlのフラスコの2つがあてはまると思うのですが、

状態方程式のなかに出てくるP、V、T,nなどの文字に与えられた数字を代入して計算するということしかやったことがないという印象ですね。Vに入れる数字を探して体積と容積とで戸惑ってしまったということです。
10mLは「液体の体積」です。
状態方程式は気体について成り立つ式です。
気体は入れ物がなければ体積が決まりません。
その物質が気体になってフラスコの中全体に広がったとして初めて体積が分かることになります。
初め空気が入っていますから試料の蒸発が起こるとともに空気が全部追い出されて試料蒸気だけでフラスコなのかが満たされているという条件の確認が必要になります。直接調べるのが難しいので余分に試料を用意しておいてどんどん過熱すれば入れた液体が全部蒸発する頃には空気はなくなっているだろうと考ええています。空気と一緒に試料の蒸気もかなり(8割程度)出て行ってます。蒸気が出て行くのが止まるのは蒸気の圧力が大気圧に等しくなる所です。穴が小さいので空気が逆に入ってくるということはないだろうと考えます。
これで温度と体積、圧力が決まります。この3つの量から物質量が求められます。使う式はPV=nRTです。
(温度が~、圧力が~、体積が~である与えられているのではありません。実験条件から温度、圧力、体積が~であると読み取るのです。)

物質量nと質量m(教科書ではwと書いてある場合があります)が分かれば1モル当たりの質量Mが分かります。1モル当たりの質量をgで表した数値は分子量と同じ値になります。
(PV=nRT、n=m/M ですからPV=(n/M)RTという式はありません。)

フラスコを冷やして試料の蒸気を液体に戻すと穴から空気が入ってきます。フラスコの質量を測ると空気の分は共通ですから液体の部分の質量分だけ増加した値が得られるはずです。その質量が1.2gです。
※内部の蒸気が全て液体に戻ったということを確めるのは難しいです。
十分に時間をかければ「たぶんほとんど全てが液体に戻っているだろう」と仮定しての話です。
※それほど精度のある実験ではありません。
※質量が1.2gということで有効数字はほとんど1桁です。

(1)と(2)では難しさに大きな違いがあります。

(1)は式の中にある量と実験条件との対応です。
状態方程式をただ与えられた公式として使おうとしておられるようですね。それが得られた場面を考えるという作業が必要です。
ボイルの法則、シャルルの法則を習ったと思います。
容器の中に気体を入れて圧力や温度を変えて体積の変化を調べます。圧力や温度を変える時に容器の中の気体が容器外に漏れてしまうとダメだというのは実験上の注意としては当然のことです。学校で実験をする場合でも一番素直に...続きを読む

Q2次関数の最小値をC言語と遺伝的アルゴリズム(GA)を用いて求めたいです汗

私は機会系の大学生のものです。

今回は
2次関数の最小値をプログラムのC言語と遺伝的アルゴリズム(GA)を用いて求めたいのですが
私がC言語が素人のためプログラムを作れません...。例として教えていただけると幸いです。

よろしくお願い致します。

Aベストアンサー

作ってみた
https://gist.github.com/otaks/3c6eebea260ce1296da2b9a2d03fd421

各遺伝子は5要素の配列から成っており、
[3][2][1][0]を2進数に見立てて、これを10進数に変換し
[4]を元に符号をつけている。

ユーザ入力は以下を参考に。
(平方完成後の値を入力するようになっています)
y=a(x+q)2+q
(minx<=x<=maxx)

50世代ぐらい回せば正解が出そう。

中学校当たりの問題は解けそうだけど、今の作りだとxが-15~15しか
表現できないし、精度は整数レベルなので、より難しい問題を解くならば
改造が必要。

Q2階線形同次微分方程​式

以下の問題の解き方が理解できません。

途中の計算なども詳しく教えて頂けると幸いです。


(1) 微分方程式の一般解を求めよ.

(1) y''-3y'+2y=0

(2) y''+5y'=0

Aベストアンサー

(1) y''-3y'+2y=0
特性方程式は
s^2-3s+2=(s-1)(s-2)=0 ∴s=1,2
したがって一般解は
 y=C1e^t + C2e^(2t) (但し、C1,C2は任意定数)


(2) y''+5y'=0
特方程式は
s^2+5s=s(s+5)=0 ∴s=0,-5
したがって一般解は
 y=C1 + C2e^(-5t) (但し、C1,C2は任意定数)

となります。

QBresenhamのアルゴリズムを用いた円描画

一つ下の質問をした後に、いろいろ考えて作ったプログラムなのですが、コンパイルが通りません。
頭がこんがらがってしまったので、教えていただけるとうれしいです。

main(){
   int x, y, r, d;

   printf("Enter coordinates of radius of circle. R = ");
   scanf("%d\n", &r);

   x = 0;
   y = r;
   d = 3 - 2 * r;

   while(y > x){
     plotcircle(x, y, r);
     if(d < 0){ /* select U */
        d = d + 4 * x + 6;
     }else{ /* select D */
        d = d + 4 * (x - y) + 10;
        y = y - 1;
     }
     x = x + 1;
   }

   if(x == y){
     plotcircle(x, y, r);
   }
}


plotcircle(int x, int y, int r){
   putpixel( x, y, r);
   putpixel( y, x, r);
   putpixel( y, -x, r);
   putpixel( x, -y, r);
   putpixel(-x, -y, r);
   putpixel(-y, -x, r);
   putpixel(-y, x, r);
   putpixel(-x, y, r);
}

一つ下の質問をした後に、いろいろ考えて作ったプログラムなのですが、コンパイルが通りません。
頭がこんがらがってしまったので、教えていただけるとうれしいです。

main(){
   int x, y, r, d;

   printf("Enter coordinates of radius of circle. R = ");
   scanf("%d\n", &r);

   x = 0;
   y = r;
   d = 3 - 2 * r;

   while(y > x){
     plotcircle(x, y, r);
     if(d < 0){ /* select U */
        d = d + 4 * x + 6;
   ...続きを読む

Aベストアンサー

計算は間違ってないようですので、描画をなんとかすれば動くと思います。

参考まで。(画面を50*50サイズで、円の中心を25,25に固定しています)

#include <stdlib.h>
#include <stdio.h>

char disp[50][50]; // 画面領域の定義(50*50固定)
void plotini(void); // 画面を消す
void plotcircle(int, int, int, int, int); // 画面に点を打つ
void plotdisp(void); // 画面を表示する

int main(){
 int x, y, r, d;

 printf("Enter coordinates of radius of circle. R = ");
 scanf("%d", &r);

 plotini();

 x = 0;
 y = r;
 d = 3 - 2 * r;

 while(y > x){
  plotcircle(x, y, 25, 25, 'X');
  if(d < 0){ /* select up */
   d = d + 4 * x + 6;
  }else{ /* select bottom */
   d = d + 4 * (x - y) + 10;
   y = y - 1;
  }
  x = x + 1;
 }

 if(x == y){
  plotcircle(x, y, 25, 25, 'X');
 }

 plotdisp();

 return 0;
}

void plotini(void) {
 int i,j;
 for (i=0; i<50; i++) for (j=0; j<50; j++) disp[i][j]=' ';
}

void plotcircle(int x, int y, int xc, int yc, int c) {
 int xx,yy;
 xx = xc+x; yy = yc+y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
 xx = xc+y; yy = yc+x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
 xx = xc+y; yy = yc-x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
 xx = xc+x; yy = yc-y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
 xx = xc-x; yy = yc-y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
 xx = xc-y; yy = yc-x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
 xx = xc-y; yy = yc+x; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
 xx = xc-x; yy = yc+y; if (xx>=0 && x<50 && yy>=0 && yy<50) disp[yy][xx]=c;
}

void plotdisp(void) {
 int i,j;
 for (i=0; i<50; i++) {
  for (j=0; j<50; j++) {
   printf("%c",disp[i][j]);
  }
  printf("\n");
 }
}

計算は間違ってないようですので、描画をなんとかすれば動くと思います。

参考まで。(画面を50*50サイズで、円の中心を25,25に固定しています)

#include <stdlib.h>
#include <stdio.h>

char disp[50][50]; // 画面領域の定義(50*50固定)
void plotini(void); // 画面を消す
void plotcircle(int, int, int, int, int); // 画面に点を打つ
void plotdisp(void); // 画面を表示する

int main(){
 int x, y, r, d;

 printf("Enter coordinates of radius of circle. R = ");
 scanf("%d", ...続きを読む

Q方程

x≧0,y≧0,2x+y≦12,x+2y≦12のとき、5x+4yの最大値を求める方法で
まず、x≧0,y≧0,2x+y≦12,x+2y≦12を全て満たすような(x,y)の集合を
xy平面の領域として図示する方法がわかりません。

直線5x+4y=kが共有点をもつようなkの範囲の
最大値と最小値を求めれば良いそうですがどのようにもとめるのかわかりません。

そして、最大値はどのようにして求めるのでしょうか?

Aベストアンサー

教えるのが下手なのでこれ以上器用に説明するのは困難なのですが...がんばってみます。

> 2x+y=12の左下側
x+2y=12の左下側

の左下がよくわかりません。

領域というのは点をさしているのではなく、面を示しているのです。
紙に、端から端まで一本の線を引くと二つに分けられますよね。
例えば横に線を引けば上下に領域ができます。
線に沿って紙を切れば、2つの部分に分かれるでしょう。

今回の領域の境界線は直線なので、やっぱり二つにわかれます。
それを左下、右上としたのです。



>どうして、1/4が出るのですか?

5x+4y=k
4y=(5x+k)
y=(1/4)*(5x+k)
y=(5/4)x+(1/4)k

ですよ。


> xとyは
0≦x≦4 0≦y≦4

5x+4yにそれぞれ代入をして
20+16=36になりました。答えは合っているのですが
5x+4y=k の辺りがよくわかりません。

x,yの範囲は必要ないですよ
求めたいのはkの範囲です

先ほど求めた領域は(0,0) (6,0) (0,6) (4,4)
を頂点とする四角形になってます。

そこでこの領域と
y=(5/4)x+(1/4)k のグラフが重なる範囲をみつけるわけです。

具体的には

y=(5/4)x-1
y=(5/4)x+0
y=(5/4)x+1
y=(5/4)x+2
  ・
  ・
  ・
と書いていき、このグラフが領域にぎりぎり重なる場所を見つけるわけです。
(面倒かもしれませんが、領域の図とこれらのグラフを書いて考えてみてください)

重なり始めるのはグラフがどの点を通るときですか?
(0,0)を通るときになります。
ではこのときのkは?
5*0+4*0=0 k=0です

重なり終わりはグラフがどの点を通るときですか?
(4,4)を通るときになります。
ではこのときのkは?
5*4+4*4=36 k=36です

という感じです。

もしかして、中学校のときから数学が苦手じゃなかったですか?(違ってたらごめんなさい)
もしそうなら今のうちに中学数学の復習をしておいてもいいかもしれません。
苦手で放り出していたところが、結構役に立ったりするもです(私がそうでしたので)

教えるのが下手なのでこれ以上器用に説明するのは困難なのですが...がんばってみます。

> 2x+y=12の左下側
x+2y=12の左下側

の左下がよくわかりません。

領域というのは点をさしているのではなく、面を示しているのです。
紙に、端から端まで一本の線を引くと二つに分けられますよね。
例えば横に線を引けば上下に領域ができます。
線に沿って紙を切れば、2つの部分に分かれるでしょう。

今回の領域の境界線は直線なので、やっぱり二つにわかれます。
それを左下、右上としたのです。


...続きを読む

Qmemcpy,memcmp,strcmp,strlen,strcat,

memcpy,memcmp,strcmp,strlen,strcat,strcpy,strstr,strchr
以上の関数を自作しました。
ひとつひとつを見たときに動作を確認したところうまく出来たのですが、この関数をプログラムに組み込んだところうまく動作しませんでした。
どこか間違っているところがあったら指摘して頂きたいと思います<m(__)m>
ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。


char *MyMemcpy(char *str1, char *str2, size_t n)
{

char *p1 = str1;
char *p2 = str2;


while(n--){
*p1 = *p2;
p1++;
p2++;
}

return str1;
}
void *MyMemcmp(void *str1, void *str2)
{
char *p1 = (char*)str1;
char *p2 = (char*)str2;
int n = 0, k = 0;

while( *p1 != '\0'){
*p1++;
n++;
}

while( *p2 != '\0'){
*p2++;
k++;
}

if(n > k){
return str1;
}else if(n == k){
return 0;
}else if(n < k){
return str2;
}

}
char *MyStrcmp(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;
int n = 0, k = 0;

while( *p1 != '\0'){
*p1++;
n++;
}

while( *p2 != '\0'){
*p2++;
k++;
}

if(n > k){
return str1;
}else if(n == k){
return 0;
}else if(n < k){
return str2;
}

}
size_t MyStrlen(const char *str1)
{
char *p1 = (char*)str1;
size_t len = 0;

while(*p1 != NULL){
*p1++;
len++;
}

return len;
}
char *MyStrcat(char *str1, const char *str2)
{
char *p1 = str1;
char *p2 = (char*)str2;

while(*p1 != NULL){
*p1++;
}
while(*p2 != NULL){
*p1 = *p2;
*p1++;
*p2++;
}

return str1;
}
char *MyStrcpy(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;

while( *p2 != NULL){
*p1 = *p2;
*p1++;
*p2++;
}
*p1 = '\0';

return str1;
}
char *MyStrstr(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;

while(*p1 != *p2)
{
if(*p1 == '\0'){
return 0;
}
*p1++;
}
return p1;

}
char *MyStrchr(const char *str1, char str2)
{
char *p1 = (char*)str1;

while(*p1 != str2)
{
if(*p1 == '\0'){
return 0;
}
*p1++;
}
return p1;
}

memcpy,memcmp,strcmp,strlen,strcat,strcpy,strstr,strchr
以上の関数を自作しました。
ひとつひとつを見たときに動作を確認したところうまく出来たのですが、この関数をプログラムに組み込んだところうまく動作しませんでした。
どこか間違っているところがあったら指摘して頂きたいと思います<m(__)m>
ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。


char *MyMemcpy(char *str1, char *str2, size_t n)
{

char *p1 = str1;
char...続きを読む

Aベストアンサー

> この関数をプログラムに組み込んだところうまく動作しませんでした。

どんな風に「うまく動作し」なかったのでしょうか?
それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。

特に
> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。
とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。

例えば、
> char *MyStrcmp(char *str1, char *str2)
プログラムを解読すると

str1とstr2、それぞれの文字列の長さを比較。
→長さ等しい場合は (char *)NULL, 異なる場合は、長い方の文字列へのポインタを返す

と、strcmpとはまったく別の関数になっています。(strcmpは文字列の内容も比較し、結果を 負の整数,0,正の整数 (いずれもint型)で返します)


あと、明確な間違いというわけではないですが。
> while(*p1 != NULL){

大抵の処理系では NULL == '\0' == 0 として使えるけど、ヌルポインタとヌル文字はわけて考えた方がいいです。

> この関数をプログラムに組み込んだところうまく動作しませんでした。

どんな風に「うまく動作し」なかったのでしょうか?
それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。

特に
> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。
とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。

例えば、
> char *MyStrcmp(char *str1, char *str2)
プログラムを解読...続きを読む


人気Q&Aランキング

おすすめ情報