Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Reprezentarea in memorie a unui sir de caractere  (Citit de 1704 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
ionutzm05
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 5



Vezi Profilul
« : Noiembrie 22, 2012, 14:24:41 »

Salut,
Astazi am avut teza la informatica. Am primit o problema banala, pe care am rezolvat-o cred eu corect :
"Se citeste de la tastatura un sir de caractere (doar litere mici). Sa se modifice litera de la inceputul fiecarui cuvant in litera mare."
Rezolvarea mea suna astfel :
Cod:
//declarare, citire sir
for(i=0;i<strlen(s);i++)
  if(s[i-1]==' ' || s[i-1]==NULL)
     s[i]=toupper(s[i])
Problema este ca, pentru a rezolva si primul cuvant din propozitie am pus conditia || s[i-1]==NULL, deoarece inaintea primei litere nu se afla nimic, adica NULL.
Dupa ce i-am explicat profesoarei modul meu de rezolvare a problemei mi-a spus ca este complet gresit, desi eu am demonstrat ca rezolvarea mea este corecta. Motivatia ei a fost faptul ca s[-1] este in afara zonei de memorie si ca este o simpla coincidenta faptul ca am gasit NULL pe s[-1].
Nu sunt de acord, deoarece am verificat si am observat ca un sir de caractere este delimitat intotdeauna de NULL, mai exact pe s[-1] intotdeauna va exista NULL.
Ce parere aveti? Este gresita rezolvarea mea?
Multumesc!
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #1 : Noiembrie 22, 2012, 14:33:28 »

In primul rand, nu mai parcurge niciodata un sir de caractere folosind strlen() deoarece vei avea complexitatea O(N^2), functia apelandu-se la fiecare iteratie. Modul corect este acesta:

Cod:
int length = strlen(s);
for (int i = 0; i < length; ++i) {
    ...
}

In al doilea rand, profesoara ta are dreptate, motivatia ei este complet valida.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
ionutzm05
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 5



Vezi Profilul
« Răspunde #2 : Noiembrie 22, 2012, 14:37:36 »

Spune-mi te rog atunci, de ce urmatorul cod afiseaza mesajul "Este NULL!"?
Cod:
#include <string.h>
#include <iostream>
using namespace std;

int main()
{
    char s[100]="test";
    if(s[-1]==NULL)
      cout<<"Este NULL!";
    else
      cout<<"Nu este NULL!";
    return 0;
}
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #3 : Noiembrie 22, 2012, 14:39:59 »

Spune-mi, te rog, de ce urmatorul cod afiseaza mesajul "Nu este NULL!"?

Cod:
#include <string.h>
#include <iostream>
using namespace std;

int main()
{
    char t = 3, s[100]="test";
    if(s[-1]==NULL)
      cout<<"Este NULL!";
    else
      cout<<"Nu este NULL!";
    return 0;
}
Memorat
ionutzm05
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 5



Vezi Profilul
« Răspunde #4 : Noiembrie 22, 2012, 14:41:53 »

Ok, am inteles dar totusi, in problema pe care ea a formulat-o se declara un singur sir de caractere. Atat!

EDIT: Sa zicem ca eram la olimpiada (bineinteles ca nu se da o asemenea banalitate la olimpiada, dar ca idee). Eu cu acest cod luam tot 100 puncte, desi sustinem ca este incorect, si altul cu o rezolvare corecta lua tot 100 puncte.
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #5 : Noiembrie 22, 2012, 14:47:31 »

Un singur sir de caractere, dar n-a zis nimic de alte variabile. Chiar daca prin noroc se nimereste sa iti fie buna rezolvarea, de regula incearca sa eviti chestii dubioase de genul asta. Mult mai simplu era sa verifici daca i > 0.
Memorat
ionutzm05
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 5



Vezi Profilul
« Răspunde #6 : Noiembrie 22, 2012, 14:52:00 »

Am inteles si sunt de acord. Nu voi mai folosi astfel de metode. Dar nu sunt de acord sa fiu depunctat pentru o problema care functioneaza corect!
Din ce am observat, s[-1] nu mai este NULL doar in cazul in care se mai declara si alte caractere sau siruri de caractere. In cazul numerelor (declarare de tip int, float, double) acestea nu afecteaza programul.
Memorat
klamathix
Echipa infoarena
Nu mai tace
*****

Karma: 733
Deconectat Deconectat

Mesaje: 1.216



Vezi Profilul
« Răspunde #7 : Noiembrie 22, 2012, 17:31:17 »

Privesti problema gresit. Profesorul nu e online judge. Daca pateai chestia asta la Olimpiada, intr-adevar, nu-ti lua nimeni din punctele pe care le-ai fi primit. Insa pe un profesor il intereseaza mai mult mijloacele decat scopul. Chiar era mult mai important pentru el (si pentru tine) sa admiti ca s[-1] e o idee proasta decat faptul ca s-ar putea sa functioneze in anumite cazuri dubioase si izolate.
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #8 : Noiembrie 23, 2012, 14:51:45 »

s[-1] nu este doar o idee proasta, este una complet gresita. Faptul ca C nu face bounds checking si te lasa sa te uiti in memorie nealocata de program e cu totul alta poveste.

Sursa ta are un comportament nedefinit. La rulari diferite poate sa dea rezultate diferite: uneori merge, alteori crapa. Doar pentru ca tie iti da raspunsul dorit nu inseamna ca programul este corect.
« Ultima modificare: Noiembrie 23, 2012, 16:10:31 de către Andrei Grigorean » Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines