Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: problema siruri  (Citit de 3172 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
mircea2011
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 14



Vezi Profilul
« : Februarie 02, 2013, 13:28:25 »

Am o problema in c si anume : spunem ca doua cuvinte rimeaza daca sufixele incepand de la ultima vocala sunt identice. Sa se scrie un program care citeste doua cuvinte a si b si determina daca ele rimeaza.
Problema poate fi rezolvata usor utilizand functiile dedicate ale limbajului c pentru string-uri.

Cod:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[100], b[100], s1[100], s2[100], v[]="aeiou";
    int i;
    printf("\n Introduceti primul cuvant : ");
    gets(a);
    printf("\n Introduceti al doilea cuvant : ");
    gets(b);
    for(i=0; i<strlen(a); i++)
        if(strchr(v, a[i]))
        strcpy(s1, a+i);
    for(i=0; i<strlen(b); i++)
        if(strchr(v, b[i]))
        strcpy(s2, b+i);
    if(strcmp(s1, s2) == 0)
        printf("\n RIMEAZA\n");
    else
        printf("\n NU RIMEAZA\n");
}

insa am incercat sa o rezolv si altfel.

#include <stdio.h>
#include <stdlib.h>

int vocala(char voc)
{
    switch(voc)
    {
    case 'a' :
    case 'e' :
    case 'i' :
    case 'o' :
    case 'u' :
        return 1;
    default :
        return 0;
    }
}

int strlen(char sir[])
{
    int i=0;
    while(sir[i])
        i++;
    return i;
}

int sufix(char sir[])
{
    int i;
    for(i=0; i<strlen(sir); i++)
        if(vocala(sir) == 1)
        strcpy(sir, sir+i);
        return sir;
}

int main()
{
    char sir_1[100], sir_2[100];
    int i, m, n, ok;
    printf("\n Introduceti primul cuvant : ");
    gets(sir_1);
    printf("\n Introduceti al doilea cuvant : ");
    gets(sir_2);
    if(strcmp(sufix(sir_1), sufix(sir_2)) == 0)
        printf("\n RIMEAZA\n");
    else
        printf("\n NU RIMEAZA\n");
}

Astept sfaturi.
multumesc.

[editat de moderator] : Te rog sa folosesti tag-ul "[ code] [ / code]" data viitoare cand postezi cod.
« Ultima modificare: Februarie 02, 2013, 13:42:59 de către Dragos-Alin Rotaru » Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #1 : Februarie 02, 2013, 13:51:29 »

Si nu merg programele ? Sau cu ce vrei sa te ajutam de fapt ?
Memorat
mircea2011
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 14



Vezi Profilul
« Răspunde #2 : Februarie 02, 2013, 13:56:00 »

primul program functioneaza, al doilea imi returneaza mereu RIMEAZA.
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #3 : Februarie 02, 2013, 14:00:18 »

Cod:
#include <stdio.h>
#include <stdlib.h>
#include <cstring>

int vocala(char voc)
{
    switch(voc)
    {
    case 'a' :
    case 'e' :
    case 'i' :
    case 'o' :
    case 'u' :
        return 1;
    default :
        return 0;
    }
}

int strlen(char sir[])
{
    int i=0;
    while(sir[i])
        i++;
    return i;
}

char* sufix(char sir[])
{
    int i;
    for(i=0; i<strlen(sir); i++)
        if(vocala(sir[i]) == 1)
        strcpy(sir, sir+i);
    return sir;
}

int main()
{
    char sir_1[100], sir_2[100];
    int i, m, n, ok;
    printf("\n Introduceti primul cuvant : ");
    gets(sir_1);
    printf("\n Introduceti al doilea cuvant : ");
    gets(sir_2);
    if(strcmp(sufix(sir_1), sufix(sir_2)) == 0)
        printf("\n RIMEAZA\n");
    else
        printf("\n NU RIMEAZA\n");
}
Functia sufix trebuie sa returneze un sir de caractere, strcmp in care-l folosesti compara 2 siruri de caractere, nu int-uri. Acum ar trebui sa mearga, daca gasesti vreun test aiurea, pune-l aici.
[LE] Ca un sfat, strlen si strcpy sunt functii predefinite in headerul cstring (string.h vechi).
Memorat
mircea2011
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 14



Vezi Profilul
« Răspunde #4 : Februarie 02, 2013, 14:20:56 »

De data asta imi returneaza mereu NU RIMEAZA.
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #5 : Februarie 02, 2013, 14:24:08 »

Serios, eu am bagat 2 si o dat RIMEAZA (spre ex. abcefgfgfg si abababefgfgfg, de la e incolo rimeaza). Ia-ti compilatorul mai nou de pe site-ul mingw.org, sau impreuna cu noul CodeBlocks 12.11.
Memorat
mircea2011
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 14



Vezi Profilul
« Răspunde #6 : Februarie 02, 2013, 14:36:53 »

Am incercat exemplul tau si functioneaza.
Dar daca introduc  abcefgfgfg si abababofgfgfg ar trebui sa-mi returneze nu rimeaza, din pacate returneaza tot rimeaza.
Nu stiu ce se intampla.  d'oh!
Utilizez CodeBlocks 12.12 si compilatorul GNU GCC Compiler.
Memorat
repp4radu
Nu mai tace
*****

Karma: 118
Deconectat Deconectat

Mesaje: 204



Vezi Profilul
« Răspunde #7 : Februarie 02, 2013, 14:40:34 »

@Simoiu Robert: E gresit algoritmul tau.

Da testul:
arc
darcfearc

si o sa te convingi(al tau da "NU RIMEAZA").

Cod:
#include <stdio.h>
#include <stdlib.h>
#include <cstring>

int vocala(char voc)
{
    switch(voc)
    {
    case 'a' :
    case 'e' :
    case 'i' :
    case 'o' :
    case 'u' :
        return 1;
    default :
        return 0;
    }
}

int strlen(char sir[])
{
    int i=0;
    while(sir[i])
        i++;
    return i;
}

char* sufix(char sir[])
{
    int i;
    for(i=0; i<strlen(sir); i++)
        if(vocala(sir[i]) == 1)
        strcpy(sir, sir+i), i = 0;
    return sir;
}

int main()
{
    char sir_1[100], sir_2[100];
    int i, m, n, ok;
    printf("\n Introduceti primul cuvant : ");
    gets(sir_1);
    printf("\n Introduceti al doilea cuvant : ");
    gets(sir_2);
    if(strcmp(sufix(sir_1), sufix(sir_2)) == 0)
        printf("\n RIMEAZA\n");
    else
        printf("\n NU RIMEAZA\n");
}

Asta ar trebui sa mearga Smile

@Dragu Mircea
Cele 2 siruri date de tine rimeaza. Ambele au sufixele fgfgfg.
« Ultima modificare: Februarie 02, 2013, 15:16:01 de către Szasz Radu » Memorat
mircea2011
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 14



Vezi Profilul
« Răspunde #8 : Februarie 02, 2013, 14:52:37 »

Nu, din pacate nici de aceasta data nu functioneaza.
Cele 2 siruri nu rimeaza : abcefgfgfg si abababofgfgfg
In enuntul problemei se spune ca "spunem ca doua cuvinte rimeaza daca sufixele incepand de la ultima vocala sunt identice."
Adica in cazul celor doua siruri :
sufixul sirului "abcefgfgfg" incepand de la ultima vocala este : efgfgfg

sufixul sirului "abababofgfgfg" incepand de la ultima vocala este : ofgfgfg 
Memorat
repp4radu
Nu mai tace
*****

Karma: 118
Deconectat Deconectat

Mesaje: 204



Vezi Profilul
« Răspunde #9 : Februarie 02, 2013, 15:15:44 »

Atunci trebuie doar scos +1 de la strcpy si va functiona.

Am editat raspunsul ca sa functioneze Smile
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #10 : Februarie 02, 2013, 16:29:24 »

Sau merge cu forul invers, am vazut ulterior dar nu am fost la PC sa pot sa raspund. Vezi daca merge algoritmul dat de Radu, si daca nu merge eventual rescriu eu.
Memorat
mircea2011
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 14



Vezi Profilul
« Răspunde #11 : Februarie 02, 2013, 16:48:37 »

Am incercat si cu forul invers, am incercat si varianta sugerata de Radu.
Nu merge niciuna, nu stiu unde gresesc.
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #12 : Februarie 02, 2013, 16:55:05 »

Zi-mi tu un test pe care ultima sursa postata de Radu (repet editata) nu merge. Mie-mi merg toate.
Memorat
mircea2011
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 14



Vezi Profilul
« Răspunde #13 : Februarie 02, 2013, 17:04:12 »

Doua cuvinte : "abcefgfgfg" si "bababaofgfgfg", compilez si raspunsul (normal, de altfel) NU RIMEAZA.
Daca introduc : "abcefgfgfg" si "bababaefgfgfg", compilez, raspunsul este acelasi.

Mai jos este codul :

#include <stdio.h>
#include <string.h>
#include<stdlib.h>

int vocala(char voc)
{
    switch(voc)
    {
    case 'a' :
    case 'e' :
    case 'i' :
    case 'o' :
    case 'u' :
        return 1;
    default :
        return 0;
    }
}

int strlung(char sir[])
{
    int i=0;
    while(sir)
        i++;
    return i;
}

char *sufix(char sir[])
{
    int i;
    for(i=0; i<strlung(sir); i++)
        if(vocala(sir) == 1)
        strcpy(sir, sir+1);
        return sir;
}

int main()
{
    char sir_1[100], sir_2[100];
    printf("\n Introduceti primul cuvant : ");
    gets(sir_1);
    printf("\n Introduceti al doilea cuvant : ");
    gets(sir_2);
    if(strcmp(sufix(sir_1), sufix(sir_2)) == 0)
        printf("\n RIMEAZA\n");
    else
        printf("\n NU RIMEAZA\n");
}
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #14 : Februarie 02, 2013, 17:05:45 »

Mie imi da ca RIMEAZA (la ultimul). Codul este acesta :
Cod:
#include <stdio.h>
#include <stdlib.h>
#include <cstring>

int vocala(char voc)
{
    switch(voc)
    {
    case 'a' :
    case 'e' :
    case 'i' :
    case 'o' :
    case 'u' :
        return 1;
    default :
        return 0;
    }
}

int strlen(char sir[])
{
    int i=0;
    while(sir[i])
        i++;
    return i;
}

char* sufix(char sir[])
{
    int i;
    for(i=0; i<strlen(sir); i++)
        if(vocala(sir[i]) == 1)
        strcpy(sir, sir+i), i = 0;
    return sir;
}

int main()
{
    char sir_1[100], sir_2[100];
    int i, m, n, ok;
    printf("\n Introduceti primul cuvant : ");
    gets(sir_1);
    printf("\n Introduceti al doilea cuvant : ");
    gets(sir_2);
    //printf ("%s\n%s\n", sufix(sir_1), sufix(sir_2));
    if(strcmp(sufix(sir_1), sufix(sir_2)) == 0)
        printf("\n RIMEAZA\n");
    else
        printf("\n NU RIMEAZA\n");
}
Memorat
repp4radu
Nu mai tace
*****

Karma: 118
Deconectat Deconectat

Mesaje: 204



Vezi Profilul
« Răspunde #15 : Februarie 02, 2013, 17:22:16 »

Pe testul pe care tu ai zis ca da NU RIMEAZA, desi corect ar fi RIMEAZA, sursa mea da RIMEAZA. In codul postat de tine ai uitat sa pui i = 0 dupa strcpy.

PS foloseste tag-ul code cand postezi cod Smile
Memorat
fdproxy
Strain
*

Karma: 10
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #16 : Februarie 12, 2013, 15:44:44 »

Cod:
#include <string>
#include <iostream>

const char* suffix_of( const char* s )
{
  if ( ! s || ! *s )
    return 0;

  const char* p = s;
  const char* v = 0;
  while ( *p )
  {
    switch ( *p )
    {
    case 'a': case 'e': case 'i': case 'o': case 'u':
    case 'A': case 'E': case 'I': case 'O': case 'U':
      v = p;
    };
    ++p;
  }

  return v;
}

int main()
{
  using namespace std;
 
  //
  char w1[1000], w2[1000];
  cin >> w1 >> w2;

  //
  const char* s1 = suffix_of( w1 );
  const char* s2 = suffix_of( w2 );

  //
  if ( s1 && s2 && ! stricmp( s1, s2 ) )
    cout << "rimeaza";
  else
    cout << "nu rimeaza";

  return 0;
}

Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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