Hogyan kéne megcsinálni c++ban?
Egy számítógép szövegszerkesztője úgy romlott el, hogy minden végzárójel gépelésekor megfordította a zárójelben lévő szöveg. Példa: "Ez a szoveg (satnor osle) elrontotta (kidosam) a szamitogep (kidamrah a tti) szovegszerkesztoje" Írjon egy algoritmust, amely kijavítja az elromlott szöveget. (Bemenete az elrontott szöveg, és kimenete a kijavított szöveg) Írjon egy programot amely megvalósítja a fenti algoritmust.
Teljesen elkadtam, elindulni sem tudom ... Algoritmus beadandó lenne... c++ban meg kell írni, utána algoritmusban is.. algoritmusban c++ alapján már könnyű, de nemtudom megírni c++ba, nincs hozzá elengedő tudás.. vermekkel kéne megcsinálni ... Azt mondták elvileg egyszerű, de számomra nem. Valaki tudna valamit segíteni?
metanyelven:
lesz egy tömböd, amibe a megfordítandó szöveget töltöd fel
lesz egy zarojelben_vagyok_e:Boolean típusú változód
egy nagy for ciklus, ami végigveszi a kapott szöveget
cikluson belül lesz 4 ellenőrzésed
if(aktualis_karakter == "("), akkor a boolean változót true értékre állítod, valamint az eredeti szövegbe raksz valami jelzést, hogy ide majd megy a megfordított tömb. ez az ellenőrzés megy leghátra, hogy magát a zárójelet ne tegye be a megfordítandó szöveg tömbbe
if(zarojelben_vagyok_e == true), akkor az aktuális karaktert betölti a tömbbe. ez lesz sorrendben a 3. elágazás
if(aktualis_karakter == ")"), akkor a boolean változót false-ra állítja, majd a mostanra feltöltött tömböt megfordítod. azt meg hadd ne magyarázzam el :) ezután a kész tömböt beilleszted a korábbi jelzés helyére. ez lesz sorrendben a 2. ellenőrzés
végül if(aktualis_karakter == NULL (vagy hasonló)), akkor kiír, kilép, és öröm és bódottá
c++ba már te írod meg, addig is tanulsz és gyakorolsz
Először az algoritmust szokták kitalálni aztán kódolnak. Esetleg menet közben javítanak az algoritmuson ha kiderül hogyha nem jó ...
A bemeneti fájlt tekintsük egy (szállító)szalagnak melyről egyesével sorba jönnek az input szimbólumok (a karakterek).
Legyen egy állapot változónk melynek 2 állapota van :
normál: Ekkor az atuális bemeneti szimbólum egyből a kimentre kerüljön
vermes: ekkor egy verembe kerüljön az aktuális karakter
pszeudokód: [link]
Így hátha érthetőbb [link] , az előbb a "kimentre ')'" sor lemaradt és kezdetben állapot=normál. Így már jó, ha minden megfelelő '('-nek van ')' párja.
"Azt nem értem, hogy a kijavított szavak, hogy kerüljenek vissza a zárójelen belüli részre"
Amíg nem jön '(' addig a bemeneti karaktereket a kimenetre írom. Utána amikor '(' karakter jön akkor az utána jövő karaktereket egy verembe rakom, amikor ')' karakter jön a kimentre írok egy '('-t utána a verem tartalmát kiírom a kimenetre és utána ')' karaktert írok és (ha van) az ez utáni karaktereket a kimentre írom kivéve ha nem '(' karakter jön.
Mj: A veremből fordított sorrendbe lehet kivenni az elemeket mint ahogy belekerültek.
Megoldottam. Forráskód:
#include <iostream>
#include <string>
using namespace std;
char javit(char szoveg[]);
int main()
{
char szoveg[] = "Ez a szoveg (satnor osle) elrontotta (kidosam) a szamitogep (kidamrah a tti) szovegszerkesztoje";
puts(szoveg);
javit(szoveg);
cout<<endl; system("pause"); return 0;
}
char javit(char szoveg[])
{
int i=0,j=0,k=0,l;
while(szoveg[i]!='\0')
{
i++;
}
char *tmb;
tmb=new char[i];
char *tmb2;
tmb2=new char[i];
i = 0;
int m=0,si=0; bool zaro=false;
while(szoveg[i]!='\0')
{
if(szoveg[i]=='(')
{
zaro=true;
cout<<szoveg[i];
}
if(szoveg[i]==')')
{
zaro=false;
//cout<<endl<<"si:"<<si<<endl;
for(k=si; k>1; k--)
cout<<tmb[k];
si=0;
}
if(zaro)
{
si++;
tmb[si]=szoveg[i];
//cout<<"tmb[si]: "<<tmb[si]<<endl;
i++;
}
else {
cout<<szoveg[i]; i++;}
}
cout<<endl;
for(int i=0; i<j; i++) cout<<tmb[i];
return 0;
}
@02:59
Pedig veremmel sokkal egyszerűbb és rövidebb.Egyszerűbb ráadásul hogy csak meg kellett volna írni, már az ötletet a "poént" leírtam.
A te megoldásod nem teljes mert nem fájlból olvas. Előbb még a fájlt be kell "rántani" a többe, a tömbök méretét megfelelő méretűre kell állítani beleértve a segéd tömböket is.
Én is megoldottam, ez sem fájlból olvas hanem billentyűzetről enterig, de átírni semmiség, getchar-t getc-re kel cserélni és még néhány sorral kell kiegészíteni/módosítani a kódot. Még az a szépsége hogy mindig csak annyi memóriát használ amennyi szükséges.
Felraktam ide: [link]
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!