c in c++



  • Hey!
    habe ein problem,ich habe ein c programm geschrieben und muss es jetzt in c++ umschreiben,habe aber noch nie irgendwas mit c++ gemacht...
    SORRY,das ist jetzt ein bischen viel aber ich hab keinen plan und bekomme fehlermeldungen die ich nicht verstehe...das createbook soll ein konstructor werden,wäre nett wenn mir jemand zeigt wie vieleicht der konstructor und die insert() aussehen sollte,müsste den rest dann selber schaffen..hoffe ich...die main.cpp hab ich soweit geändert,das alle printf und scanf std::cout<< und std::cin>> sind...Danke!!!doch nicht mehr so viel musste nen teil löschen...sind jetzt nur noch create und insert drin...
    main.c

    #include "phonebook.h"
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
        int i;
    	char *p, name[30], num[20];
    	phoneBook_t *mybook;
    
        if( (mybook = createBook()) == NULL) {
    		//perror dient zur ausgabe einer fehlermeldung
    		//der text in klammern wird um die interne fehlermeldung ergänzt
    		perror("malloc");
    		return 0;
    	} 
    
    	//insert(mybook, "Jan", "2345");	
    	//insert(mybook, "Lena", "6789");	
    	//insert(mybook, "Bo", "1290");	
    
        while(1) {
    		puts("\t1: Eingabe");
    		puts("\t0: QUIT\n");
    
    		scanf("%d",&i); fflush(stdin);
    
    		switch(i) {
    				case 0:
    					destroyBook(mybook);
    				return 0;
    				case 1:
    					printf("Name: ");
    					scanf("%29s",name); fflush(stdin);
    					printf("Nummer: ");
    					scanf("%19s",num); fflush(stdin);
    					insert(mybook, name, num);		
    				break;
    
    		}
        }
    
    	return 1;
    }
    

    phonebook.c

    #include "phonebook.h"
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    phoneBook_t *createBook()
    {
    	phoneBook_t *mybook;
    	//malloc gibt einen void pointer zurück,oder NULL wenn der speicher nicht verfügbar ist.
        mybook = (phoneBook_t *)malloc(sizeof(phoneBook_t));
    	//mybook->name = *mybook.name 
    	mybook->pnext = NULL;
    	return mybook;
    }
    
    //gesamtes buch loeschen
    void destroyBook(phoneBook_t *book){
    	phoneBook_t *next;
    	if(book->pnext == NULL) {
    		free(book);
    		return;
    	}
    	while(book->pnext != NULL) {
    		next = book;
    		book = book->pnext;
    		free(next);
    	}
    }
    
    //buch einlesen und erweitern
    void insert(phoneBook_t *book, char *name, char *num)
    {	
       phoneBook_t *entry;
    	//wenn das !=0 ist der name schon da
        if(search_name(book, name)) {
    		printf("Name ist schon gespeichert\n");
    		return;
    	}
    
        if( (entry = (phoneBook_t *)malloc(sizeof(phoneBook_t))) == NULL){
    		perror("malloc");
    		return;
        }
    	//strncpy aequivalent zu strcpy,jedoch werden hoechstens n zeichen uebertragen
        strncpy(entry->name, name, 30);
        strncpy(entry->num, num, 20);
    	entry->pnext = NULL;
    
       while(book->pnext != NULL)
    		book = book->pnext;
        book->pnext = entry;
    }
    
    //sucht ob es den namen schon gibt
    int search_name(phoneBook_t *book, char *name){
    	if(book->pnext == NULL) 
    		return 0;
    	else 
    		while(book->pnext != NULL) {
    			//strcmp vergleicht die zeichenfolge
    			if(!strcmp(book->name,name)) 
    				return 1;
    			book = book->pnext;
    		}
    	if(!strcmp(book->name,name)) 
    		return 1;
    	else 
    		return 0;
    }
    
    }
    

    phonebook.h

    struct phoneb {
        char name[30];
        char num[20];
        struct phoneb *pnext;
    };
    
    typedef struct phoneb phoneBook_t;
    
    phoneBook_t *createBook();
    void insert(phoneBook_t *book, char *name, char *num);
    char *getNumber(phoneBook_t *book, char *name);
    char *getName(phoneBook_t *book, char *num);
    void delete_it(phoneBook_t *book, char *name);
    void destroyBook(phoneBook_t *book);
    void list_book(phoneBook_t *book);
    int search_name(phoneBook_t *book, char *name);
    


  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo Steffi,

    ich hoffe du kuckst dir den Code hier gut an, damit du deine Hausaufgaben
    das nächste mal alleine machen kannst... 😉

    main.cpp:

    #include "phonebook.h"
    
    #include <iostream>
    #include <string>
    #include <conio.h>
    
    int main(void){
     	try{
    	 	PhoneBook book;
    	 	char my_char = 0;
    		// ersetzt createBook(), falls nicht möglich wird ne Exception geworfen
    
    	    book.insert("Jan", "2345");   
    	    book.insert("Lena", "6789");   
    	    book.insert("Bo", "1290");   
    
    	    do {
    	        std::cout << "\t1: Eingabe";
    	        std::cout << "\t0: QUIT" << std::endl;
    
    			my_char = _getch(); 
    	        switch(my_char) {
    	                case '1':
    	                    std::cout << "Name: ";
    						std::string name;
    	                    std::cin >> name;
    	                    std::cout << "Nummer: ";
    						std::string nummer;
    	                    std::cin >> nummer;
    	                    const PhoneBookEntry* entry = book.searchName(name);
    	                    if(entry == 0)
    	                    	book.insert(name, nummer);
    						else
          						std::cout << "Name existiert bereits " << entry->getNumber() << std::endl;
          						//std::cout << "Name existiert bereits " << *book.getNumber(name) << std::endl;
    	        }
    	    } while(my_char != '0');
    		// Destruktor von PhoneBook wird automatisch aufgerufen,
    	    // da auf dem Stack  
    	} catch(const std::exception& e){
    	  	std::cerr << "Es ist ein Fehler aufgetreten" << std::endl;
    	}
        return 1;
    }
    

    phonebook.cpp:

    #include <list>
    #include <string>
    
    class PhoneBookEntry{
    friend class PhoneBook;
    
    public:
    	PhoneBookEntry(const std::string& name, const std::string& number);
    	~PhoneBookEntry();
    
    	const std::string& getName() const;
    	const std::string& getNumber() const;
    
    private:
    	std::string name;
    	std::string number;
    
    };
    
    class PhoneBook{
    
    public:
    	PhoneBook();
    	~PhoneBook();
    
    	void insert(const std::string& name, const std::string& number);
    	const std::string* getNumber(const std::string& name) const;
    	const PhoneBookEntry* searchName(const std::string& name) const; // null wenn nicht vorhanden
    
    	std::list<PhoneBookEntry> list;
    };
    

    phonebook.cpp:

    #include "phonebook.h"
    
    PhoneBook::PhoneBook(){
    }
    
    PhoneBook::~PhoneBook(){
    }
    
    void PhoneBook::insert(const std::string& name, const std::string& number){
    	list.push_back(PhoneBookEntry(name, number));
    }
    
    const std::string* PhoneBook::getNumber(const std::string& name) const{
    	const PhoneBookEntry* entry = searchName(name);
    	if(entry==0)
    		return 0;
    	else
    		return &entry->number;
    }
    
    const PhoneBookEntry* PhoneBook::searchName(const std::string& name) const {		
    	for(std::list<PhoneBookEntry>::const_iterator it = list.begin(); it!=list.end(); ++it){
    		if(it->name == name)
    		 return &(*it);
    	}
    	return 0;
    }
    
    PhoneBookEntry::PhoneBookEntry(const std::string& name, const std::string& number)
    	:name(name), number(number){
    }
    
    PhoneBookEntry::~PhoneBookEntry(){
    }
    
    const std::string& PhoneBookEntry::getName() const{
    	return name;
    }
    const std::string& PhoneBookEntry::getNumber() const{
    	return number;
    }
    

    Ich hoffe, das hilft dir weiter...
    Würde mich freuen, wenn du zu Teilen, die du nicht verstehst auch Rückfragen stellst.

    EDIT: getline ersetzt.

    Gruß,
    CSpille



  • wow danke!!
    ja mach ich,ich muss das ganze programm bis freitag fertig haben,bis dahin werde ich also fragen zum code schicken,leider ist c++ noch ein böhmisches dorf,vorallem wenn man als erstes so eine aufgabe bekommt...leider ist das keine hausaufgabe sonst würd ich die spontan nicht machen...

    das was ich geschickt habe ist nur ein teil von meinem code der rest sieht so aus das ich namen bzw nummern eingebe und der mir nummer bzw name ausgibt,der muss noch einzelne namen+nummern löschen und eine gesammte liste erstellen...also hab ich noch ein bischen vor mir...
    also bis hier erst mal danke!!!!



  • so,ich habe schon ein paar fragen...
    wofür steht das getline()
    getline(std::cin, nummer);

    wofür steht in dem zusammenhang das &
    PhoneBookEntry::PhoneBookEntry(const std::string& name, const std::string& number)

    warum hast du zwei klassen gamacht?
    class PhoneBook{
    class PhoneBookEntry{

    und was ist eine friend class?
    friend class PhoneBook;

    kann ich die ganzen funktionen zu einer funktion insert zusammen schließen?

    void insert(const std::string& name, const std::string& number);
        const std::string* getNumber(const std::string& name) const;
        const std::string& getName() const;
        const std::string& getNumber() const;
    

    meine headerdatei war wohl ein bischen doof reingestellt...

    void insert(phoneBook_t *book, char *name, char *num);
    

    soll namen und nummern einlesen und in search_name suchen ob es den namen schon gibt..

    char *getNumber(phoneBook_t *book, char *name);
    

    soll zu einem gegebenen namen die nummer suchen

    char *getName(phoneBook_t *book, char *num);
    

    soll zu einer gegebenen nummer den namen suchen

    void delete_it(phoneBook_t *book, char *name);
    

    einzelnen wert löschen

    void destroyBook(phoneBook_t *book);
    

    ganze buch löschen

    void list_book(phoneBook_t *book);
    

    buch auflisten

    int search_name(phoneBook_t *book, char *name);
    

    wird von insert aufgerufen soll nach doppelten namen suchen..

    weiteres folgt...



  • Steffi... schrieb:

    so,ich habe schon ein paar fragen...
    wofür steht das getline()
    getline(std::cin, nummer);

    Wie der Name schon sagt - hole eine Zeile. Das ist die C++ Alternative zu fgets().

    wofür steht in dem zusammenhang das &
    PhoneBookEntry::PhoneBookEntry(const std::string& name, const std::string& number)

    Übergabe per Referenz.

    warum hast du zwei klassen gamacht?
    class PhoneBook{
    class PhoneBookEntry{

    PhoneBook für ein komplettes Array, PhoneBookEntry für einen einzelnen Eintrag.

    und was ist eine friend class?
    friend class PhoneBook;

    Das ist eine Klasse, die auf die privaten Member zugreifen darf.

    kann ich die ganzen funktionen zu einer funktion insert zusammen schließen?

    void insert(const std::string& name, const std::string& number);
        const std::string* getNumber(const std::string& name) const;
        const std::string& getName() const;
        const std::string& getNumber() const;
    

    Wohl kaum - insert() fügt einen Eintrag, die anderen Methoden suchen nach bestehenden Einträgen.



  • ja danke!!
    dann werde ich wohl weiter probieren müssen...



  • HMm @CStoll ... nja fgets nicht ganz, da du ja nicht so einfach mit fopen zugriff auf die Consolenausgabe bekommst 😉 Wäre nen anderer stream angegeben, der dann bsw. ein file-stream wäre, dann wäre wohl fgets die C-Variante. Da hast de recht 😉



  • (D)Evil schrieb:

    HMm @CStoll ... nja fgets nicht ganz, da du ja nicht so einfach mit fopen zugriff auf die Consolenausgabe bekommst 😉

    Was will mir das jetzt sagen?
    fgets() bekommt ein FILE*, getline() einen istream (die C++ Entsprechung zu FILE* (für Eingabe-Dateien). Mit beiden kannst du von Tastatur (stdin bzw. cin - das mußt du übrigens auch nicht per open() der Konsole zuweisen) lesen, wenn du willst. Von daher ist getline() durchaus die logische Entsprechung zu fgets().



  • so ich hab noch ne frage in c gibt es //strcmp vergleicht die zeichenfolge
    gibt es sowas auch für strings(nicht für char) habe nichts in büchern gefunden

    kann man//copy anstelle für strncpy(strncpy nur für CHAR??) mit dem selben problem...

    wie schreib ich das in c++:

    printf("name:%6s nummer:%6s\n",inhalt->name,inhalt->number);
    

    kann man das?

    das wär es jetzt erst mal...Danke!

    denke bin der lösung meines programms nahe...hoffe ich...



  • joa kann man ...

    std::cout << "name: " << std::setw(6) << inhalt->name << " nummer: " << std::setw(6) << inhalt->number << std::endl;
    

    kann man//copy anstelle für strncpy(strncpy nur für CHAR??) mit dem selben problem...

    hmm ganz einfach ... die String-Klasse hat dafür nen operator:

    std::string s1("Das ist toll!");
    std::string s2 = s1;
    

    ...

    so ich hab noch ne frage in c gibt es //strcmp vergleicht die zeichenfolge
    gibt es sowas auch für strings(nicht für char) habe nichts in büchern gefunden

    String-Klasse(std::string) hat auch dafür nen operator (==) ...

    std::string s1("Das ist toll!");
    std::string s2 = s1;
    
    if (s1 == s2)
        std::cout << "\"" << s1 << "\" == \"" << s2 << "\"" << std::endl;
    


  • Danke sehr!!!

    habe schon wieder was neues...

    ich bekomme die fehlermeldung
    error C2451: Bedingter Ausdruck des Typs 'std::string' nicht zulässig

    und es wird dann dahin gezeigt...

    void PhoneBook::listbook(){
    	while(inhalt->next == NULL) {
    /*diese zeile..*/	if(inhalt->name)
    				inhalt = inhalt->next;
    				//cout << "name: " << std::setw(6) << inhalt->name << std::endl;
    				//cout<< " nummer: " << std::setw(6) << inhalt->number << std::endl;
    		}
    

    }

    weiß nicht wie ich das richtig machen muss...
    Danke!!



  • Nja du musst schon gucken auf was er testen soll ... aber auf if (inhalt->name == "") zu testen ... was soll das bringen?

    if (inhalt->name == "") /* an stelle von if (inhalt->name) */
    

    ... aber wo ist der Sinn?!



  • aber ist es in c nicht so,dass es das gleiche ist?
    if(inhalt->next == NULL){}
    if(inhalt->next){}

    habe es in meinem programm jetzt geändert aber dann bekomm ich nen haufen fehler ...
    error C2676: Binärer Operator '!=': 'std::string' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht

    error C2784: 'bool std::operator !=(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)': Vorlagenargument für 'const T1 *' von 'std::string' konnte nicht hergeleitet werden

    error C2784: 'bool std::operator !=(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)': Vorlagenargument für 'const T1 *' von 'int' konnte nicht hergeleitet werden

    error C2784: 'bool std::operator !=(const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &,const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &)': Vorlagenargument für 'const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &' von 'std::string' konnte nicht hergeleitet werden

    und noch viele mehr alle zeigen auf die selbe zeile...
    und die meisten auch mehrmals...



  • ? Also

    if(inhalt->next == NULL)
    

    würde folgendem entsprechen

    if(!inhalt->next)
    

    ...

    Da inhalt->name aber ein std::string und kein char* (bzw. überhaupt Zeiger) ist, kannst du schlecht auf NULL prüfen. Du musst prüfen ob der string leer ist.

    if (inhalt->name.empty() == true) // er ist leer!
    // if (inhalt->name.empty()) /* ist das selbe als wenn du auf true prüfst */
    

    ...



  • danke es läuft soweit,naja es kommen keine fehler meldungen mehr...
    meine Exception wirft sofort aus das es den namen schon gibt...
    also mal schaun wo ich in der search den fehler eingebaut habe...

    DANKE!!!



  • hab schon das nächste...

    void PhoneBook::insert(string name,string number){
    	element *eintrag;
    	if(search(name)){
    		throw xinsert();
    		return;
    	}
    	inhalt->name=name;		
        inhalt->number= number;
    	inhalt->next = NULL;
    
       while(eintrag->next != NULL)
    		eintrag = inhalt->next;
    		eintrag->next = eintrag;
    }
    

    warum gibt er mir ne warnung aus das er eintrag nicht kennt
    warning C4700: Lokale Variable 'eintrag' wurde ohne Initialisierung verwendet



  • nja das geht nicht was du da hast. Du musst "eintrag" auch auf was zeigen lassen ... momentan zeigt er ins Nirvana ...



  • aber wenn ich mit der maus auf eintrag->next gehe zeigt er mir das eintrag ein element*eintrag ist, und next element*element::next;ihm sind doch alle bekannt??



  • Ja er kennt die Variablen ... das ist klar. Aber du kannst ja nicht auf irgend eine Stelle im Speicher zeigen und erwarten das du da was verändern darfst!


Anmelden zum Antworten