edub13 Posted February 25, 2014 at 02:41 PM Report #546584 Posted February 25, 2014 at 02:41 PM 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++
HappyHippyHippo Posted February 25, 2014 at 03:56 PM Report #546604 Posted February 25, 2014 at 03:56 PM #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 Portugol Plus
edub13 Posted February 25, 2014 at 07:02 PM Author Report #546634 Posted February 25, 2014 at 07:02 PM 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++
HappyHippyHippo Posted February 25, 2014 at 07:04 PM Report #546635 Posted February 25, 2014 at 07:04 PM 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 Portugol Plus
edub13 Posted February 25, 2014 at 07:11 PM Author Report #546639 Posted February 25, 2014 at 07:11 PM Porque lá não poderia ter usado o que ai está, e porque não percebo. Learning: C++
HappyHippyHippo Posted February 25, 2014 at 07:13 PM Report #546640 Posted February 25, 2014 at 07:13 PM 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 Portugol Plus
edub13 Posted February 25, 2014 at 07:16 PM Author Report #546641 Posted February 25, 2014 at 07:16 PM Não posso usar ponteiros; size_t; cin.ignore; cin.fail; memmove; Learning: C++
HappyHippyHippo Posted February 25, 2014 at 07:20 PM Report #546642 Posted February 25, 2014 at 07:20 PM 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 Portugol Plus
edub13 Posted February 25, 2014 at 07:38 PM Author Report #546646 Posted February 25, 2014 at 07:38 PM 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++
HappyHippyHippo Posted February 25, 2014 at 07:48 PM Report #546648 Posted February 25, 2014 at 07:48 PM 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 Portugol Plus
edub13 Posted February 25, 2014 at 08:01 PM Author Report #546649 Posted February 25, 2014 at 08:01 PM Peço desculpa só consegui explicar desta maneira o que a setora pretendia, e segundo ela bastava duas ou três linhas de código Learning: C++
HappyHippyHippo Posted February 25, 2014 at 08:13 PM Report #546651 Posted February 25, 2014 at 08:13 PM testa o último código que apresentei IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
edub13 Posted February 25, 2014 at 08:22 PM Author Report #546652 Posted February 25, 2014 at 08:22 PM Já testei. Mas a minha duvida é que a minha stora disse que se fazia isso em pouco mais de duas linhas, e queria saber como. Learning: C++
HappyHippyHippo Posted February 25, 2014 at 08:50 PM Report #546658 Posted February 25, 2014 at 08:50 PM for (pos = 0, iter = frase1; *iter != 0; iter++) if (*iter != c) buffer[pos++] = *iter; buffer[pos] = 0; achas isto muitas linhas ? (é o mesmo que tenho acima ...) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
edub13 Posted February 25, 2014 at 08:57 PM Author Report #546659 Posted February 25, 2014 at 08:57 PM Ah penso que já compreendi, estava meio confuso Learning: C++
mundo Posted February 26, 2014 at 09:33 AM Report #546686 Posted February 26, 2014 at 09:33 AM 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.
Rui Carlos Posted February 26, 2014 at 09:58 AM Report #546697 Posted February 26, 2014 at 09:58 AM 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; } 1 Report Rui Carlos Gonçalves
edub13 Posted February 26, 2014 at 02:19 PM Author Report #546726 Posted February 26, 2014 at 02:19 PM 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++
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now