Imi trebuie ajutor la informatica, va rog sa ma ajutati cu 2 exercitii:
Tipul de date Tablou(array):
Într-un tablou 2. N de găsit suma numerelor pozitive, şi de-o afişat la ecran.
Tipul de date sir de caractere (string):
Să se elaboreze programul ce triplează fiecare literă în cuvăntul dat
Rokky231user (0)
Pentru problema 2:
Ar fi important de stiut pe viitor faptul ca sirurile de caractere nu sunt nimic altceva decat niste vectori. Diferenta consta in faptul ca sunt vectori de octeti si nu de integeri. Char-urile in memorie sunt reprezentate pe 8 biti. Pe de alta parte mai au si corespondent in ASCII, lucru care de obicei e mai putin relevant cand scrii un program.
Pascal din cate am observat salveaza lungimea sirului ca numar, pe pozitia 0 a sirului. Astfel el citeste prima oara de pe pozitia 0, cate caractere are sirul, iar apoi il parcurge caracter cu caracter. C pe de alta parte nu face asta. Sirul propriuzis porneste de pe pozitia 0 numai ca apare terminatorul de sir la final(un byte plin de 0 cu corespondent in ASCII ca ‘\n’) ca sa stie cand sa opreasca parcurgerea sirului.(Au fost numeroase probleme de securitate si cu o astfel de abordare).
De aceea in acest program scris in pascal in acel for, cand parcurgi sirul trebuie sa pornesti de pe pozitia 1 pentru ca acolo se afla de fapt primul caracter. Byte(s[0]) doar returneaza valoarea scrisa pe pozitia 0 a sirului. Valoare care este de fapt lungimea lui(offset).
Nu as fi de acord cu o astfel de abordare a structurii sirurilor. De fiecare data cand lungimea sirului se modifica trebuie updatata pozitia 0. Lucru destul de enervant.
Se mai poate face si asa:
Varianta 2 pare mai buna.
Motivele ar fi ca in primul rand folosim mai putina memorie, deoarece lucram pe un singur sir, nu pe doua, memoria necesara fiind mai mica cu (lungimea sirului dat) octeti.
De asemenea in a doua varianta se foloseste functia Concat de (lungime sir) ori iar in prima varianta se foloseste de 3*(lungime sir) ori.
Deci considerand functia concat ca fiind omogena pentru ambele variante s-ar putea spune ca a 2-a varianta este de 3 ori mai buna ca resurse de calcul si consuma mai putina memorie.
Insa, trebuie luata in considerare si functia insert care in esenta Shifteaza o bucata a stringului mai spre dreapta cu 2 octeti la fiecare iteratie.
Cat de laborioasa este aceasta actiune la fiecare iteratie(si este destul de laborioasa), pusa in balanta cu apelarea de mai multe ori a lui Concat, ramane de calculat. De asemenea trebuie luat in considerare update-ul lui s[0] care se face dupa fiecare apel al lui concat si insert.
Dat fiind faptul ca enuntul cere triplarea caracterului in cuvant, atunci varianta 2 este cea corecta.
Si, desigur, ultima varianta:
Aceasta varianta este cea mai eficienta dintre cele 3, d.p.d.v al procesarii. Nu am mai avut timp sa o comentez. Este oarecum similara cu prima varianta, diferenta consta in faptul ca se citeste pur si simplu element cu element din stringul pe care trebuie sa-l triplam, si intr-un alt string punem de 3 ori elementul curent.
Am alocat 50 de octeti stringului rezultat. Ideal ar fi fost sa alocam 3*s[0] numai ca nu am stiut exact cum sa fac asta in pascal. Poti da un search pe google eventual. Succes!
Problema 1 cu siguranta o poti face singur.