guilherme1805 Posted January 21, 2016 at 06:39 PM Report Share #592284 Posted January 21, 2016 at 06:39 PM (edited) Boas, Estou a fazer um exercício onde me é dada uma string e partir da mesma tenho que criar outra string com as palavras da primeira dispostas de trás para a frente. Ex: String 1: o mundo e belo String 2: belo e mundo o Não faço a mínima ideia do processo que tenho que proceder para resolver o exercício. Se alguém pudesse ajudar? (Não quero o exercício resolvido quero apenas saber como chegar à sua resolução) Edited January 21, 2016 at 06:40 PM by guilherme1805 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 21, 2016 at 08:25 PM Report Share #592288 Posted January 21, 2016 at 08:25 PM a maneira mais simples deverá ser: - saber as palavras da string original - guardar essas palavras numa lista - escrever essas palavras pela ordem inversa numa string 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
killezio Posted January 22, 2016 at 06:04 AM Report Share #592298 Posted January 22, 2016 at 06:04 AM yap um vetor de duas dimensões deve-te ajudar. pensa em que uma das dimensões é a palavra e a outra são as letras dessa palavra, do género vetor[word][letter] depois de gravares começa da última posição do word até à posição 0 passando sempre por todas as posições do letter 1 Report Link to comment Share on other sites More sharing options...
guilherme1805 Posted January 22, 2016 at 12:21 PM Author Report Share #592311 Posted January 22, 2016 at 12:21 PM (edited) Segui os conselhos, cheguei a este resultado: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char texto[]="um dois tres"; char texto2[20]; char matriz[40][40]; int i,palavra=0,caracter=0; for(i=0;i<strlen(texto);i++){ if(texto[i]==' '){ matriz[palavra][caracter]=' '; caracter++; matriz[palavra][caracter]='\n'; palavra++; caracter=0; } else{ matriz[palavra][caracter]=texto[i]; caracter++; } } for(palavra;palavra>=0;palavra=palavra-1){ strcat(texto2,matriz[palavra]); } printf("%s",texto2); return 0; } O output está assim: nao percebi qual é o erro no programa?! Edited January 22, 2016 at 12:36 PM by guilherme1805 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 22, 2016 at 01:10 PM Report Share #592315 Posted January 22, 2016 at 01:10 PM (edited) existem mais do que um problema, mas para dar um empurrãozinho : inicializa as strings ps : quando tiveres isso pronto, digo-te como fazer de uma maneira mais "engraçada" Edited January 22, 2016 at 01:35 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
guilherme1805 Posted January 22, 2016 at 06:43 PM Author Report Share #592354 Posted January 22, 2016 at 06:43 PM Obrigado pela ajuda! Está resolvido. #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char texto[]="um dois tres quatro cinco seis "; char texto2[20]=""; char matriz[20][20]; int i,palavra=0,caracter=0; for(i=0;i<strlen(texto);i++){ if(texto[i]==' '){ matriz[palavra][caracter]=' '; caracter++; matriz[palavra][caracter]='\0'; palavra++; caracter=0; } else{ matriz[palavra][caracter]=texto[i]; caracter++; } } for(palavra--;palavra>=0;palavra--){ strcat(texto2,matriz[palavra]); } printf("%s",texto2); return 0; } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 22, 2016 at 07:56 PM Report Share #592364 Posted January 22, 2016 at 07:56 PM (edited) Ok quando chegar a cada testo e mando a minha solucao edit essa solução tem vários problemas e um deles é dados pelo próprio exemplo que apresentas. para veres esses problemas responde a estas duas questões - qual o tamanho da string final e qual o tamanho reservado para esta (variável texto2) ? - o que acontece se, por acaso, a frase tiver mais do que 20 palavras ? ao responderes a estas questões, apresento-te a minha solução onde não terás esses problemas Edited January 22, 2016 at 10:36 PM by HappyHippyHippo 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
guilherme1805 Posted January 23, 2016 at 12:47 PM Author Report Share #592398 Posted January 23, 2016 at 12:47 PM Ok quando chegar a cada testo e mando a minha solucao edit essa solução tem vários problemas e um deles é dados pelo próprio exemplo que apresentas. para veres esses problemas responde a estas duas questões - qual o tamanho da string final e qual o tamanho reservado para esta (variável texto2) ? - o que acontece se, por acaso, a frase tiver mais do que 20 palavras ? ao responderes a estas questões, apresento-te a minha solução onde não terás esses problemas Já consegui arranjar uma solução mais consistente embora não tenha sido feita por mim deu para perceber o método mais simples e correto //by Tofran #include <stdlib.h> #include <string.h> int main() { char st[] = "ola tudo bem"; char * prev; for(int i = strlen(st)-1; i >= -1; i--){ if(i == -1 || st[i] == ' '){ int j = i+1; while(j < strlen(st) && st[j] != ' '){ printf("%c", st[j]); j++; } printf(" "); } prev = st[i]; } return 0; } Link to comment Share on other sites More sharing options...
Solution HappyHippyHippo Posted January 23, 2016 at 01:36 PM Solution Report Share #592401 Posted January 23, 2016 at 01:36 PM (edited) Já consegui arranjar uma solução mais consistente embora não tenha sido feita por mim deu para perceber o método mais simples e correto //by Tofran #include <stdlib.h> #include <string.h> int main() { char st[] = "ola tudo bem"; char * prev; for(int i = strlen(st)-1; i >= -1; i--){ if(i == -1 || st[i] == ' '){ int j = i+1; while(j < strlen(st) && st[j] != ' '){ printf("%c", st[j]); j++; } printf(" "); } prev = st[i]; } return 0; } esse código não guarda a string final (só faz output), assim como não é nada eficiente. isto porque vejo dois ciclo explícitos, e dois implícitos. olha que sempre que fazes a chamada da função strlen, é um ciclo. e para piorar as coisas, uma dessas chamadas ao strlen, está numa verificação da condição de paragem de um ciclo, que quer dizer que será chamada sempre que ciclo while é executado. a minha solução é : #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char text[] = "um dois tres"; char* reversed = NULL, *tok; printf("original : %s\n", text); if ((reversed = calloc(strlen(text) + 1, 1)) == NULL) return -1; tok = strtok(text, " "); while (tok) { size_t length = strlen(tok); memmove(&reversed[length + 1], reversed, strlen(reversed)); memcpy(reversed, tok, length); reversed[length] = ' '; tok = strtok(NULL, " "); } printf("reversed : %s\n", reversed); free(reversed); return 0; } este solução tem somente um único problema, que se conseguires descubrir (ou até já sabes) dou-te os meus parabéns Edited January 23, 2016 at 01:37 PM by HappyHippyHippo 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
killezio Posted January 24, 2016 at 12:36 PM Report Share #592425 Posted January 24, 2016 at 12:36 PM (edited) só agora reparei que já tinha feito esse exercício ( e ainda por cima à poucos dias atrás), vou por isso deixar aqui a minha solução: #include <stdio.h> #include <math.h> #include <string.h> #define maxWords 150 #define maxLetters 100 void abrir(FILE **read,FILE **write) { *read = fopen("teste2.in","r"); *write = fopen("resposta3","w"); } void createSTR(FILE **read,char *str){ int pos = 0; char ch; while ((ch = fgetc(*read)) != '\n') str[pos++] = ch; str[pos] = '\0'; } int main() { FILE *read,*write; char *word[maxWords]; char str[150]; char words[maxWords][maxLetters]; abrir(&read,&write); int e,i,k; char ch; short int N; char *token; fscanf(read,"%hd",&N); fgetc(read); for (e = 0;e<N;e++) { createSTR(&read,str); i = -1; fprintf(write,"Case #%d: ",e+1); for ( token = strtok(str," ") ; token != NULL ; token = strtok(NULL , " ")){ word[++i] = token; } for (k = i;k >= 0;k--){ fprintf(write," %s ",word[k]); } fprintf(write,"\n"); } fclose(read); fclose(write); return 0; } O exercício não é igual mas no fundo é a mesma coisa Edited January 27, 2016 at 04:49 PM by killezio GeSHi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 24, 2016 at 03:14 PM Report Share #592437 Posted January 24, 2016 at 03:14 PM Esse codigo tem chamada a codigo nao apresentado, e novamente nao guarda p resultado, somente envia para um stream IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
killezio Posted January 24, 2016 at 06:33 PM Report Share #592451 Posted January 24, 2016 at 06:33 PM Esse codigo tem chamada a codigo nao apresentado, e novamente nao guarda p resultado, somente envia para um stream tens razão, devia ter comentado mas inicialmente este código era só para resolver um problema, não estava à espera de ter que o usar depois disso, por isso nem me lembrei de comentar quando postei aqui. Também o objetivo era por o resultado num ficheiro.. aqui está o problema para quem estiver interessado: https://code.google.com/codejam/contest/351101/dashboard#s=p1 Link to comment Share on other sites More sharing options...
killezio Posted January 27, 2016 at 04:49 PM Report Share #592646 Posted January 27, 2016 at 04:49 PM só agora percebi que falta código aqui. duas funções se não me engano... apaguei-as sem querer no original 😞 já corrigi 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