Jump to content

Vectores, Strings e Apontadores, o início


DIG_1991
 Share

Recommended Posts

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

Link to comment
Share on other 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...  🙂

Link to comment
Share on other 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);

}
Link to comment
Share on other sites

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
 Share

×
×
  • 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.