Jump to content

Recommended Posts

Posted

Boas pessoal estive a cerca de duas horas, a resolver um exercício proposto pela professora (daqueles que valem como um teste).

O enunciado era basicamente isto:

Pedir ao utilizador sempre duas frases. Perguntar qual das seguintes opções ele deseja:

A - Copiar uma frase. (por exemplo a frase2 para dentro da frase1)

B - Calcular o tamanho das frases.

C - Comparar duas frases.

D - Unir duas frases.

E - Contar o numero de vezes que um caracter surge em cada frase.

F - Retira uma letra das frases.

G - Substituir uma letra das frases por outra.

Aqui está a minha resolução:

#include <iostream>

using namespace std;

// Variáveis Globais

char op;
char primeiraFrase[50] , segundaFrase[50], fraseFinal[100];

// Prototipo das funções

void apresentarMenu(); // Apresenta o menu do programa.
void opMenu(); // Verifica a opção escolhida (do menu) pelo utilizador.

void A();
void B();
void C();
void D();
void E();
void F();
void G();

int main(){

 apresentarMenu();

 system("pause");
 return 0;
}

void apresentarMenu(){

 cout << "Escolha uma das seguintes opcoes:" << endl;
 cout << "\tA - Copiar uma frase." << endl;
 cout << "\tB - Calcular o tamanho de uma frase." << endl;
 cout << "\tC - Comparar duas frases." << endl;
 cout << "\tD - Unir duas frases." << endl;
 cout << "\tE - Contar o numero de vezes que um caracter surge em cada frase." << endl;
 cout << "\tF - Retira uma letra das frases." << endl;
 cout << "\tG - Substituir uma letra das frases por outra." << endl;

 opMenu();
}

void opMenu(){
 cin >> op;

 if	 (op == 'a' || op == 'A'){
   A();
 }
 else if(op == 'b' || op == 'B'){
   B();
 }

 else if(op == 'c' || op == 'C'){
   C();
 }

 else if(op == 'd' || op == 'D'){
   D();
 }

 else if(op == 'e' || op == 'E'){
   E();
 }

 else if(op == 'f' || op == 'F'){
   F();
 }

 else if(op == 'g' || op == 'G'){
   G();
 }

 else	 {
   cout << "Escolha invalida." << endl;
 }

}

																		  /* - Pedir sempre duas strings - */

// Funções

void A(){ // Copiar uma frase. (frase escolhida pelo utilizador)

 int _op;

 fflush(stdin);

 cout << "Insira a primeira frase: ";
 gets (primeiraFrase);

 fflush(stdin);

 cout << "Insira a segunda frase: ";
 gets (segundaFrase) ;

 cout << "Deseja copiar a primeira frase para a segunda (1), ou a segunda para a primeira ? (2)" << endl;
 cin  >> _op;

 if( _op == 1 ){
   strcpy(segundaFrase, primeiraFrase);
   cout << segundaFrase;
 }

 else if( _op == 2 ){
   strcpy(primeiraFrase, segundaFrase);
   cout << primeiraFrase;
 }

 else{
   cout << "Escolha Invalida.";
 }

}

void B(){ // Calcular o tamanho de uma frase. (frase escolhida pelo utilizador)

 int _op;

 fflush(stdin);

 cout << "Insira a primeira frase: ";
 gets (primeiraFrase);

 fflush(stdin);

 cout << "Insira a segunda frase: ";
 gets (segundaFrase) ;

 cout << "Deseja calcular o tamanho da primeira frase (1) ou da segunda (2)?" << endl;
 cin  >> _op;

 if( _op == 1 ){

   cout << "Tamanho da primeira frase: " << strlen(primeiraFrase) << endl;
 }

 else if( _op == 2 ){

   cout << "Tamanho da segunda frase: " << strlen(primeiraFrase) << endl;
 }

 else {
   cout << "Escolha Invalida." << endl;
 }


}

void C(){ // Comparar duas frases.

 fflush(stdin);

 cout << "Insira a primeira frase: ";
 gets (primeiraFrase);

 fflush(stdin);

 cout << "Insira a segunda frase: ";
 gets (segundaFrase) ;

 fflush(stdin);

 if(strcmp(primeiraFrase, segundaFrase) == 0){
   cout << "As frases sao iguais.";
 }

 else if(strcmp(primeiraFrase, segundaFrase) == 1){
   cout << "A primeira frase e a maior.";
 }

 else if(strcmp(primeiraFrase, segundaFrase) == -1){
   cout << "A segunda frase e a maior.";
 }

}

void D(){ // Unir duas frases.

 fflush(stdin);

 cout << "Insira a primeira frase: ";
 gets (primeiraFrase);

 fflush(stdin);

 cout << "Insira a segunda frase: ";
 gets (segundaFrase) ;

 strcat(fraseFinal, primeiraFrase);
 strcat(fraseFinal, segundaFrase );

 cout << fraseFinal << endl;

}

void E(){ // Contar o numero de vezes que um caracter surge em cada frase. (caracter dado pelo utilizador)

 int a = 0, b = 0;
 char caracter;

 fflush(stdin);

 cout << "Insira a primeira frase: ";
 gets (primeiraFrase);

 fflush(stdin);

 cout << "Insira a segunda frase: ";
 gets (segundaFrase) ;

 fflush(stdin);

 cout << "Insira um caracter: " << endl;
 cin  >> caracter;

 fflush(stdin);

 for(int i = 0 ; primeiraFrase[i] != '\0' ; i++ ){
   if(primeiraFrase[i] == caracter){
     a++;
   }
 }

 for(int j = 0 ; segundaFrase[j] != '\0' ; j++){
   if(segundaFrase[j] == caracter){
     b++;
   }
 }

 cout << "O caracter " << caracter << ", aparece " << a << " vezes na primeira frase, e " << b << " vezes na segunda frase." << endl;

}

void F(){ // Retira uma letra das frases. (letra dada pelo utilizador)

 char caracter;

 fflush(stdin);

 cout << "Insira a primeira frase: ";
 gets (primeiraFrase);

 fflush(stdin);

 cout << "Insira a segunda frase: ";
 gets (segundaFrase) ;

 cout << "Insira o caracter que deseja retirar: ";
 cin  >> caracter;

 fflush(stdin);

 for(int i = 0 ; primeiraFrase[i] != '\0' ; i++){
   if(primeiraFrase[i] == caracter){
     primeiraFrase[i] = primeiraFrase[i+1];
   }
 }

 for(int j = 0 ; primeiraFrase[j] != '\0' ; j++){
   if(segundaFrase[j] == caracter){
     segundaFrase[j] = segundaFrase[j+1];
   }
 }

 cout << "Primeira frase: " << primeiraFrase << endl;
 cout << "Segunda frase: "  << segundaFrase  << endl;

}

void G(){ // Substituir uma letra das frases por outra. (letras dadas pelo utilizador)

 char caracter, _caracter;

 fflush(stdin);

 cout << "Insira a primeira frase: ";
 gets (primeiraFrase);

 fflush(stdin);

 cout << "Insira a segunda frase: ";
 gets (segundaFrase) ;

 cout << "Insira o caracter que deseja modificar: ";
 cin  >> caracter;

 cout << "Insira o caracter que deseja colocar: ";
 cin  >> _caracter;

 for(int i = 0 ; primeiraFrase[i] != '\0' ; i++){
   if(primeiraFrase[i] == caracter){
     primeiraFrase[i] = _caracter;
   }
 }

 for(int j = 0 ; primeiraFrase[j] != '\0' ; j++){
   if(segundaFrase[j] == caracter){
     segundaFrase[j] = _caracter;
   }
 }

 cout << "Primeira frase: " << primeiraFrase << endl;
 cout << "Segunda frase: "  << segundaFrase  << endl;
}

Peço a vossa ajuda para que me expliquem como fazer a opção F - Retira uma letra das frases. (Remover completamente o caracter do array, e fazer com que os outros caracteres venham para "trás").

De momento isso já não melhorara a nota, mas ao menos fico a perceber como se faz.

P.s.: Peço desculpa não consigo indentar o código aqui. E não liguem ao "[/ssize]" foi uma tentativa falhada de o indentar.

Cumps

Learning:

C++
Posted
#include <iostream>
#include <limits>
using namespace std;

#include <string.h>

#define MAX_SIZE 256

// Prototipo das funções

void cpp_A(string frase1, string frase2);
void cpp_B(string frase1, string frase2);
void cpp_C(string frase1, string frase2);
void cpp_D(string frase1, string frase2);
void cpp_E(string frase1, string frase2);
void cpp_F(string frase1, string frase2);
void cpp_G(string frase1, string frase2);

void c_A(char * frase1, char * frase2);
void c_B(char * frase1, char * frase2);
void c_C(char * frase1, char * frase2);
void c_D(char * frase1, char * frase2);
void c_E(char * frase1, char * frase2);
void c_F(char * frase1, char * frase2);
void c_G(char * frase1, char * frase2);

int main(void) {
   char op;
   string frase1, frase2;
   char cfrase1[MAX_SIZE], cfrase2[MAX_SIZE];

   // sem validação de dados de entrada !!!

   do {
       cout << "Digite a primeira frase : ";
       getline(cin, frase1);
   } while (cin.fail());

   do {
       cout << "Digite a segunda frase : ";
       getline(cin, frase2);
   } while (cin.fail());

   strncpy(cfrase1, frase1.c_str(), MAX_SIZE);
   strncpy(cfrase2, frase2.c_str(), MAX_SIZE);

   do {
       cout << endl;
       cout << "-------------------------------------------------------------------------" << endl;
       cout << endl;
       cout << "primeira frase : " << frase1 << endl;
       cout << "segunda frase : " << frase2 << endl;
       cout << endl;
       cout << "Escolha uma das seguintes opcoes:" << endl;
       cout << "\tA - Copiar uma frase.                                             (c++)" << endl;
       cout << "\tB - Calcular o tamanho de uma frase.                              (c++)" << endl;
       cout << "\tC - Comparar duas frases.                                         (c++)" << endl;
       cout << "\tD - Unir duas frases.                                             (c++)" << endl;
       cout << "\tE - Contar o numero de vezes que um caracter surge em cada frase. (c++)" << endl;
       cout << "\tF - Retira uma letra das frases.                                  (c++)" << endl;
       cout << "\tG - Substituir uma letra das frases por outra.                    (c++)" << endl;
       cout << endl;
       cout << "\tH - Copiar uma frase.                                             (c)" << endl;
       cout << "\tI - Calcular o tamanho de uma frase.                              (c)" << endl;
       cout << "\tJ - Comparar duas frases.                                         (c)" << endl;
       cout << "\tK - Unir duas frases.                                             (c)" << endl;
       cout << "\tL - Contar o numero de vezes que um caracter surge em cada frase. (c)" << endl;
       cout << "\tM - Retira uma letra das frases.                                  (c)" << endl;
       cout << "\tN - Substituir uma letra das frases por outra.                    (c)" << endl;
       cout << endl;
       cout << "\tX - Sair." << endl;
       cout << endl;

       cin >> op;
       if (cin.good()) {
           switch (tolower(op)) {
               case 'a': cpp_A(frase1, frase2); break;
               case 'b': cpp_B(frase1, frase2); break;
               case 'c': cpp_C(frase1, frase2); break;
               case 'd': cpp_D(frase1, frase2); break;
               case 'e': cpp_E(frase1, frase2); break;
               case 'f': cpp_F(frase1, frase2); break;
               case 'g': cpp_G(frase1, frase2); break;
               case 'h': c_A(cfrase1, cfrase2); break;
               case 'i': c_B(cfrase1, cfrase2); break;
               case 'j': c_C(cfrase1, cfrase2); break;
               case 'k': c_D(cfrase1, cfrase2); break;
               case 'l': c_E(cfrase1, cfrase2); break;
               case 'm': c_F(cfrase1, cfrase2); break;
               case 'n': c_G(cfrase1, cfrase2); break;
               case 'x':
                   break;
               default:
                   cout << "Opcao invalida !!!" << endl;
                   break;
           }
       }
   } while (op != 'x');

   return 0;
}

                                                                                                                                                         /* - Pedir sempre duas strings - */

void cpp_A(string frase1, string frase2) {
   // Copiar uma frase. (frase escolhida pelo utilizador)
   int op;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Deseja copiar a primeira frase para a segunda (1), ou a segunda para a primeira ? (2)" << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> op;
   } while (cin.fail() || (op < 1 && op > 2));

   if(op == 1) {
       frase2 = frase1;

       cout << "primeira frase : " << frase1 << endl;
       cout << "segunda frase : " << frase2 << endl;
   } else {
       frase1 = frase2;

       cout << "primeira frase : " << frase1 << endl;
       cout << "segunda frase : " << frase2 << endl;
   }
}

void cpp_B(string frase1, string frase2) {
   // Calcular o tamanho de uma frase. (frase escolhida pelo utilizador)
   int op;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Deseja calcular o tamanho da primeira frase (1) ou da segunda (2)?" << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> op;
   } while (cin.fail() || (op < 1 && op > 2));

   if(op == 1) {
       cout << "tamanho : " << frase1.size() << endl;
   } else {
       cout << "tamanho : " << frase2.size() << endl;
   }
}

void cpp_C(string frase1, string frase2) {
   // Comparar duas frases.

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   cout << "comparação das duas frases : " << (frase1 == frase2 ? "iguais" : "diferentes") << endl;
}

void cpp_D(string frase1, string frase2) {
   // Unir duas frases.

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   cout << "concatenacao das duas frases : " << frase1 + frase2 << endl;
}

void cpp_E(string frase1, string frase2) {
   // Contar o numero de vezes que um caracter surge em cada frase. (caracter dado pelo utilizador)
   char c = 0;
   size_t pos, count1 = 0, count2 = 0;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Insira um caracter a contabilizar : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c;
   } while (cin.fail());

   pos = 0;
   while ((pos = frase1.find(c, pos)) != string::npos)
       ++count1, ++pos;

   pos = 0;
   while ((pos = frase2.find(c, pos)) != string::npos)
       ++count2, ++pos;

   cout << "O caracter " << c << ", aparece " << count1 << " vezes na primeira frase" << endl;
   cout << "O caracter " << c << ", aparece " << count2 << " vezes na segunda frase" << endl;
}

void cpp_F(string frase1, string frase2) {
   // Retira uma letra das frases. (letra dada pelo utilizador)
   char c = 0;
   size_t pos;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Insira um caracter a ser retirado : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c;
   } while (cin.fail());

   pos = 0;
   while ((pos = frase1.find(c, 0)) != string::npos)
       frase1.erase(pos, 1);

   pos = 0;
   while ((pos = frase2.find(c, 0)) != string::npos)
       frase2.erase(pos, 1);

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;
}

void cpp_G(string frase1, string frase2) {
   // Substituir uma letra das frases por outra. (letras dadas pelo utilizador)
   char c1, c2;
   size_t pos = 0;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Insira um caracter a ser alterado : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c1;
   } while (cin.fail());

   do {
       cout << "Insira um caracter a ser inserido : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c2;
   } while (cin.fail());

   pos = 0;
   while ((pos = frase1.find(c1, 0)) != string::npos)
       frase1[pos] = c2;

   pos = 0;
   while ((pos = frase2.find(c1, 0)) != string::npos)
       frase2[pos] = c2;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;
}

void c_A(char * frase1, char * frase2) {
   // Copiar uma frase. (frase escolhida pelo utilizador)
   int op;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Deseja copiar a primeira frase para a segunda (1), ou a segunda para a primeira ? (2)" << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> op;
   } while (cin.fail() || (op < 1 && op > 2));

   if(op == 1) {
       strncpy(frase2, frase1, MAX_SIZE);

       cout << "primeira frase : " << frase1 << endl;
       cout << "segunda frase : " << frase2 << endl;
   } else {
       strncpy(frase1, frase2, MAX_SIZE);

       cout << "primeira frase : " << frase1 << endl;
       cout << "segunda frase : " << frase2 << endl;
   }
}

void c_B(char * frase1, char * frase2) {
   // Calcular o tamanho de uma frase. (frase escolhida pelo utilizador)
   int op;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Deseja calcular o tamanho da primeira frase (1) ou da segunda (2)?" << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> op;
   } while (cin.fail() || (op < 1 && op > 2));

   if(op == 1) {
       cout << "tamanho : " << strlen(frase1) << endl;
   } else {
       cout << "tamanho : " << strlen(frase2) << endl;
   }
}

void c_C(char * frase1, char * frase2) {
   // Comparar duas frases.

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   cout << "comparação das duas frases : " << (strcmp(frase1, frase2) == 0 ? "iguais" : "diferentes") << endl;
}

void c_D(char * frase1, char * frase2) {
   // Unir duas frases.

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   strcat(frase1, frase2);

   cout << "concatenacao das duas frases : " << frase1 << endl;
}

void c_E(char * frase1, char * frase2) {
   // Contar o numero de vezes que um caracter surge em cada frase. (caracter dado pelo utilizador)
   char c = 0;
   size_t count1 = 0, count2 = 0;
   char * iter = NULL;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Insira um caracter a contabilizar : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c;
   } while (cin.fail());

   iter = frase1;
   while (*iter != 0)
       count1 += (c == *(iter++));

   iter = frase2;
   while (*iter != 0)
       count2 += (c == *(iter++));

   cout << "O caracter " << c << ", aparece " << count1 << " vezes na primeira frase" << endl;
   cout << "O caracter " << c << ", aparece " << count2 << " vezes na segunda frase" << endl;
}

void c_F(char * frase1, char * frase2) {
   // Retira uma letra das frases. (letra dada pelo utilizador)
   char c = 0;
   char * iter = NULL;
   size_t len1, len2;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Insira um caracter a ser retirado : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c;
   } while (cin.fail());

   len1 = strlen(frase1);
   len2 = strlen(frase2);

   iter = frase1;
   while (*iter != 0) {
       if (*iter == c)
           memmove(iter, iter + 1, len1 - ((size_t)iter - (size_t)frase1));
       else
           iter++;
   }

   iter = frase2;
   while (*iter != 0) {
       if (*iter == c)
           memmove(iter, iter + 1, len2 - ((size_t)iter - (size_t)frase2));
       else
           iter++;
   }

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;
}

void c_G(char * frase1, char * frase2) {
   // Substituir uma letra das frases por outra. (letras dadas pelo utilizador)
   char c1, c2;
   char * iter = NULL;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Insira um caracter a ser alterado : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c1;
   } while (cin.fail());

   do {
       cout << "Insira um caracter a ser inserido : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c2;
   } while (cin.fail());

   iter = frase1;
   while (*iter != 0) {
       *iter = *iter == c1 ? c2 : *iter;
       iter++;
   }

   iter = frase2;
   while (*iter != 0) {
       *iter = *iter == c1 ? c2 : *iter;
       iter++;
   }

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;
}
IRC : sim, é algo que ainda existe >> #p@p
Posted

Obrigado pela resposta ...

Mas o que está ai não "ajuda" na minha questão ...

A professora queria que fossem usadas as seguintes funções : gets(), strcpy(), strcat(), strlen(), strcomp() ... Para trabalhar com strings.

E gostaria de saber apenas focada na minha pergunta como poderia ter resolvido a questão, que estou em dúvida, porque não consigo entender como poderia ter feito.

Cumps

Learning:

C++
Posted

Obrigado pela resposta ...

Mas o que está ai não "ajuda" na minha questão ...

A professora queria que fossem usadas as seguintes funções : gets(), strcpy(), strcat(), strlen(), strcomp() ... Para trabalhar com strings.

E gostaria de saber apenas focada na minha pergunta como poderia ter resolvido a questão, que estou em dúvida, porque não consigo entender como poderia ter feito.

Cumps

como é que um exercício resolvido não te ajuda a perceber o que é necessário fazer ?

ainda por cima está resolvido em C assim como em C++ !!!

IRC : sim, é algo que ainda existe >> #p@p
Posted

que parte do seguinte código não podes utilizar ?

void c_F(char * frase1, char * frase2) {
   // Retira uma letra das frases. (letra dada pelo utilizador)
   char c = 0;
   char * iter = NULL;
   size_t len1, len2;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Insira um caracter a ser retirado : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c;
   } while (cin.fail());

   len1 = strlen(frase1);
   len2 = strlen(frase2);

   iter = frase1;
   while (*iter != 0) {
       if (*iter == c)
           memmove(iter, iter + 1, len1 - ((size_t)iter - (size_t)frase1));
       else
           iter++;
   }

   iter = frase2;
   while (*iter != 0) {
       if (*iter == c)
           memmove(iter, iter + 1, len2 - ((size_t)iter - (size_t)frase2));
       else
           iter++;
   }

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;
}
IRC : sim, é algo que ainda existe >> #p@p
Posted

Não posso usar ponteiros;

- isso é absurdo porque strings são ponteiros para uma região de memória que guarda bytes que irão ser convertidos em caracteres através da tabela ASCII, terminando com o byte de valor 0

size_t;

- se usas a função strlen então usas o size_t, logo também é absurdo

cin.ignore;

cin.fail;

- se não podes validar os dados de entrada o problema é teu. tira a validação e espera que o utilizador insira tudo correcto

memmove;

- podes usar todas as funções do header "string.h" excepto uma ao acaso ?

IRC : sim, é algo que ainda existe >> #p@p
Posted

A ver se me entende, a minha professora hoje deu me esse exercício e aos meus colegas, como se fosse um teste, e disse nos no enunciado o que podíamos usar, e o que podemos usar? Aquilo que demos nas aulas. Então como é óbvio eu não posso usar coisas que não dei, e mesmo que soubesse a professora não aceitaria porque não demos na aula, e ela fez este exercício mesmo para usarmos as funções que referi : gets(), strcpy(), strcat(), strlen(), strcomp() .

Para praticarmos o que aprendemos no módulo em que nos encontramos, agora se o que eu disse é absurdo não sei, mas não posso usar porque supostamente ainda não aprendemos na aula. Quanto à validação dos dados, eu não fiz porque fiquei muito tempo na opção F , e depois quando dei por mim já não tinha tempo.

Learning:

C++
Posted

a solução de para o exercício F com essas restrições não passa por nenhuma dessas funções.

void c_F(char * frase1, char * frase2) {
   // Retira uma letra das frases. (letra dada pelo utilizador)
   char c = 0;
   char * iter = NULL, buffer[MAX_SIZE];
   size_t len1, len2, pos;

   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;

   do {
       cout << "Insira um caracter a ser retirado : " << endl;
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       cin >> c;
   } while (cin.fail());

   len1 = strlen(frase1);
   len2 = strlen(frase2);

   iter = frase1;
   pos = 0;
   while (*iter != 0) {
       /*
       if (*iter == c)
           memmove(iter, iter + 1, len1 - ((size_t)iter - (size_t)frase1));
       else
           iter++;
       */
       if (*iter != c)
           buffer[pos++] = *iter;
       iter++;
   }
   buffer[pos] = 0;
   cout << "primeira frase : " << buffer << endl;

   iter = frase2;
   pos = 0;
   while (*iter != 0) {
       /*
       if (*iter == c)
           memmove(iter, iter + 1, len2 - ((size_t)iter - (size_t)frase2));
       else
           iter++;
       */
       if (*iter != c)
           buffer[pos++] = *iter;
       iter++;
   }
   buffer[pos] = 0;
   cout << "segunda frase : " << buffer << endl;
/*
   cout << "primeira frase : " << frase1 << endl;
   cout << "segunda frase : " << frase2 << endl;
*/
}

no entanto usa uma buffer auxiliar que é completamente desnecessário com o código que apresentei anteriormente.

IRC : sim, é algo que ainda existe >> #p@p
Posted

Isso que os professores dizem, são apenas sugestões, penso eu que podes resolver da maneira que quiseres, desde que o resultado dê o pretendido, é uma solução válida e é obrigada a dar-te a cotação toda da resposta.

Posted

Olhando para o problema que tens, não percebo por que razão estás a usar C++. A funções são quase todas de C. Até o gets usas, que nem em C o deves usar!

Como habitual em quem está a aprender estás a misturar input do utilizador com computação, apesar de até teres tido o cuidado em separar o código em funções.

Fica aqui uma solução alternativa para o problema F:

void removeLetra(char str[], char letra){
   int old, new;
   for(old = 0, new = 0; str[old] != '\0'; old++) {
       if(str[old] != letra) {
           str[new] = str[old];
           new++;
       }
   }
   str[new] = '\0';
}

Como vês, não há cin, cout, gets, ou afins (que só causam confusão) na função que efectua a transformação que pretendes. Esse tipo de funções deve ficar no main (ou noutra função que chamará esta função que apresentei). O algoritmo é semelhante ao que o HHH usou. Procurei remover tudo que se assemelhasse a apontadores, e também tentei separar as instruções.

(HHH, não me parece que seja necessário usar um buffer ou o memmove.)

Uma versão executável que usa esta função seria por exemplo:

#include <stdio.h>

int removeLetra(char* str, char letra){
   int old, new;
   for(old = 0, new = 0; str[old] != '\0'; old++) {
       if(str[old] != letra) {
           str[new] = str[old];
           new++;
       }
   }
   str[new] = '\0';
   return 0;
}

int main(void) {
   char letra;
   char str[100];
   letra = getchar();
   while(getchar() != '\n');
   fgets(str, 100, stdin);
   removeLetra(str, letra);
   puts(str);
   return 0;
}
  • Vote 1
Posted

Isso que os professores dizem, são apenas sugestões, penso eu que podes resolver da maneira que quiseres, desde que o resultado dê o pretendido, é uma solução válida e é obrigada a dar-te a cotação toda da resposta.

Não é bem assim, não posso resolver como me apetece, tenho que usar aquilo que aprendemos, palavras da professora, e as funções que ela tinha indicado tinham que ser usadas como já tinha referido anteriormente, porque "fazem" parte do módulo.

Olhando para o problema que tens, não percebo por que razão estás a usar C++. A funções são quase todas de C. Até o gets usas, que nem em C o deves usar!

Como habitual em quem está a aprender estás a misturar input do utilizador com computação, apesar de até teres tido o cuidado em separar o código em funções.

Fica aqui uma solução alternativa para o problema F:

void removeLetra(char str[], char letra){
int old, new;
for(old = 0, new = 0; str[old] != '\0'; old++) {
	if(str[old] != letra) {
		str[new] = str[old];
		new++;
	}
}
str[new] = '\0';
}

Como vês, não há cin, cout, gets, ou afins (que só causam confusão) na função que efectua a transformação que pretendes. Esse tipo de funções deve ficar no main (ou noutra função que chamará esta função que apresentei). O algoritmo é semelhante ao que o HHH usou. Procurei remover tudo que se assemelhasse a apontadores, e também tentei separar as instruções.

(HHH, não me parece que seja necessário usar um buffer ou o memmove.)

Uma versão executável que usa esta função seria por exemplo:

#include <stdio.h>

int removeLetra(char* str, char letra){
int old, new;
for(old = 0, new = 0; str[old] != '\0'; old++) {
	if(str[old] != letra) {
		str[new] = str[old];
		new++;
	}
}
str[new] = '\0';
return 0;
}

int main(void) {
char letra;
char str[100];
letra = getchar();
while(getchar() != '\n');
fgets(str, 100, stdin);
removeLetra(str, letra);
puts(str);
return 0;
}

Agora sim já compreendi 😄 , estou a usar "C++" porque é o que supostamente estamos a dar ... Eu sei que C para C++ vai uma boa diferença, apesar deste "C++" não ter basicamente nada de C++, penso que mais valia nos dizerem que estamos a aprender C e não C++, mas pronto, obrigado pela resposta, agora já compreendi o que poderia ter feito duma maneira bastante simples 😛 .

Learning:

C++

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.