Strings Buchstaben vertauschen
-
@SeppJ sagte in Strings Buchstaben vertauschen:
Und die dritte Methode, im Vorhinein zu schätzen (oder den Worst case zu berechnen) ist auch nicht toll.
Das ist doch aber (leider) das Standardverfahren C.
Beistrcat
arbeitet man doch auch nicht anders.
-
@SeppJ sagte in Strings Buchstaben vertauschen:
Das ist von www.programmieraufgaben.ch, oder? (Das erklärt die ungewöhliche Wortwahl...)
Das kann gut sein, ein paar Aufgaben hatte ich schon von dort bekommen.
Hier ist das eine Hammeraufgabe für sehr Fortgeschrittene.
Na toll die Aufgabe kann ich leider nicht auslassen...
Daher freue ich mich über jede Unterstützung! Die Herausforderung liegt natürlich auch darin, dass ich den Code komprimiert darstellen MUSS! Wiederholungen zum Beispiel darf es nicht geben, die sollen zusammengefasst werden in einem Algorithmus.
Kann ich die Aufgabe nun mitstrstr
lösen?
-
Naja, du könntest hingehen und es eben keine allgemeingültige Stringersetzung schreiben. Deine Aufgabe gibt dir einige wenige vor. Auffällig ist, dass es immer ein-Zeichen und zwei-Zeichen Strings sind, damit kann man fast eben die beschriebene Worstcase Methode wählen.
Das ist unschön, aber würde der Aufgabe genüge tun.
-
@codinglea magst du mal deine Lösung(en) zu einer der anderen Aufgaben zeigen?
-
eigentlich musst du ja in str1 nur den ersten buchstaben von str2 suchen.
wenn du ihn gefunden hast, musst du überprüfen, ob alle weiteren buchstaben von str2 danach auch noch vorkommen.
wenn dem so ist, kopierst du alle buchstaben vor dem ersten auftauchen von str2 in einen puffer.
dann kopierst du alle buchstaben von str3 in den puffer.
danach kopierst du alle buchstaben von str1 nach dem letzten buchstaben von str2 in den puffer.
zum schluss kopierst du alle buchstaben aus dem puffer nach str1.
das ganze wiederholst du dann ab der stelle nach dem letzten buchstaben von str3 bis zum ende von str1.flussdiagramm erstellen und danach programmieren. wenn es dann funktioniert, musst du natürlich noch die fehlerbehandlung (zu wenig speicher usw.) umsetzen.
-
Das ist die Lösung der beiden vorherigen Aufgaben.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { printf("1. Variante\n"); // 1. Variante char string1[] = "Dies ist ein Test zur Kontrolle!"; char *pointer; int i; printf("Vorher: %s\n", string1); // Vorher for(i=0; string1[i]!='\0'; i++) // 'e' Entfernung & Zeichenkürzung { if(string1[i]=='e') { pointer = &string1[i+1]; string1[i] = 0; strcat(string1, pointer); } } printf("Nachher: %s\n\n", string1); // Nachher printf("2. Variante\n"); // 2. Variante char string2[] = "-Dies ist ein #toller #Test!-"; char *zeiger; int j; printf("Vorher: %s\n", string2); // Vorher for(j=0; string2[j]!='\0'; j++) { if(string2[j]=='#'||string2[j]=='!'||string2[j]=='-') // Sonderzeichen entfernt { zeiger = &string2[j+1]; string2[j] = 0; strcat(string2, zeiger); j--; } } printf("Nachher: %s\n\n", string2); // Nachher return 0; }
-
@Wade1234
Puh, das klingt ganz schön anspruchsvoll mit dem ganzen Hin und Her UND nach sehr viel Wiederholung, die ich wenn dann komprimieren muss.
-
@codinglea Deine 1. Variante kommt mit "ee" nicht klar, da wird immer nur eins gelöscht.
Und deine 2. Variante löscht nicht, wie in der Aufgabe vorgegeben, alle Sonderzeichen, sondern nur "#", "!" und "-"
-
Ohne
strcat
und auch inplace (und ungetestet):int j; for(i=0, j=0; string1[i]!='\0'; i++) // Zeichen Entfernung & Zeichenkürzung { if(string1[i]!='e') // if (isalpha(string1[i])) { string1[j] = string1[i]; j++; } } string1[j] = 0;
isalpha
ist in <ctype.h> deklariert.
-
@Schlangenmensch
Eine Lösung für alle Sonderzeichen weiß ich leider nicht.
-
Dann schau dir mal alle Funktionen aus ctype.h an (und kombiniere sie entsprechend).
-
@DirkB
Mit der Lösung kann ich ja aber nicht das 'en' mit dem 'x' tauschen...
-
@Th69
Dankeschön! Die Funktionen werde ich morgen direkt einbauen!
-
@codinglea naja eigentlich wurde ja schon angedeutet, dass man das nicht "mal eben so" macht, oder? aber wenn du es geschafft hast, bist du um eine erfahrung reicher und kannst dich aufgaben widmen, die noch anspruchsvoller sind und noch mehr hin und her und wiederholung haben.
aber eigentlich ist das eine äußere schleife mit einer inneren schleife, einer verzweigung, in der dann auch wieder schleifen sind usw. usf.. das kann man auch ganz toll in funktionen einpacken und schon ist das alles sehr übersichtlich. dafür malt man dann ja auch diese tollen flussdiagramme, weil man das (meistens) so im kopf gar nicht hinbekommt.
-
@Wade1234
Okay, danke! Ich werde mir morgen mal ein Flussdiagramm erstellen.
-
@codinglea sagte in Strings Buchstaben vertauschen:
@Wade1234
Okay, danke! Ich werde mir morgen mal ein Flussdiagramm erstellen.Naja. Programmieren mit Flussdiagrammen ist ziemlich 1980er...
Mag hier zwar ganz zweckmäßig sein, aber Zeichenketten als char-Arrays ist halt auch nicht ohne Grund aus der Zeit.
-
@SeppJ naja C wurde bei uns an der fh nur noch bei den ingenieuren gelehrt, während die informationstechniker java lernen mussten. das geschah / geschieht bestimmt nicht ohne grund. aber wenn man sich C als programmiersprache aussucht, muss man sich eben mit sowas wie flussdiagrammen abärgern.
-
Es steht ja noch bei der Mini-Kompression da, dass sowohl x->en als auch en->x vertauscht werden sollen. Da kannst du also nicht eine "normale" String-Replace-Funktion nutzen, sondern du musst gleichzeitig beide ersetzen, damit die Vertauschung reversibel bleibt.
Also in etwa so:
finde nächstes Vorkommen von x und von en (das ist das strstr), wähle davon das erste Wenn kein nächstes Vorkommen: kopiere den Rest des Strings und returne die Kopie kopiere den String bis vor das erste Vorkommen wenn x das Vorkommen ist: füge en der Kopie hinzu gehe 1 Zeichen weiter und ermittle nächstes Vorkommen von x sonst: füge x der Kopie hinzu gege 2 Zeichen weiter und ermittle nächstes Vorkommen von en ermittle wieder das nächstdichtere Vorkommen und gehe zum Wenn
So oder so ähnlich könntest du arbeiten. Wie gesagt sicherstellen, dass du genügend Platz für deinen Ausgabestring hast.
-
@Wade1234 sagte in Strings Buchstaben vertauschen:
@SeppJ naja C wurde bei uns an der fh nur noch bei den ingenieuren gelehrt, während die informationstechniker java lernen mussten. das geschah / geschieht bestimmt nicht ohne grund. aber wenn man sich C als programmiersprache aussucht, muss man sich eben mit sowas wie flussdiagrammen abärgern.
Man kann und sollte auch in C nicht in Ablaufdiagrammen denken. Aber der Threadersteller ist da sowieso noch ganz weit weg von, da erst einmal die Grundlagen her müssen. Daher: Ist ziemlich wurscht, wie er das genau macht. Aber er sollte im Kopf behalten, dass das letzte professionelle Flussdiagramm vor 50 Jahren gezeichnet wurde. Und das obwohl C auch heute noch eine beliebte Sprache ist
-
Hi!
vielleicht kannst du ja mal folgendes Beispiel ansehen( Ist ja bald der 11. 11te(hi)
zuerst der header spawchar.h#ifndef SWAPCHAR_INC #define SWAPCHAR_INC 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> int getch(); void Vorher(char string3[], int lge); void cleararray(char array[], int lge); int delstrchar(char quelle[], int xpos); int strfindstr(char aufgabe[], char gesucht[], int *sbeginn, int *sende); void STRITEIL(char *zfolge, char *erge, int beginn, int ende); #endif
Dann die dazugehörige Datei swapchar.cpp
#include "swapchar.h" /// reads from keypress, doesn't echo int getch(){ struct termios oldt, newt; int ch; tcgetattr( STDIN_FILENO, &oldt ); newt = oldt; newt.c_lflag &= ~( ICANON | ECHO ); tcsetattr( STDIN_FILENO, TCSANOW, &newt ); ch = getchar(); tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); return ch; } void Vorher(char string3[], int lge) { printf("Testlaenge: %d\n", lge); printf("Vorher.: %s\n", string3); printf(" 01234567890123456789012345678901234567890123456789012345678901234567890123456789\n"); printf(" | | | | | | | |\n"); } void cleararray(char array[], int lge) { int i; for(i = 0; i < lge; i++) array[i] = 0; } // Loescht aus einem c-String an xpos ein einzelnes char // Bei Erfolg Rueckgabewert = 0, sonst -1; int delstrchar(char quelle[], int xpos) { int wlen, i, rewer = -1; wlen = strlen(quelle); if ((xpos >= 0) && (xpos < wlen)) for( i = xpos; i < wlen; i++) { quelle[i] = quelle[i + 1]; rewer = 0; //printf("*"); } return rewer; } // Bei Erfolg einen Wert != -1 int strfindstr(char aufgabe[], char gesucht[], int *sbeginn, int *sende) { int lgegesucht, erge = -1; char *pch; lgegesucht = strlen(gesucht); //std::cout << "gesucht laenge: " << lgegesucht << std::endl; pch = strstr(aufgabe, gesucht); if(pch != NULL) { erge = pch - aufgabe + 1; *sbeginn = erge; *sende = erge + lgegesucht - 1; } return erge; } // Erstes Zeichen im String ist 0 drittes 2 // Beispiel: "Testeversuch" beginn = 4 ende = 6 // Ergebnis: eve void STRITEIL(char *zfolge, char *erge, int beginn, int ende) { int laenge, lge = 0; lge = strlen(zfolge); laenge = (ende - beginn) + 1; //printf("**beginn %d ende %d laenge %d\n", beginn, ende, laenge); if((beginn >= 0) && (beginn <= ende) && (ende < lge) && (laenge >= 1)) { strncpy( erge, zfolge + beginn, laenge); } //printf("erge %s\n", erge); }
Nun die main.cpp:
#include "swapchar.h" void strersatz(char string3[], char gesucht[], char ersatz[], char dummy[], char ergstr3[], int arlen) { int apos = -1, epos = -1, lge = 0, xpos; lge = strlen(string3); xpos = strfindstr(string3, gesucht, &apos, &epos); printf("gefunden apos: %d bis epos=%d\n", apos, epos); if (xpos != -1) { cleararray(ergstr3, 200); STRITEIL(string3, ergstr3, 0, (apos -2)); //printf("1 *ergstr3: %s\n", ergstr3); cleararray(dummy, arlen); STRITEIL(string3, dummy, epos, lge -1); //printf("**dummy: %s\n", dummy); strcat(ergstr3, ersatz); //printf("2 *ergstr3: %s\n", ergstr3); strcat(ergstr3, dummy); //printf("3 *ergstr3: %s\n", ergstr3); cleararray(dummy, arlen); } } int main(int argc, char **argv) { char string3[200] = {0}; char ergstr3[200] = {0}; char dummy[200] = {0}; char ersatz[200] = {0}; char gesucht[200] = {0}; int lge = -1; getch(); strcpy(string3, "Hallo, diese Nachricht wird ersetzt. Dieser Quelltext gehoert zu den Systemen."); lge = strlen(string3); Vorher(string3, lge); strcpy(gesucht, "diese Nachricht"); strcpy(ersatz, "deine Freundin"); printf("gesucht: %s\n", gesucht); printf("ersatz: %s\n", ersatz); strersatz(string3, gesucht, ersatz, dummy, ergstr3, 200); printf("Nachher: %s\n\n", ergstr3); strcpy(string3, ergstr3); lge = strlen(string3); Vorher(string3, lge); strcpy(gesucht, "wird ersetzt"); strcpy(ersatz, "hat dein ganzes Konto geplündert"); printf("gesucht: %s\n", gesucht); printf("ersatz: %s\n", ersatz); strersatz(string3, gesucht, ersatz, dummy, ergstr3, 200); printf("\nNachher: %s\n\n", ergstr3); strcpy(string3, ergstr3); lge = strlen(string3); Vorher(string3, lge); strcpy(gesucht, "Quelltext gehoert zu den Systemen"); strcpy(ersatz, "Brauch ist später in der Ehe Usus"); printf("gesucht: %s\n", gesucht); printf("ersatz: %s\n", ersatz); strersatz(string3, gesucht, ersatz, dummy, ergstr3, 200); printf("\nNachher: %s\n\n", ergstr3); return 0; } // Zeichen tauschen en&x, er&q, y&ch, a&e // Tauschoptionen für spaeter // string3[k]=='x' // string3[k]=='er' // string3[k]=='q' // string3[k]=='y' // string3[k]=='ch' // string3[k]=='a' //string3[k]=='e'
Gibt einen (für die meisten )lustigen Text aus...
Nix für unguat!