Forum » Programiranje » C++ lažja naloga
C++ lažja naloga
Miko55 ::
Pozdravljeni !
Imam nalogo: če uporabnik vnese nor: Juuhu huoo ! Potem naj program odstrani črke ki se ponavljajo zaporedoma (v tem primeru u in o). Trenutno mam jaz narejeno tako:
Ampak zdaj je fora v tem da uporabnik vnaša vsako črko posebej,kar pa ni dobro. Moralo bi bit da naenkrat vnese celotno besedilo,stavek. Ampak če to naredim potem ne vem razdeliti stavek na polja oz. polja črk da bi potem preverjal.
Hvala za pomoč-
LP
Imam nalogo: če uporabnik vnese nor: Juuhu huoo ! Potem naj program odstrani črke ki se ponavljajo zaporedoma (v tem primeru u in o). Trenutno mam jaz narejeno tako:
using namespace std; int main () { char polje[5]; for (int i=0;i<5;i++) { cin>>polje[i]; } for(int i=0;i<=5;i++) { if(polje[i]==polje[i+1]) continue; else cout<<polje[i]; } return 0; }
Ampak zdaj je fora v tem da uporabnik vnaša vsako črko posebej,kar pa ni dobro. Moralo bi bit da naenkrat vnese celotno besedilo,stavek. Ampak če to naredim potem ne vem razdeliti stavek na polja oz. polja črk da bi potem preverjal.
Hvala za pomoč-
LP
- spremenil: Miko55 ()
Miko55 ::
Se pravi da se dela z stringi. Hvala za link,ampak sem v 2 letniku pa,mi še nismo vzeli stringov pa bi zdaj prosil za kodo,pa da potem probam dojet kako deluje. Nalogo sem dobil kot dodatno z tekmovanja.
darkkk ::
Ok če se hočeš it mazohizem, pol narediš tako:
#include <iostream> #define MAX_STRING_SIZE 100 int main(void) { char *s = new char[MAX_STRING_SIZE]; std::cout << "vpisi niz:"; gets(s); std::cout << "vpisani niz:" << s << std::endl; int i = 0; int j = 0; char *s2 = new char[MAX_STRING_SIZE]; while(s[i] != '\0') { if(s[i] == s[i+1]) i++; else { s2[j++] = s[i++]; } } s2[j] = '\0'; std::cout << s2 << std::endl; delete s; delete s2; system("pause"); return 0; }
black ice ::
Tudi branje dokumentacije spada k programiranju.
Najprej
Edit: Lepotni popravki.
Najprej
#include <string>Do posameznega elementa stringa dostopaš isto kot do elementa polja. Dolžino stringa dobiš z
imestringa.length()Poglej si še erase, append oz. push_back ter replace.
Edit: Lepotni popravki.
Zgodovina sprememb…
- spremenilo: black ice ()
mojca ::
Tudi če se še niste učili stringov, si dobil namig, katero snov lahko preučiš sam. Na spletu je veliko virov in tutorialov. Ni potrebe, da bi čakal na svojega učitelja.
Je pa naloga rešljiva tudi brez stringov. Samo nekaj komentarjev. Tvoj niz ima pet znakov z indeksi od 0 do 4. Potem pa testiraš, če je polje[4] == polje[5] in polje[5] == polje[6]. Obe primerjavi sta neveljavni in bi utegnili voditi k sesuvanju programa. Prav tako skušaš izpisati polje[5], ki ne obstaja.
Če uporabljas ta (sicer C-jevski) podatkovni tip, je za začetek bolje uporabiti malenkost daljši niz kot samo 5 znakov. Poleg tega je smiselno uporabiti null-termination, kar pomeni, da je zadnji znak 0 in da mora biti niz vsaj za eno polje daljši od vsebine (dolžine besede/stavka ...). Primer:
Podatke lahko bereš s scanf, gets, getline, ... Nekaj odgovorov na temo, kako to narediti "varno" v C-ju, je tu: http://stackoverflow.com/questions/4309...
Seveda je še kup drugih rešitev, s tipom "string" ali brez. Želela sem samo izpostaviti nekaj napak v kodi.
Je pa naloga rešljiva tudi brez stringov. Samo nekaj komentarjev. Tvoj niz ima pet znakov z indeksi od 0 do 4. Potem pa testiraš, če je polje[4] == polje[5] in polje[5] == polje[6]. Obe primerjavi sta neveljavni in bi utegnili voditi k sesuvanju programa. Prav tako skušaš izpisati polje[5], ki ne obstaja.
Če uporabljas ta (sicer C-jevski) podatkovni tip, je za začetek bolje uporabiti malenkost daljši niz kot samo 5 znakov. Poleg tega je smiselno uporabiti null-termination, kar pomeni, da je zadnji znak 0 in da mora biti niz vsaj za eno polje daljši od vsebine (dolžine besede/stavka ...). Primer:
char polje[1000]; ... // branje podatkov // ... // ce imas null-terminated string, ti to vrne dolzino unsigned int dolzina = strlen(polje); for(int i=0; i<dolzina; i++) { // namesto i<=5 if(polje[i]==polje[i+1] && i<dolzina-1) // paziti moras, da ne gres cez indeks, ceprav je zadnji znak zdaj itak 0 continue; else cout<<polje[i]; }
Podatke lahko bereš s scanf, gets, getline, ... Nekaj odgovorov na temo, kako to narediti "varno" v C-ju, je tu: http://stackoverflow.com/questions/4309...
Seveda je še kup drugih rešitev, s tipom "string" ali brez. Želela sem samo izpostaviti nekaj napak v kodi.
mojca ::
Mimogrede: cout sam po sebi je zelo počasen (na tekmovanjih včasih prepovedo uporabo :). Če izpisuješ vsak znak posebej, pa je še toliko huje. Funkciji putc ali printf("%c", polje[i]) sta hitrejši, še vedno pa je verjetno nekoliko bolje, če string spremeniš in ga izpišeš v celoti naekrat, kot npr. darkkk-jeva rešitev.
Zgodovina sprememb…
- spremenila: mojca ()
technolog ::
Kok ste vsi zakomplicirali.
Saj ima C (oz. OS) tudi input buffer, tako da komot nardiš s cin >> char ali pa getc(), le prejšnjo črko si moraš hranit (da veš, da je duplikat). Pet vrstic:
Namesto na STDOUT bi lako pisali tudi v polje.
Saj ima C (oz. OS) tudi input buffer, tako da komot nardiš s cin >> char ali pa getc(), le prejšnjo črko si moraš hranit (da veš, da je duplikat). Pet vrstic:
int main(int argc, char* argv[]) { char c, prej = 0; while(1) { cin >> c; if (prej != c) cout << (prej = c); } }
Namesto na STDOUT bi lako pisali tudi v polje.
Zgodovina sprememb…
- spremenil: technolog ()
Yacked2 ::
Še primer v phpju
<?php $niz = 'Juuhoo'; //niz ki ga obdelujemo $a = str_split($niz); //niz razbijemo na posamezne črke v array for($i =0; $i< count($a)-1; $i++) //sprehodimo se po tem arrayu od prvega do predzadnjega mesta { if($a[$i] != $a[$i+1]) //če se črka na i-tem položaju in črka za njo nista enaki jo zapišemo v array { $output[] = $a[$i]; } } $zadnja = $a[count($a)-1]; //to je zadnja črka, ki smo jo v for zanki izpustili, ker ni možnosti da bi se črka za njo ponovila $output[] = $zadnja; //dodamo to črko v array echo implode('',$output); //združimo array v niz in ga izpišemo ?>
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] Brisanje znaka iz stringaOddelek: Programiranje | 975 (878) | mm1992 |
⊘ | [C#]polje znakovOddelek: Programiranje | 2371 (2199) | Ziga Dolhar |
» | Programski jezik C- pomočOddelek: Programiranje | 1695 (1613) | alexa-lol |
» | [C++] urejanje nizov po velikostiOddelek: Programiranje | 2277 (2058) | Matako |
» | Vmesnik v JaviOddelek: Programiranje | 2260 (2043) | Camel |