Numarare consoane

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
answerx
Junior
Junior
Posts: 12
Joined: 18 Nov 2010, 20:16

Numarare consoane

Post by answerx » 22 May 2011, 13:44

Vreau sa fac un program in C++ care afiseaza cuvintul cu cel mai mare numar de consoane. Ajutai-ma va rog!

Iata ce am reusit sa fac:

Code: Select all

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream.h>
#include <string.h>


void main()
{char cons[22]={'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'};
int c[30] ; char sir[30],B[30][30]; int i,j,k,f,n;
clrscr();
printf("Dati propozitia:");
gets(sir);
for(i=0;i<strlen(sir);i++)
B[i][j]=sir[i];k++;
{if(sir[i]==' ')
{j++;k=0;}
else {B[i][k]=sir[i];k++;}}
n=j;
for(j=0;j<n;j++)
while(i<strlen(B[j]))
{for(i=0;i<22;i++)
if(B[j][k]==cons[i])
f++;
c[j]=f;
k++;}
cout<<"Cuvintul este:";
printf("%10S",c[j]);
getch();}



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

Re: Numarare consoane

Post by Ovidiu Cucu » 22 May 2011, 21:45

Incearca te rog sa nu faci economie de spatii, identari si paranteze in asa fel incat codul sa poata fi citit si inteles de ceilalti.
In plus, daca scrii frumos, iti dai si tu seama mai usor daca ai gresit ceva.

Asa cum l-ai scris acum e ca un text fara virgula, fara punct, fara spatii intre cuvinte, fara paragrafe.
La o prima formatare ar trebui sa arate cam asa (practic nu ti-am modificat nimic, numai l-am facut lizibil):

Code: Select all

void main()
{
   char cons[22] = {'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'};
   int c[30]; 
   char sir[30], B[30][30];
   int i, j, k, f, n;
   clrscr();
   printf("Dati propozitia:");
   gets(sir);
   for(i = 0; i < strlen(sir); i++)
      B[i][j] = sir[i];
   k++;
   {
      if(sir[i]==' ')
      {
         j++;
         k=0;
      }
      else 
      {
         B[i][k] = sir[i];
         k++;
      }
   }
   n=j;
   for(j = 0; j < n; j++)
      while(i < strlen(B[j]))
      {
         for(i=0; i < 22; i++)
            if(B[j][k] == cons[i])
               f++;
            c[j] = f;
            k++;
      }
      cout<<"Cuvintul este:";
      printf("%10S", c[j]);
      getch();
}
In plus, e bine sa pui intotdeaula bloc dupa if, for, while si nu pune carnatz de instructiuni pe aceeasi linie.
Adica, de exemplu, in loc de

Code: Select all

for(i=0;i<strlen(sir);i++)
B[i][j]=sir[i];k++; 
e mai bine, mai lizibil si mai greu sa gresesti daca scrii

Code: Select all

   for(i = 0; i < strlen(sir); i++)
   {
      B[i][j] = sir[i];
      // si ce-o mai fi...
   }
Aproape sigur ai ceva paranteze uitate sau puse aiurea, iar acum sper sa-ti dai mai bine seama pe unde.
Sunt doua greseli care sar deocamdata in ochi: folosesti variabilele j si k fara sa fie initializate si nu iei in calcul majusculele.

answerx
Junior
Junior
Posts: 12
Joined: 18 Nov 2010, 20:16

Re: Numarare consoane

Post by answerx » 23 May 2011, 16:55

Multumesc pentru corectari. Nu inteleg cum adica k si j nu sunt initializate?

0ptr
Membru
Membru
Posts: 71
Joined: 01 Feb 2011, 23:27
Judet: Ilfov

Re: Numarare consoane

Post by 0ptr » 23 May 2011, 17:13

answerx wrote:Nu inteleg cum adica k si j nu sunt initializate?
"Initialization of variables" http://www.cplusplus.com/doc/tutorial/variables/

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

Re: Numarare consoane

Post by Ovidiu Cucu » 23 May 2011, 17:29

answerx wrote: Nu inteleg cum adica k si j nu sunt initializate?
Pai ai cam asa ceva

Code: Select all

   int k, j;
    // ... urmeaza linii de cod in care lui k si j nu i se atribuie nicaieri nici o valoare...

dupa care:

Code: Select all

      B[i][j] = sir[i];
si/sau

Code: Select all

      k++
Cat ar putea fi valoarea lui k, cat cat ar putea fi valoarea lui j nimeni nu stie, nici macar programul.

Mai exact: in momentul cand declari o variabila locala fara s-o initializezi, adica

Code: Select all

{
   // ....
   int i;
}
in C/C++ aceata nu este initializata (sa zcem cu zero). Poate foarte bine sa aiba valoarea 666 iar ceva gen a[ i ] = ceva unde sa zicem a este un aray cu 5 elemente, pate sa duca de rapa tot programul.

Deci, ca regula. Intotdeaua cand declari o variabila locala (intr-o functie sau un bloc) nu uita s-o initializezi.
Adica in urmatoarea declaratie

Code: Select all

{
   //... 
   int i;
}
variabila i are o valoare arbitrara. E mai bine sa o declaram astfel:

Code: Select all

   int i = 0; // 0 e doar un exemplu

answerx
Junior
Junior
Posts: 12
Joined: 18 Nov 2010, 20:16

Re: Numarare consoane

Post by answerx » 23 May 2011, 17:39

Poate ma ajuta cineva sa o iau corect de la inceput, in acest program singur nu stiu ce am facut. :)

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Numarare consoane

Post by Dragos Cojocari » 24 May 2011, 16:34

Ca la scoala: scrie pe hartie in romana cum vrei sa rezolvi problema. Nu te lega de aspecte specifice unui limbaj. In cazul tau ar fi ceva de genul:
- imparte propozitia in cuvinte
- calculeaza numarul de consoane pentru fiecare cuvavt in parte. Daca numarul de consoane ptr cuvantul curent e mai mare decat ce ai avut pana acum "tine minte" cuvantul si seteaza numarul maxim la valoarea calculata

Cele 2 parti pot fi facute deodata, adica poti calcula numarul de consoane pentru fiecare cuvant pe masura ce imparti propozitia in cuvinte. Trebuie facuta precizarea ca in cazul in care exista mai multe cuvinte cu un numafr egal de consoane algoritmul va intoarce primul cuvant gasit.

Urmatorul pas ar fi sa transformi "pasii" din limba romana in ceva mai aproape de programare:
- citeste propozitia de la consola
- defineste si initializeaza cu 0 o variabila care va tine numarul maxim de consoane ( maxConsoane).
- defineste si initializeaza cu 0 o variabila care va tine numarul maxim de consoane ( curConsoane).
- defineste si initializeaza cu 0 doua variabile ce vor tine pozitia de start in propozitie pentru cuvantul cu numar maxim de consoane ( maxStart, maxEnd)
- defineste si initializeaza cu 0 variabla ce va tine pozitia de start a cuvantului curent (curStart)
- itereaza caracter cu caracter propozitia*
------ daca caracterul curent ( scuzati cacofonia) este consoana, incremeneaza curConsoane
------ altfel daca caracterul curent este un separator**
--------------- daca curConsoane > maxConsoane atunci maxConsoane=curConsoane si cuvantul maxim e cel care tocmai s-a terminat. Marcheaza cuvantul, maxStart=curStart, maxEnd=pozitiaCurenta-1 unde pozitiaCurenta e iteratorul
--------------- altfel ( adica curConsoane <= maxConsoane) reseteaza curConsoane si curStart=pozitiaCurenta+1
- la sfarsitul iteratiei daca maxConsoane >0 atunci maxConsoane este numarul maxim de consoane dintr-un singur cuvant iar cuvantul incepe in propozitie la maxStart si se incheie la maxEnd ( inclusiv). Daca maxConsoane e 0 atunci nu exista cuvinte care sa contina consoane.

* trebuie atentie la cum definesti conditia de start a iteratie astfel incat sa nu scapi din calcul ultimul cuvant daca propozitia nu se incheie cu un semn de punctuatie sau spatiu
** trebuie sa definesti corect ce e un separator. Poti sa scrii tu o functie de mana sau poti sa te folosesti de o functie precum isalnum ( in cazul asta conditia ar fi o negatie a lui isalnum pe caracterul curent)

Pasul 3 e sa transformi treaba asta in limbaj de programare. :)

answerx
Junior
Junior
Posts: 12
Joined: 18 Nov 2010, 20:16

Re: Numarare consoane

Post by answerx » 24 May 2011, 18:05

Am incercat o alta varianta de rezolvare a problemei, dar nu merge. Poate imi spune cineva unde trebuie de corectat?

Code: Select all

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream.h>
#include <string.h>


void main()
{
char cons[21]={'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'};
  char s[30],x[30][30],z[30]; int i,j=0,k=0,r,f,n,poz,c,max;
clrscr();
printf("Dati propozitia:");
gets(s);n=strlen(s);r=0;k=0;

for(i=0;i<n;i++)
{
if((s[i]!=' ')&&(s[i]!='.')){x[r][k]=s[i];k++;
}
if((s[i]==' ')||(s[i]=='.')){x[r][k]='\0';r++;k=0;
}}

for(i=0;i<r;i++)
for(j=0;j<strlen(x[i]);j++)
for(k=0;k<21;k++)
if(x[j]==cons[k])
 {
c++;
}
z[i]=c;
max=z[0]; poz=0;
for(i=0;i<r;i++)
if(max<z[i])
{
max=z[i];poz=i;
}
puts(x[poz]);
}

answerx
Junior
Junior
Posts: 12
Joined: 18 Nov 2010, 20:16

Re: Numarare consoane

Post by answerx » 25 May 2011, 11:42

Ce chiar nimeni nu vrea sa dea o mina de ajutor?

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Numarare consoane

Post by cristianamarie » 26 May 2011, 08:34

answerx wrote:Ce chiar nimeni nu vrea sa dea o mina de ajutor?
Inca nu. Ia incearca asa.
Nuclear launch detected

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

Re: Numarare consoane

Post by Ovidiu Cucu » 26 May 2011, 12:55

answerx wrote:Ce chiar nimeni nu vrea sa dea o mina de ajutor?
Alea de mai sus ce-s, numai deshte? :)

Uite inca unul. Ai asa:

Code: Select all

char cons[21]={'b','c',/*...*/};
char s[30],x[30][30],/*...*/;
//...
//...
if(x[j]==cons[k])
unde
  • x[j] iti intoarce un char* (pointer la char, linia j din matricea bidimensionala x);
  • cons[k] iti intoarce un char (elementul k din matricea unidimensionala cons).
Deci, asadar si prin urmare in linia de cod

Code: Select all

if(x[j]==cons[k])
compilatorul da eroare pentru ca incerci sa compari 'capra' cu 'varza' (pardon, char* cu char).

Post Reply