» »

[C] - Pointerji in ponovitve

[C] - Pointerji in ponovitve

RatedR ::

Pozdrav imam težavo in sicer rad bi napisal program, ki iz pointerja, ki je string izpiše črko ki se največkrat ponovi.
Znam dostopat do posameznega znaka:
char *pKazalec1 = "Primer besedila v pointerju";
char *pZnak1 = NULL;
    
pZnak1 = pKazalec1;
                 
while(*pZnak1)
{
         printf("%c", *pZnak1);
         pZnak1++;
         }

Ne vem pa kako naprej, sem probaval pa ne gre z lepa: http://pastebin.com/TGrebH7U

P.S: Ignoriraj stil pisanja kode, tako moramo pisat pri predavanjih.

BivšiUser2 ::

Že od srednje šole si poskušam predstavljati pointerje pa mi nekako ne "zlezejo" pod kožo. Sedaj jih jemljemo pri P2 oz. smo jih, že pa so mi še vedno kljub razlagi neka čudna stvar v programiranju. Razumem, da se vse vrti okoli direktnega dostopa do naslovov in so praktično edina možnost za dinamično (rastoče tabele) programiranje z low level jeziki za c in osnova za višje nivojske programske jezike. Problem je, da si jih nevem predstavljati, nevem zakaj obstajajo, če itak lahko ravno vse naredimo z navadnimi stavki za prireditev,... Skratka zna kdo kako to (zame) abstraktno stvar, predstaviti tako, da bo malo manj abstraktna?
SloTech - če nisi z nami, si persona non grata.

Uranij ::

Hm, naredi tole spodaj brez kazalcev

Pogoj:
Števke se morajo izračunat v posebni metodi.

#include <stdio.h>

int sestejVseStevkeVTabeli(int * Stevila, int DolzinaTabele);
void main()
{
	int Tabela[] = {1,2,3,4,5,6,7,8,9};
	
	printf("vsota vseh stevk je %d\n", sestejVseStevkeVTabeli(Tabela, 9));
}

int sestejVseStevkeVTabeli(int * Stevila, int DolzinaTabele)
{
	int * i, rezultat = 0;
	for(i = Stevila; i < (Stevila + DolzinaTabele); ++ i)
	{
		rezultat += * i;
	}
	
	return rezultat;
}


*Disclaimer: Ta koda ni ne lepa ne uporabna, pokaže pa moč pointerjev, če jo le razumeš.

BivšiUser2 ::

Hm, i je na zacetku tam v pomnilniku kjer je 1 in gre po naslovih do tistega kjer je 9, jih vse sešteje. Vsota je 45. Samo zakaj ni?
int Tabela[]={1,...,9};
int dolzina=9,rezultat=0;
for(int i=0;i<dolzina;i++)
{
 rezultat+=Tabela[i];
}
prinft("Rezultat: %d",rezultat);

Array v funkcije lahko prav tako lahko posreduješ.
int funkcija1(int f[], int rocno_vstavi_dolzino_ker_array_ni_objekt_v_cju)
{
//koda
}

Ne vidim konkretne razlike v zapisu.
SloTech - če nisi z nami, si persona non grata.

blindb ::

1 mozna varianta: naredi si array znakov in za vsak najden znak si povecaj vrednost tega znaka potem pa poisci tistega, ki ima najvecjo vrednost
2 mozna varianta: za vsak znak iz niza gres cez cel niz in si zapises v spremenljivko stevilo ponovitev tega znaka, znak, ki ima vec ponovitev kot jih ima prejsnji znak (vrednost pointerja) je potem tvoja resitev

sem pa preprican da je se ene 5 resitev (vsaj)
Mislim da bi morali uvesti davek na idiotizem.

windigo ::

BivšiUser2 je izjavil:

Skratka zna kdo kako to (zame) abstraktno stvar, predstaviti tako, da bo malo manj abstraktna?

Razlike med prenašanjem parametrov po vrednosti in po referenci verjetno poznaš. To so resnične abstrakcije, medtem ko so kazalci nižjenivojsko orodje, preko katerih je to lahko interno izvedeno. C pa je manj abstrakten jezik in ti namesto višjenivojskih jezikovnih abstrakcij daje na uporabo nižjenivojske (torej bližje dejanskemu delovanju računalnika) konstrukte, kazalce in vso prostost, da z njimi počneš kar hočeš (tudi velike neumnosti po naslovnem prostoru).

V primeru referenciranja neke spremenljivke, potrebuje pri implementaciji prevjalnik implicitno izračunati naslov spremenljivke ob klicu funkcije in to potem uporabiti povsod v funkciji pri računanju, v C-ju pa je ta naslov eksplicitno dostopen (in je eksplicitno norma ali celo nujno) prav preko kazalca na spremenljivko in se da kar s kazalcem samim (kar je lahko nevarno) tudi manipulirati.

Pri poljih in kazalci imaš v C-ju dualni pristop, polje je pravzaprav v C-ju samo kazalec na kos pomnilnika, kjer je (int[] polje; int indeks;) polje[indeks] ekvivalentno *(polje + indeks). In se da zato polja in kazalce kar mešati med sabo (prevajalnik bo verjetno tu nastreljal miljon opozoril). In to je skoraj vse (no, povrh še alokacijo prostora za polja fiksne dolžine na skladu ali med globalnimi spremenljivkami), kar ti na tem področju sam jezik C ponuja, vse ostalo moraš narediti sam, ali uporabiti kakšno bolj ali manj standardno knjižnico (malloc ipd). Sistem jezika je (če zraven ne šteješ standardnih knjižnic) tu res minimalen, jezik sam pa narejen za sistemsko programiranje na skoraj najnižjem nivoju.

Za domačo nalogo pa si lahko razložiš, zakaj C recimo ne omogoča enostavnega posredovanja polja po vrednosti kot parametra funkciji.

Skratka kazalci niso abstrakcija, so primitivni gradnik, na katerih so potem zgrajene druge abstrakcije, kot so polja in klici po referenci in objekti (virtualne funkcije so recimo (funkcionalno omejeni) kazalci na funkcije) in podobno.

P.S. C++ je neskončnokrat bolj zapleten jezik od C-ja, ki omogoča tudi delo z vsemi omenjenimi abstrakcijami, ohranja pa še vedno podobno majhen sistem jezika in če zares želiš tudi nizkonivojske zadeve. Vendar lahko praktično vse, kar lahko narediš v C++, narediš tudi v C-ju, seveda z veliko več izvorne kode in manj preverjanji prevajalnika.


Vredno ogleda ...

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

C# program za pretvorbo v desetiško število z rekurzijo

Oddelek: Programiranje
81368 (1091) MrStein
»

Java

Oddelek: Pomoč in nasveti
141284 (909) shadeX
»

C# (strani: 1 2 )

Oddelek: Programiranje
9711438 (8273) Ericssony
»

[C++] - Tolmačenje povedi in izvedba operacij nad števkami

Oddelek: Programiranje
353186 (2422) jernejl
»

[C++][Naloga_polja]MIN in MAX polja, izpis za x.100 stevil

Oddelek: Programiranje
222821 (2632) snow

Več podobnih tem