Problema string

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
poke
Junior
Junior
Posts: 1
Joined: 20 Apr 2013, 01:30

Problema string

Post by poke » 20 Apr 2013, 01:45

Problema :
Se da un sir exp: abcdefghi . Fiecarei vocale i se atribuie nr corespunzator ( pt a-1 ,pt e-2, pt i-3, pt o-4,pt u-5) astfel incat programul afiseaza: a1bcde2fghi3
Am incercat 2 varianta -nici una nu da corect.
Va rog sa-mi acordati putin ajutor!
Multumsc anticipat

met 1:

Code: Select all

#include<iostream>
#include<string.h>

using namespace std;

int main()
{
    char s[21],b[41];
    int i,j;
    cin.get(s,20);
    for(i=0;i<strlen(s);i++)
        if(s[i]=='a')
    {
        b[j]='a';  b[j+1]='1';  j++;   //s.a.m.d pt e,i,o,u
    }
    else 
{
        b[j]=s[i];
        j++;
    }
    cout << b;
    return 0;
}
met 2:

Code: Select all

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

int main()
{ char s[21];
int i;
cin.get(s,20);
for(i=0;i<strlen(s);i++)
if(s[i]=='a' ) cout<<"1";
    else
    if(s[i]=='e') cout<<"2";
    //s.a.m.d pt restul vocalelor 


    return 0;
}
Last edited by Marius Bancila on 22 Apr 2013, 10:52, edited 1 time in total.
Reason: code tags



Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Problema string

Post by Viorel » 20 Apr 2013, 18:45

Mai încearcă o variantă:

Code: Select all

string s = "abcdefghi";

for each( auto c in s )
{
	cout << c;
	switch(c)
	{
	case 'a':
		cout << '1';
		break;
	case 'e':
		cout << '2';
		break;
	case 'i':
		cout << '3';
		break;
	case 'o':
		cout << '4';
		break;
	case 'u':
		cout << '5';
		break;
	}
}
Ar trebui analizate și majusculele.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Problema string

Post by Marius Bancila » 22 Apr 2013, 10:55

Viorel, ma indoiesc ca for each si auto alea merg in Borland 3.1. Asa ca hai sa modificam putin si sa zicem:

Code: Select all

int len = strlen(s);
for(int i=0;i<len;i++)
{
   char c = s[i]; 
   // etc.
}
PS: din pacate scoala in Romania a ramas undeva pe la 1985.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Problema string

Post by Ovidiu Cucu » 22 Apr 2013, 15:43

Hai sa luam si sa analizam putin codul din primul exemplu!
Este aproape identic cu cel care l-ai postat tu, numai ca l-am aranjat putin si am numerotat liniile ca sa fie mai usor la explicat.

Code: Select all

int main()
{
   char s[21];     //  1
   char b[41];     //  2
   int i;          //  3
   int j;          //  4
   cin.get(s, 20); //  5
   for(i = 0; i < strlen(s); i++) // 6
   {                      // 7
      if(s[i] == 'a')     // 8
      {
         b[j] = 'a';      //  9
         b[j + 1] = '1';  // 10 
         j++;             // 11
      }
      // else if...
      // s.a.m.d. pentru 'e', 'i', 'o', 'u'
      else               // 12
      {
         b[j] = s[i];    // 13
         j++;            // 14
      }
   }
   cout << b;            // 15
   return 0;
}

Linia 9: (si mai jos) folosesti o variabila neinitializata (vezi declaratia lui j, in linia 4).
Daca ai o variabila locala nestatica, aceasta nu este automat initializata cu 0 (zero) ca in alte limbaje.
Deci, in cazul nostru, poate lua o valoare arbitrara (poate fi <0 sau >40) si cel mai probabil programul va crapa in lina 9.
Pentru a evita asemenea greseli, e bine sa-ti faci un obicei ca intotdeauna sa initializezi o variabila in punctul in care o declari.
Adica, faci asa:

Code: Select all

   int j = 0;
Linia 11: pana aici ai adaugat doua valori in b, deci ca sa nu se suprapuna cu urmatoarele trebuie sa incrementezi pe j cu 2.

Code: Select all

   j += 2;
Linia 15: este OK insa la consola iti va afisa si o serie de "carcalaci" deoarece stringul nu este terminat cu '\0'.
Deci, sau ai grija ca in sirul b sa pui '\0' dupa ultimul caracter, sau initializezi toate elementele lui cu zero, in punctul declararii (linia 2).

Code: Select all

  char b[41] = {0};


De acum ar trebui sa mearga insa mai am cateva mici observatii.
E bine sa scoti apelurile din functii din conditia lui for. Nu are rost sa apelezi o functie in fiecare iteratie daca tot timpul intoarce aceeasi valoare.
In plus, functia strlen intoarce un tip unsigned (size_t) iar tu il compari cu un int (care este cu semn). Doar daca n-ai un compilator de pe vreamea lui Pazvante, acesta ar trebui sa-ti dea un warning. Desi aici nu se poate intampla nimic rau, un warning iti spune in general ca ceva nu-i chiar OK si e posibil sa apara probleme. Deci, in general nu ignora warning-urile!
Nu fa economie de acolade! Intotdeauna pune bloc adica include intre { si } ce urmeaza dupa for, while, if, chiar daca e vorba despre o singura linie de cod.
Ar mai fi ca in cazul problemei date e mai frumos sa pui switch in loc de carnatz de if, else if,... else.

Puse toate cap la cap si tinand cont de observatia lui Viorel cu vocalele majuscule, ar iesi ceva de genul:

Code: Select all

int main()
{
   char s[21] = {0};
   char b[41] = {0};
   size_t i = 0;
   int j = 0;
   cin.get(s, 20);
   const size_t N = strlen(s); 
   for(i = 0; i < N; i++)
   {
      b[j] = s[i];
      j++;
      switch(s[i])
      {
      case 'a':
      case 'A':
         b[j] = '1';
         j++;
         break;
      case 'e':
      case 'E':
         b[j] = '2';
         j++;
         break;
      case 'i':
      case 'I':
         b[j] = '3';
         j++;
         break;
      case 'o':
      case 'O':
         b[j] = '4';
         j++;
         break;
      case 'u':
      case 'U':
         b[j] = '5';
         j++;
         break;
      default:
         break;
      }
   }
   cout << b; 
   return 0;
}
Bineinteles, se poate rezolva si altfel.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Problema string

Post by bu7ch3r » 22 Apr 2013, 19:33

Imi dau si eu cu parerea :)
Exemplul asta al tau pare aproape ok.

Code: Select all

#include<iostream>
#include<string.h>

using namespace std;

int main()
{
    char s[21],b[41];
    int i,j;                            //j-ul nu e initializat, fa-l 0 ca de la 0 incepi tu sa populezi al doilea vector  int i, j = 0; valoare lui default poate sa nu fie 0
    cin.get(s,20);
    for(i=0;i<strlen(s);i++)   //{b[j] = s[i] - asta faci orice ar fi .. } nu uita de acoloada - asta e optional, vezi mai jos
        if(s[i]=='a')
    {
        b[j]='a';  b[j+1]='1';  j++;  //tu pui doua caractere, deci trebuie sa cresti j-ul cu 2 nu cu 1
        //sau scoti atribuirea din fiecare if si pui inainte in for ceva de genul: b[j]=s[i]; j++; si lasi j++ cum era.
    }
    else 
{
        b[j]=s[i];
        j++;
    }
   //acum daca tot ai scris in b, tre sa pui si 0 la sfarsit ca sa marchezi sfarsitul sirului
   b[j] = 0;
    cout << b;
    return 0;
}
Cu stima,
Lupu Claudiu

Post Reply