• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

DIG_1991

Vectores, Strings e Apontadores, o início

6 mensagens neste tópico

Antes de mais, excelente fórum, tenho tirado algumas dúvidas no início, e agora decidi-me registar...  :P

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...  :wallbash: )...

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 a

funçã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...  :wallbash:

Cumps  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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);

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora