Hilfe bei Programm



  • Hallo an alle! Ich brauche unbedingt Hilfe für folgende Aufgabe. Ich studiere Wirtschaftsingenieurwesen im zweiten Semester und muss diese Pflichtübung machen, um zur Prüfung zugelassen zu werden. Natürlich sollte ich mich selbst hinsetzen und es nicht von anderen machen lassen, aber ich bekomme es nicht hin und da die Prüfung erst in 8 Wochen ist, habe ich noch genug Zeit. Da Info nur ein "Nebenfach" ist, haben wir gerade die Grundkenntnisse von C++ besprochen, deswegen sollten eventuelle Tipps auch für mich "verständlich" sein. Wäre wirklich nett, wenn mir jemand weiterhelfen könnte...

    Aufgabenstellung:

    In der Datei ss07.in sind nach dem unten links abgedruckten Muster Vor- und Nachnamen einer nicht vorherbestimmten Anzahl von Personen abgespeichert. Schreiben Sie ein Programm, das aus dieser Datei die Namen einliest und sortiert in die Datei ss07.out schreibt. Dabei ist alphabetisch nach den Nachnamen und bei gleichen Nach- nach den Vornamen zu sortieren

    Beispiel:
    Inhalt der Datei ss07.in:
    Vorname: Susanne Nachname: Schneider
    Vorname: Max Nachname: Mueller
    Vorname: Rene Nachname: Ewaldt
    Vorname: Silke Nachname: Koenig
    Vorname: Olav Nachname: Mueller
    Vorname: Sandra Nachname: Schneider
    Vorname: Lars Nachname: Becker
    Vorname: Roland Nachname: Beyer
    Vorname: Maria Nachname: Koenig

    Inhalt der Datei ss07.out:
    Lars Becker
    Roland Beyer
    Rene Ewaldt
    Maria Koenig
    Silke Koenig
    Max Mueller
    Olav Mueller
    Sandra Schneider
    Susanne Schneider

    Ist in der Datei ss07.in eine Zeile fehlerhaft, so ist dies in der Datei s07.out nach dem im folgenden abgedruckten Muster zu melden, die oben angegebene Sortierung ist nur auf den bis dahin korrekt gelesenen Daten auszuführen:

    Inhalt der Datei ss07.in:
    Vorname: Susanne Nachname: Schneider
    Vorname: Max Nachname: Mueller
    Vorname: Rene Nachname: Ewaldt
    Vorname: Silke Nachname: Koenig
    Vorname: Olav Nachname: Mueller
    Vorname: Nachname: Schneider
    Vorname: Lars Nachname: Becker
    Vorname: Roland Nachname: Beyer
    Vorname: Maria Nachname: Koenig

    Inhalt der Datei ss07.out:
    Fehler in Zeile 6!
    Rene Ewaldt
    Silke Koenig
    Max Mueller
    Olav Mueller
    Susanne Schneider

    Bemerkungen/Tipps:
    1. Sind in ss07.in mehrere Zeilen fehlerhaft, braucht dies nicht berücksichtigt zu werden!
    2. Mögliche Fehlerarten in ss07.in:
    (a) Die Textbausteine Vorname: oder Nachname: sind fehlerhaft geschrieben.
    (b) Vor- und/oder Nachnamen fehlen.
    3. Für die alphabetische Sortierung die Funktion strcmp(...) aus der Bibliothek string.h verwenden!



  • Ein Schnorrer steht im Forum ganz still und stumm.
    Gibt sich'nen Mädchennamen, hält uns für dumm.
    Sagt, wer mag der Schnorrer sein,
    der da schreibt in's Forum rein,
    mit dem Mädchenna-ame-en süß und klein ?

    Der Schnorrer steht im Forum ganz ohne Fleiß,
    und hofft auf gute Noten wo er nichts weiß.
    Sagt, wer mag der Schnorrer sein,
    der da schreibt in's Forum rein,
    will den lauen Le-enz mit dem Wissen mein ?



  • Wo ist denn jetzt dein Problem? 😕



  • Simon2 schrieb:

    Ein Schnorrer steht im Forum ganz still und stumm.
    Gibt sich'nen Mädchennamen, hält uns für dumm.
    Sagt, wer mag der Schnorrer sein,
    der da schreibt in's Forum rein,
    mit dem Mädchenna-ame-en süß und klein ?

    Der Schnorrer steht im Forum ganz ohne Fleiß,
    und hofft auf gute Noten wo er nichts weiß.
    Sagt, wer mag der Schnorrer sein,
    der da schreibt in's Forum rein,
    will den lauen Le-enz mit dem Wissen mein ?

    🙂 Entsprang das gerade deiner Kreativität ?



  • Wie weit bist du denn? Wo kommst du nicht weiter?
    Du glaubst nicht im Ernst, dass sich hier einer für dich hinsetzt und deine Hausaufgaben komplett macht?!?!?!

    Wenn du wirklich keine Ahnung hast, wie du anfangen sollst, dann schau doch mal was dein Programm machen muss:

    nämlich:
    1. Daten einlesen und etwaige Fehler registrieren
    2. (fehlerlose) Daten sortieren
    3. Daten ausgeben

    Das ganze nur noch in C++ - Code übersetzen und fertig, so schlimm ist das nicht.



  • Die Sortierung hab ich mit dem Bubble-Sort Verfahren gemacht und das funktioniert auch, nur wie der Fehler erkannt werden soll und die Datei danach ausgegeben werden soll krieg ich nicht hin



  • Die Ausgabe ist ganz einfach:

    std::copy( vec.begin(), vec.end(), std::ostream_iterator< std::string >( bar, "\n" ) );
    

    Wenn du einen std::vector< std::string > hast der die Daten hält und bar vom Typ std:ostream ist. 😉

    Fehler erkennst du indem du einfach prüfst ob "Nachname: ", "Vorname: " und die korrekten Namensangaben vorhanden sind.



  • Leider ist das eine Methode, die wir noch nicht im geringsten besprochen haben. Es würde auffallen, wenn ich es auf die Weise abgeben würde. Wie gesagt, so viel haben wir wirklich noch nicht gemacht. Trotzdem danke!



  • Jenni_243 schrieb:

    Leider ist das eine Methode, die wir noch nicht im geringsten besprochen haben.

    Genau! Du hast nämlich (zumindest) das falsche Subforum ausgewählt. Der Grund dafür steht in Deiner Aufgabenstellung; hat was mit strcmp(...), <string.h> und "++" zu tun.

    Zeig doch ruhig mal Deinen Code mit dem Du ja schon so weit vorangekommen bist!

    Grüsse

    *this



  • Naja ... Gast++ ... nicht ganz richtig. Dein Professor oder wer auch immer dir diese Aufgabe gestellt hat @Jenni, hat sich die vollkommene Blöße gegeben. Seine Aufgabe ist, zumindest was 3 betrifft, mit dem Kursthema wiedersprüchlich ... es sei denn ihr habt von ihm einen Header string.h bekommen ^^

    => #include <cstring> => std::strcmp ... kannst ihn ja mal fragen, was er dazu meint 😃



  • (D)Evil schrieb:

    Naja ... Gast++ ... nicht ganz richtig.

    Bestenfalls unentscheidbar. Bei dem etwas naiv anmutenden Vorgehen der OP halte ich die Hypothese "Er macht erstmal C-Grundlagen und sie hat es nicht mitgekriegt" für plausibler.
    Die frühe Behandlung vopn Bubblesort würde zu solch einem Vorgehen passen.

    Grüsse

    *this



  • Hier, mit strcmp: 😃 Alle Punkte erfüllt, oder? 😉

    [ironie]

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include <fstream>
    #include <stdexcept>
    #include <boost/format.hpp>
    
    namespace str_utils
    {
    	inline std::string& trim( std::string& value, char delim = ' ' )
    	{
    		std::string::size_type pos;
    
    		pos = value.find_last_not_of( delim );
    
    		if ( pos != std::string::npos )
    		{
    			value.erase( pos+1 );
    			pos = value.find_first_not_of( delim );
    
    			if ( pos != std::string::npos )
    			{
    				value.erase( 0, pos );
    			}
    		}
    		else
    		{
    			value.clear();
    		}
    
    		return value;
    	}
    }
    
    class simple_parser
    {
    public:
    	typedef std::string::size_type size_type;
    
    	struct parse_error 
    		: public std::exception
    	{
    		parse_error( int line ) throw()
    		{
    			message = boost::str( boost::format( "Fehler in Zeile %1%" ) % line );
    		}
    
    		~parse_error() throw()
    		{}
    
    		const char* what() const throw()
    		{
    			return message.c_str();
    		}
    
    	private:
    		std::string message;
    	};
    
    	class entry
    	{
    	public:
    		entry( const std::string& _name, const std::string& _nachname )
    			: name( _name )
    			, nachname( _nachname )
    		{}
    
    		bool operator!() const
    		{
    			return ( name == "" || nachname == "" );
    		}
    
    		bool operator<( const entry& rhs ) const
    		{
    			int i = strcmp( nachname.c_str(), rhs.nachname.c_str() );
    			return ( i == 0 ? ( strcmp( name.c_str(), rhs.name.c_str() ) < 0 ) : ( i < 0 ) );
    		}
    
    		friend std::ostream& operator<<( std::ostream& out, const entry& e )
    		{
    			return ( out << e.name << ' ' << e.nachname );
    		}
    
    	private:
    		std::string name;
    		std::string nachname;
    	};
    
    	simple_parser( std::ifstream& _stream, bool auto_close = true )
    		: stream( _stream )
    		, line( 0 )
    		, close( auto_close )
    	{}
    
    	~simple_parser()
    	{
    		if ( close && stream.is_open() )
    			stream.close();
    	}
    
    	void parse( std::vector< entry >& container )
    	{
    		if ( !stream )
    			throw simple_parser::parse_error( -1 );
    
    		std::string tmp;
    		line = 0;
    
    		while ( stream.good() )
    		{
    			std::getline( stream, tmp );
    			++line;
    
    			size_type p1 = tmp.find( "Vorname: " );
    			size_type p2 = tmp.find( "Nachname: " );
    
    			if ( p1 == std::string::npos ||
    				p2 == std::string::npos )
    			{
    				throw simple_parser::parse_error( line );
    			}
    
    			p1 += 9;
    			entry new_entry( str_utils::trim( tmp.substr( p1, p2-p1 ) ), str_utils::trim( tmp.substr( p2+10 ) ) );
    
    			if ( !new_entry )
    			{
    				throw simple_parser::parse_error( line );
    			}
    
    			container.push_back( new_entry );
    		}
    	}
    
    private:
    	std::ifstream& stream;
    	int line;
    	bool close;
    };
    
    struct sorter
    	: public std::binary_function< simple_parser::entry, simple_parser::entry, bool >
    {
    	bool operator()( const simple_parser::entry& e1, const simple_parser::entry& e2 ) const
    	{
    		return ( e1 < e2 );
    	}
    };
    
    int main()
    {
    	std::ifstream foo( "ss07.in" );
    	std::ofstream bar( "ss07.out" );
    	std::vector< simple_parser::entry > vec;
    
    	if ( !foo || !bar )
    	{
    		std::cout << "Fehler beim oeffnen der Datei" << std::endl;
    		return 0;
    	}
    
    	simple_parser parser( foo );
    
    	try
    	{
    		parser.parse( vec );
    	}
    	catch ( const simple_parser::parse_error& e )
    	{
    		bar << e.what() << std::endl;
    	}
    
    	std::sort( vec.begin(), vec.end(), sorter() );
    	std::copy( vec.begin(), vec.end(), std::ostream_iterator< simple_parser::entry >( bar, "\n" ) );
    	bar.close();
    
    	std::cin.get();
    }
    

    [/ironie]



  • @David_pb: Hast du dich neuerdings mit Swordfish befreundet 😃



  • KasF schrieb:

    @David_pb: Hast du dich neuerdings mit Swordfish befreundet 😃

    lol 😉



  • KasF schrieb:

    ...
    🙂 Entsprang das gerade deiner Kreativität ?

    Jupp. Ist mir gerade (bzw. inzwischen gestern) aus der Tastatur gesprungen. 😃

    Gruß,

    Simon2.



  • David_pb schrieb:

    KasF schrieb:

    @David_pb: Hast du dich neuerdings mit Swordfish befreundet 😃

    lol 😉

    😃 😃 😃

    *duck 'n run*

    greetz, Swordfish


Anmelden zum Antworten