-1

したがって、これはおそらく少し巨大で、おそらく面倒で不正確です (これは本当に初心者です)。私はちょうど C を学んでおり、私がしなければならない作業の一部には、このプログラムを C++ プログラムに切り替えることが含まれます。私がする必要がある主なことは、すべての構造体をクラスに置き換え、コードで使用されているすべての関数をクラス関数にすることです (メンバー? 思い出すと...)

私は多くの基本をかなりよく理解していますが、コンセプトはコードを「変更」することです。クラスに切り替えるだけで以前の作業を「変更」する方法がわかりません。そのままでは、クラスを使用するためにプログラムをかなり書き直す必要があるように感じます。多分私はここで単純さを逃しています。誰かに仕事をしてもらいたくありません。構造体をクラスとして機能するようにフォーマットする簡単な方法があるかどうか知りたいだけです。

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

//Struct for friend array pointers.
typedef struct friendstruct{
        char *firstname;
        char *lastname;
        char *homephone;
        char *cellphone;
} frnd;
//Buffer for use in storing in the main program.
typedef struct bufferstruct{
        char firstname[20];
        char lastname[20];
        char homephone[20];
        char cellphone[20];
} frndbuff;
//Add friend function.
void addfriend(frnd friendarray[], frndbuff newfrnd, int count, int opened){
     friendarray[count].firstname = malloc(sizeof(newfrnd.firstname));  //Assign memory before copying string.
     friendarray[count].lastname = malloc(sizeof(newfrnd.lastname));
     friendarray[count].homephone = malloc(sizeof(newfrnd.homephone));
     friendarray[count].cellphone = malloc(sizeof(newfrnd.cellphone));
     strcpy(friendarray[count].firstname, newfrnd.firstname);
     //printf("%s", friendarray[count].firstname);
     //printf("%s", newfrnd.firstname);
     strcpy(friendarray[count].lastname, newfrnd.lastname);
     strcpy(friendarray[count].homephone, newfrnd.homephone);
     strcpy(friendarray[count].cellphone, newfrnd.cellphone);
     //friendarray[count].lastname = newfrnd.lastname;
     //friendarray[count].homephone = newfrnd.homephone;
     //friendarray[count].cellphone = newfrnd.cellphone;

     if(opened==0){
     printf("\nA new friend has been added to the phonebook.");
     }
}
//Deleteing friends.
int deletefriend(frnd friendarray[], frndbuff newfrnd, int count){
     int n = 0;
     int success = 0;
     while(n<count){
           if(strcmp(newfrnd.lastname,friendarray[n].lastname)==0){ //Comparing strings.
                 while(n<count-1){
                                 strcpy(friendarray[n].firstname, friendarray[n+1].firstname);
                                 strcpy(friendarray[n].lastname, friendarray[n+1].lastname);
                                 strcpy(friendarray[n].homephone, friendarray[n+1].homephone);//Removes previously used position.
                                 strcpy(friendarray[n].cellphone, friendarray[n+1].cellphone);
                                 //friendarray[n].lastname = friendarray[n+1].lastname;
                                 //friendarray[n].homephone = friendarray[n+1].homephone;
                                 //friendarray[n].cellphone = friendarray[n+1].cellphone;
                                 n++;
                 }
           success = 1;
           count = count - 1;
           break;
           }
           n++;
     }      
           if(success==1){
           printf("\nThe entry for %s has been removed from the phonebook.", newfrnd.lastname);
           }else{
           printf("\nThat entry was not found");
           }
           //printf("%i", count);
return count;
}
//Show friend by last namme. Identical to delete friend, without removal.
void showfriend(frnd friendarray[], frndbuff newfrnd, int count){
     int n = 0;
     int success = 0;
     while(n<count){
           if(strcmp(newfrnd.lastname, friendarray[n].lastname)==0){
           printf("\n\n%s %s %s (home) %s (cell)\n", friendarray[n].firstname, friendarray[n].lastname, friendarray[n].homephone, friendarray[n].cellphone);                      
           success = 1;
           break;
           }
     n++;
     }

           if(success==0){
           printf("\nThat entry was not found");
           }
}
//DIsplays entire phonebook.
void phonebook(frnd friendarray[], int count){
     int n = 0;
     //printf("%i", count); Used in debugging.
     while(n<count){
     printf("\n%s %s %s (home) %s (cell)\n", friendarray[n].firstname, friendarray[n].lastname, friendarray[n].homephone, friendarray[n].cellphone);
     n++;
     }
}
//Find friend based on last name.
void searchfriend(frnd friendarray[], frndbuff newfrnd, int count){
     int n = 0;
     int success = 0;
     while(n<count){
           if(strcmp(newfrnd.lastname, friendarray[n].lastname)==0){
           printf("\n\n%s %s %s (home) %s (cell)\n", friendarray[n].firstname, friendarray[n].lastname, friendarray[n].homephone, friendarray[n].cellphone); 
           success = 1;                     
           }
     n++;
     }

           if(success==0){
           printf("\nThat entry was not found");
           }
}                        

int main(){
    int option, option2;
    frndbuff currentfriend;
    frnd friendarray[50];
    int count = 0;
    int filecount = 0;
    int opened = 0;
    //Phonebook load previous to main loop.
    printf("\nDo you have a previously saved phonebook you'd like to load?\n1) Yes\n2) No\n");
    printf("\nChoose an option : ");
    scanf("%i", &option2);
        if(option2==1){

                  FILE *fileopen;
                  fileopen = fopen("phonebook.dat", "r"); //File open for reading.
                  if (fileopen != NULL){
                               filecount = 0;
                               opened = 1;
                               printf("\nYour previous phonebook has been loaded : ");
                               while(fscanf(fileopen, "%s %s %s (home) %s (work)\n",&currentfriend.firstname, &currentfriend.lastname, &currentfriend.homephone, &currentfriend.cellphone)==4){
                                                      printf("\n%s %s %s (home) %s (work)\n",currentfriend.firstname, currentfriend.lastname, currentfriend.homephone, currentfriend.cellphone);
                                                      addfriend(friendarray, currentfriend, filecount, opened);
                                                      filecount++;
                               }
                               count = filecount;
                  }else if(fileopen == NULL){
                               printf("\nA previous phonebook could not be found.");
                  }
    }

while(1==1){



    opened = 0;                
    printf("\n\nPhone Book Application\n1) Add Friend\n2) Delete Friend\n3) Show a Friend\n4) Show phone book\n5) Search by last name\n6) Quit\n");    
    printf("\n\nWhat option would you like to choose : ");
    scanf("%i", &option);  
    //Option ensuring.
    if(option<1 || option>6){
                printf("\nYou did not enter a valid option, please try again.");
                option = 6;
    }

    if(option==1){
                  printf("\nFirst Name : ");
                  scanf("%s", &currentfriend.firstname);
                  printf("\nLast Name : ");
                  scanf("%s", &currentfriend.lastname);
                  printf("\nHome Phone : ");
                  scanf("%s", &currentfriend.homephone);
                  printf("\nCell Phone : ");
                  scanf("%s", &currentfriend.cellphone);
                  //printf("%s", currentfriend.firstname); Debugging.
                  addfriend(friendarray, currentfriend, count, opened);


                  count++;
                  //printf("%i", count); Debugging.
                  //All options call the previously made functions and pass the buffer.
    }else if(option==2){
                  printf("\nEnter the last name of the friend you'd like to delete : ");
                  scanf("%s", &currentfriend.lastname);
                  count = deletefriend(friendarray, currentfriend, count);
    }else if(option==3){
                  printf("\nEnter the last name of the friend you'd like to view : ");
                  scanf("%s", &currentfriend.lastname);
                  showfriend(friendarray, currentfriend, count);
    }else if(option==4){
                  phonebook(friendarray, count);
    }else if(option==5){
                  printf("\nEnter the last name you'd like to search : ");
                  scanf("%s", &currentfriend.lastname);
                  searchfriend(friendarray, currentfriend, count);
    }else if(option==6){
                  option2 = 0;
                  printf("\nWould you like to save your phonebook to a file?\n1) Yes\n2) No");
                  printf("\n Choose an option : ");
                  scanf("%i", &option2);
                  if(option2==1){
                                 filecount = 0;
                                 FILE *filesave;
                                 filesave = fopen("phonebook.dat", "w"); //File open for writing.
                                 while(filecount<count){
                                 //File written in the same method it is read.
                                 fprintf(filesave, "%s %s %s (home) %s (work)\n",friendarray[filecount].firstname, friendarray[filecount].lastname, friendarray[filecount].homephone, friendarray[filecount].cellphone);
                                 filecount++;
                                 }
                  }
                  printf("\nThank you for using this Phone Book Application!");
                  break;
    }
}
//Files closed.
fclose(fileopen);
fclose(filesave);
getch();
return 0;
} 
4

3 に答える 3

2

C++ との主な違いstd::stringは、生の文字配列の代わりに使用することです。malloc次に、 and を使用しませんfreestd::stringメモリ管理の責任を負わせるだけです。

同様にstd::vector、友達の保存には a を使用します。

また、i/o を C++ iostreams i/o に置き換えることもできます。これは、よりシンプルで安全です。

Bjarne Stroustrup は、小さな C プログラムを C++ に変換する方法を示す小さな紹介記事を書きました(「Learning Standard C++ as a New Language」、C/C++ Users Journal pp 43-54 May 1999)。

いくつかの C の方法を「学習せず」、より C++ 的な方法を採用する必要があります。:-)

于 2012-11-26T23:12:55.313 に答える
2

まず、C++ では、構造体とクラスの違いはほとんどありません。

クラスは、フィールド/メソッドがデフォルトでプライベートである構造体です。

struct Foo {
    //Content here
};

と同じです

class Foo {
public:
    //Content here
};

しかしもちろん、それは C++ クラスのすべての「優れた機能」を使用しているわけではありません。

  1. またはtypedef struct X { ... } Y;だけに置き換えます。C++ でそのような typedef を使用してもあまり意味がありません。struct X { ... }struct Y { ... };

  2. 「コードをクラスに変換する」という意味ではなく、「C 機能の代わりに標準の C++ クラスを使用する」という意味であれば、 replace char name[N]by std::string name;、 replace Type[]by std::vector<Type>(ベクトルを参照によって関数に渡すことを忘れないでください。参照渡しが何であるかを知りません-それを学びなさい、それは重要な概念です)。

  3. C++ 標準文字列を使用する場合、malloc/ free/strcpyは不要になります。strcpy(a, b);ただ使うのではなくa = b;

これらのヒントに従えば、コードは大幅に簡素化されると思います。次に、関数の一部が単純に不要になることがわかります。たとえば、addfriendおそらく に置き換えられvector.push_backます。

于 2012-11-26T23:17:35.393 に答える
0
  • std::stringandへの切り替えstd::vector<>は、既存の回答でよくお勧めします。
    • std::stringには値のセマンティクスがあります。つまり、単純==に文字列を比較=し、文字列に代入するために使用できます。
  • フレンド バフ クラスや構造体は必要ありません...どこでもフレンド クラスを使用するだけです。
  • Friend(firstname, lastname, homephone, cellphone)毎回明示的に各メンバーに割り当てる必要なく、 単純に を使用してインスタンスを作成できるように、コンストラクターを追加することもできます(ヒント - 「初期化リスト」を使用します)。
    • 値のセマンティクスがあるためstd::string(ポインターのようなものとは異なります)、コピー コンストラクターまたはデストラクタを作成して、文字列によって使用されるメモリを複製またはクリーンアップする必要はありません...すべて機能します。
  • 標準アルゴリズムを使用して、要素を削除するなどのことを行うことができますvector...すべて簡単にグーグルで検索したり、stackoverflowで見つけたりできます。
  • iostreams は、変数の型を指定せずに出力変数にコードを記述できることを意味します (printf() で指定する必要があります)。コンパイラは適切なコードを自動的に見つけます。あなたは#include <iostream>その後std::cout << variable << "string literals\n";などをする必要があります..
    • 入力を待っていなくても出力をすぐに表示したい場合を除き、std::endlorを使用する必要はありません。多くの C++ の書籍やチュートリアルなどでは.std::flush\nendl
于 2012-11-27T00:03:37.333 に答える