» »

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:

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 ()

black ice ::

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
#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 ()

darkkk ::

Ma to mora narest po 20 let starih učnih načrtih. Brezveze :P

Miko55 ::

Najlepša hvala !

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:
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:

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…

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Brisanje znaka iz stringa

Oddelek: Programiranje
5975 (878) mm1992

[C#]polje znakov

Oddelek: Programiranje
112371 (2199) Ziga Dolhar
»

Programski jezik C- pomoč

Oddelek: Programiranje
61695 (1613) alexa-lol
»

[C++] urejanje nizov po velikosti

Oddelek: Programiranje
82277 (2058) Matako
»

Vmesnik v Javi

Oddelek: Programiranje
142260 (2043) Camel

Več podobnih tem