suzy Posted January 25, 2007 at 11:35 PM Report #78655 Posted January 25, 2007 at 11:35 PM 🙂 alguem tem exercicios de strings? tou com bastante dificualde nesta area
Hipnoted Posted January 25, 2007 at 11:38 PM Report #78657 Posted January 25, 2007 at 11:38 PM 1) Dado uma string qualquer introduzida pelo utilizador, mostra-a no ecrã pela ordem inversa. Ex: INPUT: "isto e uma string" OUTPUT: "gnirts amu e otsi" "Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"
sneeze Posted January 26, 2007 at 03:27 AM Report #78687 Posted January 26, 2007 at 03:27 AM 2) substituir um caracter X na string por Y ex: input: "curto bues deste forum" substituir 'u' por '1' output: "c1rto b1es deste for1m"
sandro_G Posted January 26, 2007 at 04:04 PM Report #78742 Posted January 26, 2007 at 04:04 PM 1) Dado uma string qualquer introduzida pelo utilizador, mostra-a no ecrã pela ordem inversa. Ex: INPUT: "isto e uma string" OUTPUT: "gnirts amu e otsi" Este é interessante... ||I'm the devil25, I'm G and I'm sandro_G||
Dpontes11 Posted January 26, 2007 at 09:59 PM Report #78836 Posted January 26, 2007 at 09:59 PM Em 26/01/2007 às 17:04, sandro_G disse: Este é interessante... Feito em cima do joelho... 🙂 main() { int i,tam; char input[30], output[30]; printf("\nIntroduza uma string: "); gets(input); tam=strlen(input); for(i=0;i<tam;i++) { output[i]=input[tam-i]; } printf("String de saida: %s",output); getch(); } Se tiver alguma coisa mal, digam... 😄 Não posso testá-la neste PC...
Rui Carlos Posted January 26, 2007 at 10:09 PM Report #78838 Posted January 26, 2007 at 10:09 PM De aorcdo com uma pqsieusa de uma uinrvesriddae ignlsea, não ipomtra a odrem plea qaul as lrteas de uma plravaa etãso, a úncia csioa iprotmatne é que a piremria e útmlia lrteas etejasm no lgaur crteo. O rseto pdoe ser uma ttaol csãofnuo que vcoê pdoe anida ler sem gnderas pobrlmaes. Itso é poqrue nós não lmeos cdaa lrtea isladoa, mas a plravaa cmoo um tdoo. Cosiruo não? certamente que todos perceberam a mensagem. um desafio interessante é a partir de um texto normal, devolver outro texto com as letras interiores de cada palavra permutadas de lugar (tal como acontece no texto acima). Rui Carlos Gonçalves
djthyrax Posted July 2, 2007 at 05:11 AM Report #112029 Posted July 2, 2007 at 05:11 AM 1) Dado uma string qualquer introduzida pelo utilizador, mostra-a no ecrã pela ordem inversa. Ex: INPUT: "isto e uma string" OUTPUT: "gnirts amu e otsi" #include <stdio.h> #include <string.h> int main(){ char inicial[255], final[255]; int i, ii; printf("Insira uma string: "); scanf("%s", &inicial); ii=0; for(i=(strlen(inicial)-1);i>=0;i--){ final[ii] = inicial[i]; ii++; } printf("String ao contrario: %s\n", final); return 0; } Acho que aquele ii para adicionar à final não está muito elegante... Sugestões? 2) substituir um caracter X na string por Y ex: input: "curto bues deste forum" substituir 'u' por '1' output: "c1rto b1es deste for1m" Uhm, não estou a ver... Dicas?Vão postando aí mais exercícios, tou com uma fezada que é desta que vou pó C. 🙂 Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
BadBoy Posted July 2, 2007 at 04:32 PM Report #112161 Posted July 2, 2007 at 04:32 PM vou aproveitar um bocado do código do djthyrax, espero que ele nao se importe :x Aqui esta outra maneira de fazer sem usar um vector auxiliar 🙂 #include <stdio.h> #include <string.h> int main(){ char inicial[255],tmp; int i=0, j; printf("Insira uma string: "); scanf("%s", &inicial); for(j=(strlen(inicial)-1);j>i;i++,j--){ tmp = inicial[i]; inicial[i]=inicial[j]; inicial[j]=tmp; } printf("String ao contrario: %s\n", inicial); return 0; } E fazendo uma função rápida para o outro exercicio: void TrocaCars(char *str, char ch1, char ch2){ int i=0; while(str[i] != '\0'){ if (str[i] == ch1) str[i] = ch2; i++; } return; }
djthyrax Posted July 2, 2007 at 05:00 PM Report #112168 Posted July 2, 2007 at 05:00 PM Depois de muito bate papo e esclarecimento de dúvidas com o BadBoy (Parv0 @ #p@p), aqui vai a resolução do 2: #include <stdio.h> #include <string.h> void replace(char x, char y, char *z){ int i, len = strlen(z); for(i=0;i<len;i++){ if(z[i] == x) z[i]=y; } return; } int main(){ char inicial[255], trocar, por, final[255], lixo; printf("Introduza uma string: "); scanf("%s", final); lixo = getchar(); strcpy(inicial, final); printf("Introduza o que quer substituir: "); scanf("%c", &trocar); lixo = getchar(); printf("Introduza pelo que quer substituir: "); scanf("%c", &por); replace(trocar, por, final); printf("\nOriginal: %s", inicial); printf("\nFinal: %s \n", final); return 0; } Tava com problemas à pala do enter, daí o lixo = getchar(); Alguma dica de como resolver isto? Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
TheDark Posted July 2, 2007 at 11:00 PM Report #112303 Posted July 2, 2007 at 11:00 PM Posso optimizar? Sim, eu sei, sou obcecado. void replace(char x, char y, char *z){ for(; *z != 0; ++z) if( *z == x ) *z=y; } PS - Ninguém pegou na proposta do Rui Carlos porquê? PS2 - Já agora deixo a minha proposta: Dada uma string, inverter a ordem das palavras. Ex: IN: "uma frase qualquer" OUT: "qualquer frase uma" Desaparecido.
djthyrax Posted July 3, 2007 at 03:26 AM Report #112339 Posted July 3, 2007 at 03:26 AM Em 03/07/2007 às 01:00, TheDark disse: PS2 - Já agora deixo a minha proposta: Dada uma string, inverter a ordem das palavras. Ex: IN: "uma frase qualquer" OUT: "qualquer frase uma" Dicas? EDIT: Já tenho isto quase feito. Uma coisinha, como vejo o tamanho de um vector? Off-topic: O meu primeiro segmentation fault: http://img154.imageshack.us/my.php?image=segmentationfaultym4.png ❤️ Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
mynos Posted July 3, 2007 at 08:16 AM Report #112345 Posted July 3, 2007 at 08:16 AM Para veres o tamnho de um vector em bytes: tamanho = sizeof(vector); O teu segmentation fault, deve ser porque na funcao strtok estas a usar um caracter " ". http://www.cppreference.com/stdstring/strtok.html, aqui tens um pequeno resumo da funcao... define antes uma string como por exemplor char car_delim[] = " "; e depois usas a string no strtok... experimenta..procura...e le... 🙂 cumps mynos
Cypher Posted July 3, 2007 at 11:26 AM Report #112368 Posted July 3, 2007 at 11:26 AM #include <stdio.h> #include <string.h> void replace(char x, char y, char *z){ int i, len = strlen(z); for(i=0;i<len;i++){ if(z[i] == x) z[i]=y; } return; } int main(){ char inicial[255], trocar, por, final[255], lixo; printf("Introduza uma string: "); scanf("%s", final); lixo = getchar(); strcpy(inicial, final); printf("Introduza o que quer substituir: "); scanf("%c", &trocar); lixo = getchar(); printf("Introduza pelo que quer substituir: "); scanf("%c", &por); replace(trocar, por, final); printf("\nOriginal: %s", inicial); printf("\nFinal: %s \n", final); return 0; } bem isto inda da para por a compilar mais rapido ... aqui um bocadinho de optimizaçao de codigo 🙂 :) ja que tamos dentro do assunto deixo aqui umas dicas, 🙂 quem compila em gcc pode escolher o nivel de optimização, quanto mais baixa for a optimizaçao mais pequeno é o ficheiro quanto mais rapido for maior é o ficheiro (uma pequena analogia as Artitecturas RISC e CISC ) ... melhor melhor é de nivel 3 rapido e pequeno ... mas o utilizador pode fazer estas optimizaçoes, ta a fazer aqui o trabalho do compilador ... por exemplo com um for aproveitanto aqui o codigo do djthyrax fica mais rapido depois de compilado de para assembly que é onde vai bater tudo xD desta maneira void replace(char x, char y, char *z){ int i, len = strlen(z); for(i=0;i<len;i+=2){ if(z[i] == x) z[i+1]=y; if(z[i] == x) z[i+2]=y; } return; } desta maneira tamos a aproveitar mais a memoria cache... baixa os nivel de ciclos de relogio... ja agora este tipo de optimizaçao chama-se loop unrolling.... entre outras , basta meter no google e tao logo la umas poucas ... muitos programadores deixam este trabalho para o compilador... na minha opiniao acho que é a lingua portuguesa da programaçao 😛 , saber escrever um codigo.... ja veio numa revista um excerto de como saber escrever codigos... saber comentalos.... utilizar a identaçao... etc, mas isto pouco afecta a memoria e a rapidez ao contrario que isto é crucial senao vejam.... ja agora existem varios pacotes de benchmarking que permitem avaliar o desempenho SPEC, TPC ... cumps..
djthyrax Posted July 3, 2007 at 02:27 PM Report #112407 Posted July 3, 2007 at 02:27 PM Para veres o tamnho de um vector em bytes: tamanho = sizeof(vector); O teu segmentation fault, deve ser porque na funcao strtok estas a usar um caracter " ". http://www.cppreference.com/stdstring/strtok.html, aqui tens um pequeno resumo da funcao... define antes uma string como por exemplor char car_delim[] = " "; e depois usas a string no strtok... experimenta..procura...e le... 🙂 cumps mynos Já lá pus o sizeof(). Mas mesmo usando isso para o strtok, ele faz segmentation fault: #include <stdio.h> #include <string.h> int main(){ char inicial[255], *final; char space[] = " "; int i; printf("Introduza uma string: "); scanf("%s", inicial); final = strtok(inicial, space); printf("Resultado: "); for(i=(sizeof(final)-1);i>=0;i--) printf("%s", final[i]); return 0; } Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
djthyrax Posted July 3, 2007 at 02:32 PM Report #112408 Posted July 3, 2007 at 02:32 PM por exemplo com um for aproveitanto aqui o codigo do djthyrax fica mais rapido depois de compilado de para assembly que é onde vai bater tudo xD desta maneira void replace(char x, char y, char *z){ int i, len = strlen(z); for(i=0;i<len;i+=2){ if(z[i] == x) z[i+1]=y; if(z[i] == x) z[i+2]=y; } return; } desta maneira tamos a aproveitar mais a memoria cache... baixa os nivel de ciclos de relogio... . Isso é muito bonito, mas nesse for, se o len for par, na ultima iteração, estás a fazer uma comparação desnecessariamente (o ultimo if) Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
TheDark Posted July 3, 2007 at 03:23 PM Report #112419 Posted July 3, 2007 at 03:23 PM Cypher, tens aí um probleminha no ciclo. Tens que comparar e substituir no mesmo índice: void replace(char x, char y, char *z){ int i, len = strlen(z); for(i=0;i<len;i+=2){ if(z[i] == x) z[i]=y; if(z[i+1] == x) z[i+1]=y; } return; } Já agora, cuidado com o unrolling. Se utilizares mais de 2 unidades, tens que ter a certeza que não ultrapassas o limite da string. Dicas? Bem... usando o strtok, guardar os apontadores para as palavras num array e depois apresentá-las do fim para o início; não esquecer de adicionar espaços 😄 claro que isso é onde vais provavelmente chegar... :🙂 Isso é muito bonito, mas nesse for, se o len for par, na ultima iteração, estás a fazer uma comparação desnecessariamente (o ultimo if) Ainda assim, se a performance for muito essencial, estás a trocar uns quantos jmps por uma comparação a mais. É uma boa troca 😄 Desaparecido.
djthyrax Posted July 3, 2007 at 04:29 PM Report #112433 Posted July 3, 2007 at 04:29 PM Em 03/07/2007 às 17:23, TheDark disse: Bem... usando o strtok, guardar os apontadores para as palavras num array e depois apresentá-las do fim para o início; não esquecer de adicionar espaços 😄 claro que isso é onde vais provavelmente chegar... :🙂 http://www.portugal-a-programar.pt/forums/topic/0-find-topic/?do=findComment&comment=112407 <- Diz-me o que está mal e como o resolver 🙂 Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
Cypher Posted July 3, 2007 at 06:24 PM Report #112456 Posted July 3, 2007 at 06:24 PM Em 03/07/2007 às 16:32, djthyrax disse: Isso é muito bonito, mas nesse for, se o len for par, na ultima iteração, estás a fazer uma comparação desnecessariamente (o ultimo if) de qualquer das maneiras quando o compilador passar isto para assembly vai por dessa maneira ... aqui so tas a fazer o trabalho do compilador ... mas este nao foi um grande exemplo dunfunde um bocado quem está a aprender... vou dar este, este exemplo, de como baixa os niveis de relogio... for [i=1;i<=3000;i++ ] a[i]=a[i]+b[i]*c; ; com optimizaçao ficaria assim for [i=1;i<=3000;i+=3] a[i]=a[i]+b[i]*c; a[i+1]=a[i+1]+b[i+1]*c; a[i+2]=a[i+2]+b[i+2]*c; ; ou seja cconsiste em maximizar o numero de instruções por cada iteraçao de um ciclo.. neste caso à um ganho de optimização de 25 %, tal cmo disse abocado quanto mais elevado escolheres o teu grau quando compilas com o gcc maior fica o ficheiro ... repara se escolheres o maior grau em alguns o compilador, neste casso mudei para 3 instruçoes dentro do for logo percorre o for 1000 vezes 🙂 em alguns programas poderia chegar ao transformar as 1000 execuçoes em 3 execuçoes tento 1000 instruçoes dentro do for... esta aqui uma ideia basica das arquitectuaras RISC (Reduced Instruction Set Computing), por isso é que dizem que no ultimo nivel de optmimizaçao é mais rapido mas o ficheiro é maior... outro modo que o ususal dos programadores faz é isto... a*=b; c = a; d =e; ora para tentar anular a dependecia altera se a ordem das execuções das instruçoes ficaria assim a*=b; d =e; c = a; neste caso tem uma melhoria seca de 10 %. Um caso em que tem uma melhoria de 60 % nao é brincadeira é bue ... é na suspensao do pipeline... a maioria dos programadores faz isto bem mas, não se apercebe ... 🙂 por exemplo for (i=1;i<=3000;i++ ) for (j=1;j<=3000;j++ ) a[j ][ i ] =0; agora com uma melhoria de 60% 😁 for (i=1;i<=3000;i++ ) for (j=1;j<=3000;j++ ) a[i ][ j ] =0; isto acontece por causa da forma como sao acedidos os elementos de uma matriz e ordem pela qual estao armazenados em memoria é crucial para maximizar os acertos na cache... leiam um bocado sobre a pipeline.... 🙂 , nao compete só ao programador programar, tem que saber como é que funciona o sistema interno... ou seja assembly ... bem existem poucos mais e tambem importantes metodos de optimização por isso quem quizer aprender a programar, porque programar nao é so meter o codigo... à que saber por que ordem por o codigo, etc... ham e aconselho a que se nao quizerem aprender que vejam pelo menos como é codificar em assembly... em arquitecturas SISC e RISC, porque na versao final do programa ou seja quando chegar à parte de assembly denota-se o melhor codigo e o pior... ja agora existe software para o linux que analisa os codigos e diz qual é o melhor nivel de optimização a utilizar, por isso se tiverem curiosos sobre este tema ... a arte de bem programar 😛 , google tem la muita coisa.... cumps...
djthyrax Posted July 3, 2007 at 08:24 PM Report #112495 Posted July 3, 2007 at 08:24 PM Cypher, eu percebi a ideia. 🙂 Agora, digam-me é como uso o strtok porque parece que o estou a usar mal... :🙂 Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
Triton Posted July 3, 2007 at 09:11 PM Report #112515 Posted July 3, 2007 at 09:11 PM Cypher, eu percebi a ideia. 😄 Agora, digam-me é como uso o strtok porque parece que o estou a usar mal... :🙂 Já te mostrei no IRC a página com um exemplo, que até já foi referida aqui no fórum... parece que estás a gozar... <3 life
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