• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

Hilfe zu "Websms" Programm in C

pro-gamer

Gelegenheitsspieler/in
Mitglied seit
09.12.2003
Beiträge
350
Reaktionspunkte
0
Grüß euch!

Naja da ich auf der Uni mit einer Gruppe ein "Progrämmchen" programmieren muss und sich keiner so recht auskennt, weil wir vorher auf n Gymnasium gegangen sind, hab ich ein paar Fragen zu einem Programm.
Und zwar soll es einen beliebig langen Text einlesen, diesen in Blöcke zu 160 Zeichen zerteilen (okay das hätten wir noch geschafft), aber es darf nur nach einem vollendeten Wort VOR den 160 zeichen zerteilt werden.
Dann soll das Programm ausgeben wieviele SMS gebraucht werden, wieviele Zeichen benötigt werden und nach jedem "Block" eine Reihe bindestriche machen.
Bei keiner eingabe oder bei Eingabe eines ASCII codes über 127 soll eine Fehlermeldung ausgegeben werden.
Also wir gehen bis jetz so vor, dass wir das einlesen und dann in einen string speichern und dann die größe dieses Strings angeben!
ach ja bitte hier KEINE FERTIGEN SOURCEFILES reinschreiben, sondern nur Ideen. Wenn jemandem wirklich fad is, oder ein ähnliches sourcefile hat bitte per PM. Sonst könnts passieren dass wir fliegen ;) .
Danke mal im vorraus
schönen tag noch mfg hoerm
 
Der einfachste, aber auch langsamste Weg wäre natürlich jeden Buchstaben einzeln zu zahlen, und mit einer Ascii Tabelle zu vergleichen.

Code:
if buchstaben_array[a] => 127 then ... else ...

Ansonsten ist es doch recht einfach, man liest 160 Zeichen ein & schaut, ob das aktuelle Zeichen ein Leerzeichen ist, oder ein Buchstabe. Wenn es ein Buchstabe ist den Zahler um eins verringern und wieder schauen, Buchstabe oder Leerzeichen. Das ganze so lange, bis man ein Leerzeichen hat. Dann nimmt man Zähler_Anfang bis Zähler_Ende und speichert diese Buchstaben Folge wieder in ein separates Array. Am Ende zählst du halt einfach nur wieviele 'Arrays' du dafür benötigt hast. Ein Array mit max. 160 Zeichen = eine SMS.
 
Rabowke am 30.10.2008 14:09 schrieb:
Der einfachste, aber auch langsamste Weg wäre natürlich jeden Buchstaben einzeln zu zahlen, und mit einer Ascii Tabelle zu vergleichen.

Code:
if buchstaben_array[a] => 127 then ... else ...

Ansonsten ist es doch recht einfach, man liest 160 Zeichen ein & schaut, ob das aktuelle Zeichen ein Leerzeichen ist, oder ein Buchstabe. Wenn es ein Buchstabe ist den Zahler um eins verringern und wieder schauen, Buchstabe oder Leerzeichen. Das ganze so lange, bis man ein Leerzeichen hat. Dann nimmt man Zähler_Anfang bis Zähler_Ende und speichert diese Buchstaben Folge wieder in ein separates Array. Am Ende zählst du halt einfach nur wieviele 'Arrays' du dafür benötigt hast. Ein Array mit max. 160 Zeichen = eine SMS.
Danke! :X :top: :top: :top: dann werdn wir uns gleich mal ranschmeissen!
 
pro-gamer am 30.10.2008 13:51 schrieb:
Grüß euch!

Naja da ich auf der Uni mit einer Gruppe ein "Progrämmchen" programmieren muss und sich keiner so recht auskennt, weil wir vorher auf n Gymnasium gegangen sind, hab ich ein paar Fragen zu einem Programm.
Und zwar soll es einen beliebig langen Text einlesen, diesen in Blöcke zu 160 Zeichen zerteilen (okay das hätten wir noch geschafft), aber es darf nur nach einem vollendeten Wort VOR den 160 zeichen zerteilt werden.
Dann soll das Programm ausgeben wieviele SMS gebraucht werden, wieviele Zeichen benötigt werden und nach jedem "Block" eine Reihe bindestriche machen.
Bei keiner eingabe oder bei Eingabe eines ASCII codes über 127 soll eine Fehlermeldung ausgegeben werden.
Also wir gehen bis jetz so vor, dass wir das einlesen und dann in einen string speichern und dann die größe dieses Strings angeben!
ach ja bitte hier KEINE FERTIGEN SOURCEFILES reinschreiben, sondern nur Ideen. Wenn jemandem wirklich fad is, oder ein ähnliches sourcefile hat bitte per PM. Sonst könnts passieren dass wir fliegen ;) .
Danke mal im vorraus
schönen tag noch mfg hoerm
Hmmm ich kenn mich mit C ehrlich gesagt relativ wenig aus (die Sprache ist einfach gruselig ^^), aber ein paar Stichwörter kann ich schon vorschlagen.

- Das Prüfen auf ungültige Zeichen würde ich ganz am Anfang machen wenn noch alles in einem String drinsteckt und bevor da irgendwas aufgeteilt wird.

- Das Auftrennen in Blöcke würde ich in einer for-Schleife machen, welche über die Anzahl der Zeichen im vollständigen String läuft. Einfach zwei Pointer nehmen: einer der immer auf das aktuelle Zeichen zeigt, einer der immer auf das letzte Leerzeichen (Worttrenner = Ende letztes Wort) zeigt. Wenn der erste Pointer an 160. Stelle steht schauen ob das ein Leerzeichen ist, und dann entsprechend aufteilen (entweder vom Index des 1. Pointers oder vom Index des 2. Pointers aus).

- Alternativ: schauen was C an Tokenizer bereitstellt, welche das oben Beschriebene automatisch machen können (in Java/C# wäre das z.B. "foo bar".Split(" ");).

- Das Speichern der Blöcke würde ich in einer Liste machen (in Java/C# wäre das eine ArrayList, ka was C da zur Verfügung stellt). Auf jeden Fall eine dynamische Datenstruktur, da der eingelesene Text ja beliebig lang sein soll. Je nachdem ob man das Laufzeitverhalten noch optimieren soll, das Anfügen der Bindestriche sofort beim Auftrennen des Strings machen, oder dann halt in einer 2. Schleife für alle einzelnen Blöcke nach dem Auftrennen.

- Das Mitzählen der benötigten Kurzmitteilungen/Zeichen ist ja relativ einfach durch Variablen zu realisieren, welche einfach in den Schleifen inkrementiert werden.
 
Naja irgendwie sind wir mit dem nicht weitergekommen. Die eingabe passt nur bei der unterteilung und bei den errors haperts! kann jemand der sich in C auskennt bitte sagen wie ich das mit den unterteilungen und den errors am besten lösen kann?
glg
 
Ich weiß nicht wieviel man für C ändern müsste, aber in C++ hab ichs mal programmiert:

Code:
#include <string>
#include <iostream>

using namespace std;

void main() {
	
	char temp;
	bool fehler = false;
	string teststring;
	while (teststring.length() == 0) {
		cout << "Bitte geben Sie den aufzuteilenden Text ein: \\n";
		getline(cin, teststring);
		if (teststring.length() == 0) {
			cout << "Fehler! Kein Text eingegeben.\\n\\n";
		}
	}
	
	for (int a = 0; a < teststring.length(); i++) {
		if (teststring[a] > 127) {
			cout << "Ascii Zeichen ueber 127 in Eingabe enthalten: " << teststring[a] << "\\n";
			fehler = true;
		}
	}

	if (!fehler) {
		int count = (teststring.length() / 160) + 1;
		cout << "\\nWahrscheinliche Anzahl an benoetigter SMS: " << count << "\\n\\n";

		string *test;
		test = new string[count+5];

		int counter = 0;

		while (teststring.length() > 160) {
			for (int a = 159; a >= 0; a--) {
				if (teststring[a] == ' ') {
					test[counter] = teststring.substr(0,i);
					teststring.erase(0,i);
					counter++;
					break;
				}
			}
		}

		test[counter] = teststring;
	
		for (int a = 0; a < count; a++) {
			cout << "SMS 1:\\n" << test[a] << "\\n\\n";
		}
	}

	system("pause");

}

Ist zwar teilweise unschöner Programmierstil (das break; und system("pause") am Ende), aber funktioniert. Hab grad erstmal gemerkt wie schnell man das Zeug verlernt, hab schon ewig nix mehr in C++ gemacht ;)
Was jetzt noch zu Problemen führen würde, wäre wenn jemand einen Text eingibt der über 160 Zeichen ohne Leerstelle enthält, da gäb es ne Endlosschleife. Dazu füg ich da noch keine Bindestriche ein und momentan bleibt beim Teilen das Leerzeichen am Anfang des Strings stehen, dass könnte man auch noch rauswerfen.

Edit: Mmh, die Forensoftware verhaut die Backslashes, überall da wo \\ steht sollte lediglich ein einzelner Backslash sein.
 
Kleiner Fehler der mir aufgefallen ist, die Ausgabe am Ende müsste so aussehen:
Code:
for (int a = 0; a < counter; a++) {
			cout << "SMS " << a << ":\n" << test[a] << "\n\n";
}

Wichtig ist vor allem, dass er bis counter geht und nicht bis count. In count steht nämlich nur die vorher errechnete Anzahl die durchaus falsch sein kann, wenn einige sehr lange Wörter vorkommen und man ungünstig aufteilen muss.
 
Zurück