DIG_1991 Posted December 3, 2009 at 01:43 AM Report Share #298532 Posted December 3, 2009 at 01:43 AM Antes de mais, excelente fórum, tenho tirado algumas dúvidas no início, e agora decidi-me registar... 😛 Bem estou no meu primeiro ano de Eng Electrotécnica e de Computadores e comecei já a programar em C... Tenho andado a ler o livro "Linguagem C" de Luís Damas, mas mesmo assim ando com dúvidas muito complicadas no que toca ao acima referido no título do tópico... Entendo a sua utilização e para que servem, mas o meu problema está na aplicação... Parte da culpa da não compreensão é minha, porque faltei duas vezes às aulas teóricas desta matéria, uma porque tinha teste de ALGA e outra porque estava doente... Na aula de Programação prática pouco ou nada consegui fazer, mas como não gosto de deixar trabalhos para trás (torna-se confuso, visto que na próxima aula vou ter outra matéria na prática... )... Bem chega de conversa e passemos à questão... Tenho o seguinte código: #include <stdio.h> #include <ctype.h> /* define isspace */ #include <string.h> #define bool int #define TRUE 1 #define FALSE 0 #define MAX_WORD_LENGTH 81 #define MAX_WORD 10 #define MAX_TEXT_LENGTH 8000 int quantas_palavras () { int num; do { scanf(" %d", &num); if ((num < 1) || (num > MAX_WORD)) printf("O número de palavras deve ser > 0 e < %d!\n", MAX_WORD); } while ((num < 1) || (num > MAX_WORD)); return num; } void ler_substituicoes (int num, char chave[][MAX_WORD_LENGTH], char colocar[][MAX_WORD_LENGTH]) { } bool le_texto(char * text, int maximo) { } void substitui_texto(int num, char chave[][MAX_WORD_LENGTH], char colocar[][MAX_WORD_LENGTH], char * text, char * text_changed) { } main() { int n_word= 0; char chave[MAX_WORD][MAX_WORD_LENGTH]; char colocar[MAX_WORD][MAX_WORD_LENGTH]; char text[MAX_TEXT_LENGTH]; char text_changed[MAX_TEXT_LENGTH]; printf("Quantas palavras tem a lista de substituicao?\n"); n_word = quantas_palavras (); printf("Introduza as palavras a retirar e quais a colocar\n"); ler_substituicoes(n_word, chave, colocar); printf("Introduza o texto a substituir. "); printf("Termine com uma linha apenas com um ponto final:\n"); if (!le_texto(text, MAX_TEXT_LENGTH)) { printf("Não foi introduzido texto\n"); return; } substitui_texto(n_word, chave, colocar, text, text_changed); printf("O texto inicial eh:\n%s\n", text); printf("O texto substituido eh:\n%s\n", text_changed); } Como devem ter reparado, estão ali 3 lacunas... Bem o que o exercício pede é Comece por escrever a função le_texto. Talvez uma boa dica seja escrever afunção de tal maneira que pergunte primeiro se o utilizador quer usar um texto pré- definido. Se sim, preenche o vector text com um texto qualquer. Assim, o programador não perde muito tempo a introduzir textos nesta fase inicial de desenvolvimento. Se não, o utilizador escreve o texto. Teste o programa para ver se faz o que pretende. Como as outras funções não existem, também não fazem mal. Vamos agora ler os textos a substituir na função ler_substituicoes. A ideia pode ser pedir linha a linha pois pode ser mais do que uma palavra. Assim, para ficar mais simples, a função pode fazer o seguinte (no caso de se ter pedido duas substituições): Introduza o 1o texto a retirar: longo Introduz o 1o texto a colocar: comprido Introduza o 2o texto a retirar: de strings Introduza o 2o texto a colocar: muita Para substituir alguma coisa ela tem de existir. Para além disso, fazer n substituições pode ser feito fazendo n vezes uma substituição. Assim a função substitui_texto recebe uma matriz, mas pode chamar outra que faz, de facto, a substituição e envia para essa outra, vector a vector (1o, 2o, etc.). A primeira parte tentei fazer do seguinte modo: bool le_texto(char * text, int maximo) { char escolha; printf("Insira o texto ou escolha um texto predefinido\n\t0 - Inserir texto\n\t1 - Texto Predefinido\n"); scanf(" %c", &escolha); if (escolha==0) { printf("Insira o texto\n"); scanf(" %s", text); } else if(escolha==1) { puts ("Esta é uma longa string de caracteres"); } } No entanto não me está a bater certo, já que passa a parte da escolha (no menu que criei) e nada faz, supostamente deveria pedir um texto ou colocar o texto que eu fiz...) :fartnew2: Agradecia ajuda nisto pessoal, é só para ter ideia de como aplicar isto... Cumps 🙂 Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 3, 2009 at 10:45 AM Report Share #298545 Posted December 3, 2009 at 10:45 AM Estás a comparar chars com inteiros. O char 0 é diferente do inteiro 0, daí que nunca aconteça nada, pois essas condições nunca são verdadeiras. Ou lês inteiros, ou então fazes escolha=='0'. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
DIG_1991 Posted December 3, 2009 at 01:58 PM Author Report Share #298581 Posted December 3, 2009 at 01:58 PM Estás a comparar chars com inteiros. O char 0 é diferente do inteiro 0, daí que nunca aconteça nada, pois essas condições nunca são verdadeiras. Ou lês inteiros, ou então fazes escolha=='0'. Ok, obrigado... Agora estou com problemas é em colocar o texto predefinido, mas vou tentar dar a volta a isto... Já agora, alguma sugestão para as funções ler_substituicoes e substituir_texto? Agradecia imenso a ajuda... 🙂 Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 3, 2009 at 03:08 PM Report Share #298588 Posted December 3, 2009 at 03:08 PM A ler_substituicoes parece-me que se resume a um ciclo, com a leitura das palavras. A substituir_texto já será mais complicada. Funções como a strsep/strtok ou a strstr podem ser úteis para resolver o problema. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
DIG_1991 Posted December 3, 2009 at 08:20 PM Author Report Share #298630 Posted December 3, 2009 at 08:20 PM Eu e um amigo meu tivemos um tempo dedicado a este exercício e avançámos muita coisa... Agora estamos é com um problema, ainda falta colocar o menu, e só a última palavra de cada frase é que é substituida... Sugestões? Aqui está o que fizemos: #include <stdio.h> #include <ctype.h> /* define isspace */ #include <string.h> #define bool int #define TRUE 1 #define FALSE 0 #define MAX_WORD_LENGTH 81 #define MAX_WORD 10 #define MAX_TEXT_LENGTH 8000 int quantas_palavras () { int num; do { scanf(" %d", &num); if ((num < 1) || (num > MAX_WORD)) printf("O número de palavras deve ser > 0 e < %d!\n",MAX_WORD); } while ((num < 1) || (num > MAX_WORD)); return num; } void ler_substituicoes (int num, char chave[][MAX_WORD_LENGTH], char colocar[][MAX_WORD_LENGTH]) { int i; for (i=0; i<num; i++) { printf("Palavra chave %d -> ",i+1); scanf(" %s ", chave[i]); printf("Palavra a Substituir %d -> ",i+1); scanf(" %s ", colocar[i]); getchar(); /* para consumir 0a */ } } bool le_texto(char *text, int maximo) { bool ttext = 0; *text = getchar(); while ((*text != '.') && (maximo-- != 0)) { text++; *text = getchar(); ttext = 1; } *text = 0; return ttext; } int verificaPal (char *chave, char *text) { /* se chave existe devolve tamanho */ int tam = 0; while ((*chave == *text) && (*chave !=0) && (*text!=0)) { tam++; chave++; text++; } if ((*chave == 0) && ( (*text == 0x0d) || (*text == 0x0a) || (*text == ' ') || (*text == 0)) ) return tam; else return 0; } void substitui_texto(int num, char chave[][MAX_WORD_LENGTH], char colocar[][MAX_WORD_LENGTH], char * text, char * text_changed) { int nCar; int i; char *ptr, *ptr2; char *pChave, *pColocar; ptr=text; ptr2=text_changed; for (i=0; i<num; i++) { text=ptr; text_changed=ptr2; while (*text != 0) { pChave = &chave[i][0]; pColocar = &colocar[i][0]; if ((nCar = verificaPal(pChave, text))) { printf("verifica pal %c\n", *text); while (*pColocar != 0) { *text_changed = *pColocar; text_changed++; pColocar++; } text = text + nCar; } else { while ((*text != ' ') && (*text != 0x0d) && (*text != 0x0a)) { *text_changed = *text; text_changed++; text++; } while ((*text == ' ') || (*text == 0x0d) || (*text == 0x0a)) { *text_changed = *text; text_changed++; text++; } } } } } void main() { int n_word= 0; // Número de palavras no array word char chave[MAX_WORD][MAX_WORD_LENGTH]; // Palav a substituir char colocar[MAX_WORD][MAX_WORD_LENGTH]; // Substituições char text[MAX_TEXT_LENGTH]; // Texto inicial char text_changed[MAX_TEXT_LENGTH]; // Texto modificado printf("Quantas palavras tem a lista de substituicao?\n"); n_word = quantas_palavras (); printf("Introduza as palavras a retirar e quais a colocar\n"); ler_substituicoes(n_word, chave, colocar); printf("Introduza o texto a substituir.\n "); printf("Termine com uma linha apenas com um ponto final:\n"); if (!le_texto(text, MAX_TEXT_LENGTH)) { printf("Não foi introduzido texto\n"); printf("%s %s", chave[0], colocar[0]); return; } printf("O texto e %s\n",text); substitui_texto(n_word, chave, colocar, text, text_changed); printf("O texto inicial eh:\n%s\n", text); printf("O texto substituido eh:\n%s\n", text_changed); } Link to comment Share on other sites More sharing options...
DIG_1991 Posted December 3, 2009 at 09:55 PM Author Report Share #298644 Posted December 3, 2009 at 09:55 PM Precisava mesmo de saber pessoal... 🙂 Link to comment Share on other sites More sharing options...
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