thinkabout Posted February 5, 2013 at 11:02 PM Report #494324 Posted February 5, 2013 at 11:02 PM (edited) A construção da string já consegui , só me falta por o espaço... #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> // strlen #define Dim 200 /* a) Desenvolva uma função que insira uma palavra no meio de uma frase. A frase é um conjunto de palavras separadas por um ou mais espaços A função deve receber por argumento uma frase, uma palavra e um valor inteiro positivo. Este valor indica qual é a posição da tabela frase a partir da qual a nova palavra deve ser inserida. Exemplo: Se função for chamada com o valor 16 e duas tabelas (frase e palavra) com o conteúdo: "A Pizzaria Pepe serve pizzas muito quentes." e "Verde", Na primeira tabela (frase) deve ficar guardada a seguinte informação: "A Pizzaria Pepe Verde serve pizzas muito quentes." b) Teste a função anterior. Tanto a frase como a palavra deverão estar armazenadas em tabelas de caracteres locais ao main() com a seguinte declaração: #define TAM_FRASE 150 #define TAM_PALAVRA 20 ... void main (void { char frase[TAM_FRASE], palavra[TAM_PALAVRA]; ... } A frase armazenada é um conjunto de palavras separadas por um ou mais espaços. Considere que, quando a função a desenvolver for chamada, as duas estruturas já devem estar inicializadas (respectivamente com uma frase e uma palavra, terminadas com ‘\0’). */ void Nova_Frase(char Frase[], char InserePalvavra[],int posicao) { int i,j; char aux[Dim]; for (i=0 ; i<strlen(Frase) ; i++) aux[i]=Frase[i]; for (i = posicao , j=0 ; j <= strlen(InserePalvavra); i++,j++) aux[i]=InserePalvavra[j]; // Ele não me mete um espaço após escrever a palavra ... for (i=posicao+strlen(InserePalvavra); i < strlen(Frase)+strlen(InserePalvavra)+1; i++, posicao++) aux[i]=Frase[posicao]; puts(aux); } void main() { char Frase[Dim], InserePalvavra[Dim]; int posicao; puts("Introduza uma Frase"); gets(Frase); puts("Introduza uma Palavra"); gets(InserePalvavra); puts("Introduz o numero da posicao"); scanf("%d",&posicao); Nova_Frase(Frase,InserePalvavra,posicao); } Edited February 5, 2013 at 11:07 PM by thinkabout
HappyHippyHippo Posted February 5, 2013 at 11:14 PM Report #494328 Posted February 5, 2013 at 11:14 PM tens de começar a usar as funcionalidades que tens disponíveis: char * NoveFrase(char * destino, char * frase, char * palavra, int pos) { // validação de entradas if (destino == NULL || frase == NULL || palavra == NULL || pos >= strlen(frase)) { return NULL; // retornar NULL sinalizando erro } // gravar o início da frase if (pos > 0) { memcpy(destino, frase, pos); } // gravar a palavra no local correcto memcpy(&destino[pos], palavra, strlen(palavra)); // gravar o fim da frase if (pos < strlen(frase) - 1) { memcpy(&destino[pos + strlen(frase)], &frase[pos], strlen(frase) - pos); } return destino; } int main() { char frase = "xpto"; char palavra = " XYZ "; char destino[256]; destino = NoveFrase(destino, frase, palavra, 2); printf("Frase : %s\n", frase); printf("Palavra : %s\n", palavra); printf("Resultado : %s\n", resultado); return 0; } ps : não testado mas parece que está bem IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
thinkabout Posted February 5, 2013 at 11:15 PM Author Report #494329 Posted February 5, 2013 at 11:15 PM Não posso, só nos deixam usar o strlen no exame e a vezes o toupper.
HappyHippyHippo Posted February 5, 2013 at 11:29 PM Report #494331 Posted February 5, 2013 at 11:29 PM podes trocar o memcpy com : // nota que não deverás usar este nome para a função !!! // é só para perceberes que o resultado da função é o mesmo que o memcpy void * memcpy(void * destino, void * origem, size_t quantity) { int i; if (destino == NULL || origem == NULL) { return NULL; } for (i = 0; i < quantity; i++) { destino[i] = origem[i]; } return destino; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
thinkabout Posted February 5, 2013 at 11:41 PM Author Report #494332 Posted February 5, 2013 at 11:41 PM (edited) Desculpa mas ainda estou no nível de noob, NULL e * ainda não peguei nisso. Penso que os * são ponteiros, algo que vou ver no segundo semestre. Edited February 5, 2013 at 11:47 PM by thinkabout
thinkabout Posted February 5, 2013 at 11:51 PM Author Report #494336 Posted February 5, 2013 at 11:51 PM Já arranjei uma solução meia chanata a meu ver mas funciona. for (i = posicao+1 , j=0 ; j <= strlen(InserePalvavra); i++,j++) aux[i]=InserePalvavra[j]; for (i=posicao+1+strlen(InserePalvavra); i < strlen(Frase)+strlen(InserePalvavra)+2; i++, posicao++) aux[i]=Frase[posicao]; puts(aux);
thinkabout Posted February 6, 2013 at 12:17 AM Author Report #494344 Posted February 6, 2013 at 12:17 AM (edited) Já com o ponto B, se é que o entendi. #define TAM_FRASE 150 #define TAM_PALAVRA 20 void Nova_Frase(char Frase[], char InserePalvavra[],int posicao) { int i,j; char aux[Dim]; for (i=0 ; i<strlen(Frase) ; i++) aux[i]=Frase[i]; for (i = posicao+1 , j=0 ; j <= strlen(InserePalvavra); i++,j++) aux[i]=InserePalvavra[j]; for (i=posicao+1+strlen(InserePalvavra); i < strlen(Frase)+strlen(InserePalvavra)+2; i++, posicao++) aux[i]=Frase[posicao]; puts(aux); } void main() { int posicao=15; char Frase[TAM_FRASE] = "A Pizzaria Pepe serve pizzas muito quentes." , InserePalvavra[TAM_PALAVRA] = "Verde" ; Nova_Frase(Frase,InserePalvavra,posicao); } Edited February 6, 2013 at 12:17 AM by thinkabout
pmg Posted February 6, 2013 at 09:17 AM Report #494359 Posted February 6, 2013 at 09:17 AM Repara que no exemplo apresentado (introduzir "Verde" na posicao 16 da frase "...") o que na realidade é acrescentado é "Verde " com um espaço (conta os espaços dos exemplos antes e depois da inserçao). O enunciado do problema é ambiguo no que respeita a espaços. Para resolver a ambiguidade tens várias soluções: 1) desambiguas pelo texto e ignoras o exemplo fornecido (resultado: "... Pepe Verdeserve ...") 2) desambiguas pelo exemplo e ignoras o texto do problema (resultado: "... Pepe Verde serve ...") 3) pensas mais no problema e resolves de "forma natural" De qualquer maneira convem falares com o professor para saber o que ele pensa da ambiguidade e da maneira que decidiste resolve-la. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
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