(つД`)C/C++の宿題は私にやらせてよ!Ver12
たぶん数値計算をよく知ってる人からみれば論外なコードだと思います。
演算順序の考慮等ご指摘いただければ幸いです。
でもさ,この課題は制度とかそういう事じゃないでしょ?
精度だごめん
精度が良い順に成績が付きます
956 :
デフォルトの名無しさん:03/09/24 23:13
にいさんたちにこれをお願いしたいと思います。クラスは初めてなのでお手本おたのみします。見づらいのは改行が多すぎると怒られるので・・・
任意の文字列を格納するクラスを作成せよ。クラス名はStringとし、クラスのヘッダーファイル(String.h)は以下のようにしなさい。
#ifndef String_H #define String_H
class String { public:
// コンストラクタとデストラクタ
String(); String(const char* str); String(const String& str); ~String();
// 代入オペレータ
String& operator=(const String& str);
// 文字列の長さを返す
int length() const;
// 文字列の num 番目の文字を返す
char operator[](int num) const; char& operator[](int num);
// 文字列の先頭/後ろ/中間の文字列を返す
String head(int num) const; String tail(int num) const; String mid(int first, int last) const;
// 2つの文字列を結合する
String& operator+=(const String& right_str); friend String operator+(const String& left_str, const String& right_str);
// 大小比較
friend int operator<(const String& left_str, const String& right_str); friend int operator>(const String& left_str, const String& right_str);
friend int operator<=(const String& left_str, const String& right_str); friend int operator>=(const String& left_str, const String& right_str);
friend int operator==(const String& left_str, const String& right_str); friend int operator!=(const String& left_str, const String& right_str);
// ストリームからの入出力
friend ostream& operator<<(ostream& out, const String& str); friend istream& operator>>(istream& in, String& str);
private: char* my_str;
} #endif // String_H
>>956 答えてあげたいけど、ねえさんなので答えられません。
String::String() : mystr(NULL)
{
my_str = new char[1];
}
String::String(const char* str) : mystr(NULL)
{
my_str = new char[strlen(str)+1];
strcpy(my_str, str);
}
~String()
{
if(mystr != NULL)
delete[] my_str;
}
修正
~String()
{
if(my_str != NULL)
delete[] my_str;
}
修正
String::~String()
{
if(my_str != NULL)
delete[] my_str;
}
String& String::operator=(const String& str)
{
if(&str == this)
return *this;
if(length() < str.length())
{
delete[] my_str;
str = new char[str.length()+1];
}
strcpy(my_str, str);
return *this;
}
int String::length() const
{
return strlen(my_str);
}
char String::operator[](int num) const
{
return my_str[num];
}
char& String::operator[](int num)
{
return my_str[num];
}
>>962 横やりすまんが
せっかくオペレータ定義してるんだから
String& String::operator=(const String& str)
の時は = 使ったら?
String String::head(int num) const
{
String ret = *this;
ret[num] = '\0';
return ret;
}
あ,違った
=定義してるんだからStringを引数に取るコンストラクタは〜ってのが言いたかった
で,見直したらそのコンストラクタないし
>>962は
str = new char[str.length()+1];
を
my_str = new char[str.length()+1];
にすれば動くんじゃないの?
strcpy(my_str, str);
↑はうごかんな
ヒソヒソ (-[^-]*-[^-]*)-([^-]*)-([^-]*)-(.*)
初心者な問題なのですが、任意のファイルを読み込んで、
内容は同じだが名前が違う別のファイルを作成する
Cプログラムを作りたいのですが、
テキストを学校に忘れてきてまったく解りません。
お力を貸してください。
system("cp 任意のファイル 別のファイル");
>>973 d(゚Д゚)☆スペシャルサンクス☆( ゚Д゚)b (^▽^)。
たったこれだけですか?Cはおくが深い。
任意のファイルをキーボードから入力して、
別のファイル名もキーボードから入力する事はどうすれば可能ですか?
>>972 入出力ファイルはテキスト形式であると勝手な判断で
適当につくったからあとは煮るなり焼くなり
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE *fp1,*fp2;
char file1[32],file2[32],buf;
scanf("%s",file1); /* 入力ファイル名入力 */
scanf("%s",file2); /* 出力ファイル名入力 */
if((fp1=fopen(file1,"r"))==NULL)
exit(-1);
if((fp2=fopen(file2,"w"))==NULL)
exit(-1);
while(fscanf(fp1,"%c",&buf)!=EOF)
fprintf(fp2,"%c",buf);
fclose(fp1);
fclose(fp2);
return 0;
}
>>972は、これで提出しちゃうんだろうな、きっと...
別解
int main( int argc, char* argv[] ) {
FILE* in = fopen( argv[1], "rb" );
FILE* out = fopen( argv[2], "wb" );
char buf[100];
int r;
if( in == 0 || out == 0 )
return 1;
while( ( r = fread( buf, 1, 100, in ) ) != 0 ) {
fwrite( buf, 1, r, out );
}
return 0;
}
コンパイルとかはして無い。
String& String::operator=(const String& str)
{
if(&str == this)
return *this;
if(length() < str.length())
{
delete[] my_str;
my_str = new char[str.length()+1];
}
strcpy(my_str, str.my_str);
return *this;
}
String String::tail(int num) const
{
return String(&my_str[length() - num]);
}
String String::mid(int first, int last) const
{
String ret(&my_str[first]);
ret[last - first] = '\0';
return ret;
}
String& String::operator+=(const String& right_str)
{
String tmp(*this);
delete[] my_str;
my_str = new char[tmp.length() + right_str.length() + 1]
strcpy(my_str, tmp.my_str);
strcat(my_str, right_str.my_str);
return *this;
}
friend String String::operator+(const String& left_str, const String& right_str)
{
String ret(left_str);
ret += right_str;
return ret;
}
friend int String::operator<(const String& left_str, const String& right_str)
{
return strcmp(left_str.my_str(), right_str.my_str()) < 0;
}
friend int String::operator>(const String& left_str, const String& right_str)
{
return strcmp(left_str.my_str(), right_str.my_str()) > 0;
}
friend int String::operator==(const String& left_str, const String& right_str)
{
return !strcmp(left_str.my_str(), right_str.my_str());
}
>>977 fgetcよりfread使った方がいいと思うぞ
懇切丁寧な回答ありがとうございましたっ
ここで受けたご恩は、他の誰かにきっと伝えやす。Mr.ペイ・フォワード
989 :
デフォルトの名無しさん:03/09/25 23:36
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE *fp1,*fp2;
char file1[32],file2[32],buf;
fgets(file1,sizeof(file1),stdin); /* 入力ファイル名入力 */
fgets(file2,sizeof(file2),stdin); /* 出力ファイル名入力 */
if((fp1=fopen(file1,"r"))==NULL)
exit(-1);
if((fp2=fopen(file2,"w"))==NULL)
exit(-1);
while(fgets(buf,sizeof(buf),fp1)!=NULL)
fputs(buf,fp2);
fclose(fp1);
fclose(fp2);
}
fgetsの方が好きな漏れにとっては
こんな感じがイイ(・∀・)と思われ。
行に意味がないからfgetsなんて使わない
992 :
デフォルトの名無しさん:03/09/26 00:09
fgetsは漏れが一番最初に覚えた入力方法なの。
だからfgetsが好き。
だからfgetsを使うの。
だめ?ねぇだめ?いいじゃん、使わせてよぉ。
おねがい♪
だめ?だめなの?だめ?だめ?ホントにだめ?
つ・か・わ・せ・て・ぇ
993 :
デフォルトの名無しさん:03/09/26 00:10
お ・ ね ・ が ・ い ・ ♪
そうだ read を使おう...
995 :
デフォルトの名無しさん:03/09/26 00:12
おまんこじゅくじゅくになっちゃったから
入れてほしいの。
でもソレは長いモノだから
一行操作でやってほしいのね。
だからfgetsでズボっと
突 ・ き ・ 刺 ・ し ・ て ・ ェ ・ ♪
996 :
デフォルトの名無しさん:03/09/26 00:14
なんか欲求不満で壊れちゃったみたい。
誰か!早く
挿れてください。おねがいしますから。
あ〜、おちんちんが欲しい。
ねぇ頂戴?おねがい。
997 :
デフォルトの名無しさん:03/09/26 00:15
早くしてくれないともう逝っちゃいそう
ねぇ早く入れて。おながい!!!!!!
998 :
デフォルトの名無しさん:03/09/26 00:16
はやくいれちゃって!!!!!!!!!!!
999 :
デフォルトの名無しさん:03/09/26 00:17
もうがまんできないぃぃいIIIIIIIIいいいいい
!!!!!!!!!!!!!!!!!!!
もうだm、え
逝きそう
あっ、あっ、いっいっ
イ、イ
1000 :
デフォルトの名無しさん:03/09/26 00:18
イクッ〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。