(つД`)C/C++の宿題は私にやらせてよ!Ver12

このエントリーをはてなブックマークに追加
952950:03/09/24 22:36
たぶん数値計算をよく知ってる人からみれば論外なコードだと思います。
演算順序の考慮等ご指摘いただければ幸いです。
でもさ,この課題は制度とかそういう事じゃないでしょ?
精度だごめん
精度が良い順に成績が付きます
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
答えてあげたいけど、ねえさんなので答えられません。
>>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;
}
つーか>>962滅茶苦茶だ。
967964:03/09/25 00:26
あ,違った
=定義してるんだからStringを引数に取るコンストラクタは〜ってのが言いたかった
で,見直したらそのコンストラクタないし
>>962
str = new char[str.length()+1];

my_str = new char[str.length()+1];
にすれば動くんじゃないの?
strcpy(my_str, str);

↑はうごかんな
>>956-969
#define String std::string
でいいだろ。
ヒソヒソ (-[^-]*-[^-]*)-([^-]*)-([^-]*)-(.*)
初心者な問題なのですが、任意のファイルを読み込んで、
内容は同じだが名前が違う別のファイルを作成する
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;
}
976972:03/09/25 12:46
>>975
>>953

御礼が遅くなりました。
本当に助かります。
ありがとうございました。
>>975
fgetcを使えよアホ
>>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をつかうとどう書けますか?
>>977
fgetcよりfread使った方がいいと思うぞ
987956:03/09/25 22:06
懇切丁寧な回答ありがとうございましたっ
ここで受けたご恩は、他の誰かにきっと伝えやす。Mr.ペイ・フォワード
>>986
普通fgetcだろ
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なんて使わない
>>988
何でバッファを使わないんだ
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
イクッ〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。