Ir para conteúdo
Fórum Script Brasil

Jonas de Abreu

Membros
  • Total de itens

    137
  • Registro em

  • Última visita

Tudo que Jonas de Abreu postou

  1. Ai vai: FILE *in; FILE *out; in = fopen("arquivo.entrada", "rb"); out = fopen("arquivo.saida", "wb+"); if (in == NULL || out == NULL){ fprintf(stderr, "Falha na abertura de arquivos\n"); return 1; } while (!feof(in)) fputc(fgetc(in), out); fclose(in); fclose(out);
  2. Acredito que seja mais facil voce usar as funcoes fopen e fclose para trabalhar com seus arquivos. A fopen devolve um parametro do tipo FILE* que é um ponteiro para o filehandler do seu arquivo (sera NULL caso falhe). Sintaxe: FILE *fopen(char *arquivo, char *op); op é uma string que diz qual o modo de abertura do arquivo. Para ler, use "rb" (o b é para abrir em modo binario. faz bastante diferenca quando você esta programando para mais de um sistema operacional) e para imprimir use "wb+" (o + é para ele criar o arquivo caso não exista). Tendo aberto com o fopen, voce pode usar fgetc para ir lendo byte por byte do arquivo. Sintaxe: char fgetc(FILE *arq); E a cada byte lido, voce usa fputc para gravar no arquivo de destino (que voce já abriu em modo de escrita) Sintaxe: int fputc(char c, FILE *arq); Voce deve parar isso quando a funcao feof indicar que o arquivo inicial acabou (devolveu algum valor diferente de 0). Sintaxe: int feof(FILE *arq); Caso voce queira usar open e close para trabalhar com seus arquivos (não é muito recomendado uma vez que fopen e fclose estao disponiveis em qualquer sistema), de uma olhada nas funcoes read e write.
  3. Bom, voce vai precisar de duas strings. Uma para armazenar a frase e a outra (do mesmo tamanho) para armazenar a frase invertida. Dai, voce faz um for que vai de 0 ateh strlen(string1). Dentro do for, voce grava na posicao da contadora o valor da string1[strlen(string1) - i] algo assim: for (i = 0; i < strlen(string1); i++){ string2[i] = string1[strlen(string1) - i]; }
  4. Antes de dividir por CLOCKS_PER_SEC, divide essa constante por 1000 tempo_gasto = ((double)(tf - to) / (((double)CLOCKS_PER_SEC)/1000);
  5. Jonas de Abreu

    Puzzle-8

    Por acaso voce esta falando do A* de inteligencia artificial?
  6. O modificador Private impede que outras classes acessem a variavel (ou funcao) de forma direta. Isso é bom pra voce garantir a integridade dos dados dentro da classe. Por exemplo, voce pode não querer que um programador que esteja usando uma classe sua para Pilha tenha acesso aos dados dentro da pilha. Apenas as operacoes de uma pilha (empilha, desempilha, olha o topo, etc). Assim voce garante que ela ira cumprir suas funcoes. Voce tambem impede que o codigo dos outros fiquem dependentes da forma como sua classe esta implementada pois se ele for obrigado a usar setters e getters, quando voce modificar a estrutura da sua classe, voce tambem modifica os setters e getters e assim o codigo dele não precisa ser modificado.
  7. Tente dar uma olhada na lib gnet. não conheco ela muito bem, mas talvez ela tenha suporte ao que voce precisa.
  8. Jonas de Abreu

    Significado "abs"

    O abs devolve o valor absoluto do numero, isto é, o valor do numero sem levar em consideracao o sinal.
  9. Geralmente, pra instalar (na mao) algum programa, a receita não varia de uma distribuicao de linux para a outra. Eu não conheco o CodeBlocks, mas provavelmente ele deve seguir a receita basica (a maioria dos software abertos são instalados assim): ./configure make sudo make install E no sudo ele vai pedir a senha pra fazer instalacao.
  10. Jonas de Abreu

    Numeros Primos

    Um algoritmo mais eficiente pra gerar todos os numeros primos ate um determinado limite é o Crivo de Erathostenes. O nome é estranho mas o algoritmo é simples. Primeiro, voce precisa de um vetor (com o mesmo tamanho do seu limite) inicializado com 1 em todas as posicoes. Segundo, marque a posicao 0 e 1 com 0 (eles não são primos) Depois comece a percorrer o vetor. Quando encontrar "1", esse numero é primo e você deve tirar todos os multiplos dele. Voce faz isso com um outro laco que comeca em posicao do primo ao quadrado e vai ate o fim do vetor, mas o incremento é a proprio numero primo. Fazendo isso ateh a raiz do limite, voce garante que qualquer posicao que marque "1" no vetor é um numero primo. De uma olhada neste artigo da wiki http://pt.wikipedia.org/wiki/Erat%C3%B3ste...rat.C3.B3stenes
  11. Acabei de notar que a primeira linha do seu codigo esta errada. voce escreveu "incluide" no lugar de "include". Pode ser isso. Se não for, coloca o erro que ele esta dando.
  12. Uma coisa que pode estar dando SegFault é que voce não esta verificando se o fopen esta realmente abrindo o arquivo. Quando ele falha, devolve NULL. E quando você da um fopen ("nome_arquivo", "r"), se o arquivo não existir, ele com certeza falha.
  13. Voce esqueceu de abrir e fechar chaves para delimitar o bloco do while. quando você não faz isso, o while so executa o primeiro comando depois dele while (i <= 10) { /*seus comandos aqui*/ }
  14. Para resolver a segunda, voce fazer dessa forma: 1-inicialize a variavel "maior" com o intervalo do primeiro e segundo elemento (armazene tambem a posicao que seria 0) 2-percorra o vetor verificando se o intervalo das duas posicoes atuais (atual e atual + 1) e maior que a variavel "maior" 3-se for maior, "maior" recebe o novo intervalo e voce atualiza a posicao que voce armazenou no item 1.
  15. Bom, quando voce encontrar um caractere que deseja remover, voce pode mover o resto da string uma posicao para a esquerda. Assim o caractere simplesmente vai sumir. Se voce vizer isso para todas as ocorrencias da letra, voce consegue o efeito desejado.
  16. não conheco muito bem a sintaxe de C++, mas deve ser algo do tipo: ClassName foo[MAX]; Daai seu vetor de classes se chama foo. Voce tambem pode fazer alocacao dinamica de memoria: ClassName *foo; foo = (ClassName *)malloc(sizeof(ClassName) * MAX) E mais tarde voce pode realocar este vetor com a funcao realloc: foo = realloc(foo, NOVO_MAX); Voce so precisa lembrar que precisa ainda inicializar todas as posicoes do vetor com o construtuor. Senao vai dar algum erro bizarro (alguns compiladores vao fazer isso pra voce, mas é melhor fazer de forma explicita pra garantir) for (i = 0; i < MAX; i++){ foo[i] = new ClassName(); }
  17. Serializadores são funcoes que recebem um objeto (em C seriam as structs) e gravam ele em um arquivo. Java vem com uma interface Serializer que torna possivel a serializacao. C++ eu não sei se tem suporte. Pra C, eu nunca vi, mas estou trabalhando em uma solucao e assim que tiver terminado eu abro o fonte dela.
  18. Muito boa a sua pergunta. Na minha opiniao a verdadeira magica da programacao esta na manipulacao de ponteiros. Primeiramente, um ponteiro nada mais é, como voce mesmo disse, que um endereco de memoria. Mas isso é um recurso muito maior do que parece. Um vetor é um ponteiro. A variavel que voce declara como vetor nada mais é que um ponteiro para o primeiro elemento do seu vetor. Alocacao dinamica da memoria so é possivel porque voce pode armazenar o endereco dela em um ponteiro. Quando voce da um malloc, por exemplo, voce nem imagina onde a memoria esta, mas voce pode acessa-la usando um ponteiro. Quando voce constroi estruturas de dados mais complexas (como listas ligadas, arvores, heaps, etc) voce precisa o tempo todo lidar com ponteiros pois estas estruturas são alocadas em qualquer area da memoria. Mas da pra usar exemplos mais simples. Quando voce quer fazer uma funcao que troque de lugar o valor de duas variaveis, o que voce faz? Voce faz a funcao receber dois ponteiros para que a alteracao feita dentro da funcao se reflita fora tambem. Alias, na maior parte das vezes que voce precisa que uma funcao tenha efeitos sobre algo que esta fora dela voce vai precisar passar um ponteiro. Praticamente, assim que comecamos a desenvolver sistemas mais complexos (em que é preciso utilizar tecnicas de engenharia de software) mais e mais problemas que surgem são resolvidos com ponteiros. Tem mais algumas milhoes de coisas que daria pra citar, mas acho que já deu pra entender. Ah, e FILE voce declara como um ponteiro (FILE *) porque a estrutura FILE precisa ser alterada dentro das funcoes que a manipulam. Voce encontra coisas assim em praticamente todas as libs. Quando voce resolve escrever algoritmos genericos então, praticamente voce so usa ponteiros. Isso sem contar toda a parte de simulacao de recursos que o C não tem, como serializadores.
  19. Aceito ideias para tutoriais. Estou pensando em escrever um para pessoas que estao comecando a programar em C agora. Sugestoes são bem vindas!
  20. Voce pode usar a funcao remove() (da stdio.h) para remove-lo e depois cria-lo de novo. Sistema de arquivos é uma coisa meio estatica, então acho que dificilmente voce vai encontrar (pronta em alguma lib) uma funcao que apague o conteudo de um arquivo e reduza o tamanho dele.
  21. Sem problemas. Primeiro preciso explicar o que é um ponteiro de funcao pra voce. Ponteiro de funcao nada mais é que uma funcao que voce passa como parametro para outra funcao. Confuso? Tenho um tutorial sobre isso em http://vidageek.net/2007/02/09/ponteiros-de-funcao/ e um sobre algoritmos genericos em http://vidageek.net/2007/04/27/dia-c-algoritmos-genericos/ Mas, se voce entendeu a ideia, já da pra irmos pra frente. O qsort da stdlib é uma implementacao do algoritmo QuickSort para ordenacao de vetores. O prototipo dele é desta forma: qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *a, const void *b)) base é o seu vetor, no caso a palavra a ser ordenada (em C, void* significa que pode ser qualquer tipo de ponteiro) nmenb é um inteiro com o numero de posicoes ocupadas que tem o seu vetor size é um inteiro com o numero de bytes que cada posicao vai ter compar é um ponteiro para uma funcao com o seguinte prototipo: int compara(const void *a, const void *b) é meio feio e poluido, mas é um excelente recurso. A primeira coisa que devemos fazer é uma funcao de comparacao com o prototipo acima. Ela deve (por definicao) devolver 0 se as duas letras forem iguais, <0 se a letra em "a" for menor que a de "b" e >0 caso contrario. Vou escreve-la de forma um pouco mais explicita que o Rafael: int compara(const void *a, const void *b){ char letra1, letra2; /*primeiro temos que recuperar o valor das letras, porque não podemos trabalhar com o void* (ele não aceita comparacao*/ letra1 = *((char *)a); letra2 = *((char *)b); /*nestas linhas, o que eu fiz foi informar pro C que eu quero que ele considere "a" e "b" como um ponteiro para char (char *) e depois recupere esse valor (com o *) */ if (letra1 == letra2) return 0; else if (letra1 < letra2) return -1; else return 1; } Agora so precisamos chamar a funcao qsort com os parametros certos: qsort(palavra, strlen(palavra), sizeof(char), compara) palavra é uma string, que em C não passa de um vetor de char. strlen devolve o numero de caracteres da palavra, ou seja, o numero de itens no vetor cada caractere tem apenas sizeof(char) bytes (em C isso provavelmente vai dar 1) e enfim, nossa funcao de comparacao, compara. Se não tiver entendido, não se preocupe e pergunte de novo. Void* e ponteiros de funcao são coisas meio estranhas mesmo quando voce olha pela primeira vez (e varias outras vevzes mais tarde), mas são recursos que resolvem diversos outros problemas pra gente.
  22. A sua tentativa foi boa, mas ela fura se NOME1 for "aaaaa" e NOME2 for "bbbba". Ela vai dizer que as duas são anagramas porque pra cada letra da primeira ela varre a segunda procurando por aquela letra. Como a primeira so tem "a" e tem um "a" na segunda, ele sempre vai encontrar o "a" da segunda, incrementando K ateh strlen(NOME1) e vai dizer que "aaaaa" e "bbbba" são anagramas. Tente pensar dessa forma: Comparar letras sem nenhuma regra de definicao entre elas é dificil. Se elas estiverem em alguma ordem especifica, fica bem mais facil. POr exemplo, se todas as letras da palavra estao ordenadas, é facil compara-las. Basta ir de um em um vendo se elas são iguais. Alem disso, para que uma palavra seja anagrama de outra, elas devem ter o mesmo numero de letras de cada tipo. OU seja, se uma tem 3 "a", a outra tambem deve ter 3 "a" e assim por diante. então, a ordem em que as letras estao na palavra não importa. Voce pode modifica-la a vontade. Por isso a ideia de ordena-las e depois verificar se as palavras são iguais. Aqui vai um exemplo: Palavras originais: s1="qpwoeiruty" s2="yturieowpq" Palavras ordenadas: s1="eiopqrtuwy" s2="eiopqrtuwy" Conclusao: Como são iguais, são anagramas. faca o teste com algumas outras palavras e voce comecara a entender melhor como isso funciona. Depois, quando for implementar, use a ideia do Rafael no post #12 para ordenar suas palavras.
  23. Jonas de Abreu

    Funções

    de que lib que elas fazem parte? é dificil saber algo de uma funcao que não é padrão ANSI sem ter a lib da qual ela faz parte.
  24. Voce pode usar o algoritmo tradicional de escalonamento (O mesmo que a gente usa quando vai escalonar uma matriz manualmente). O problema é qeu vai ter uma perda de precisao muito grande. Parece que tem um algoritmo que reduz a perda de precisao para o escalonamento, mas eu não conheco ele.
  25. Para isso voce vai precisar de um loop. voce pode usar o "for" que tem a seguinte sintaxe: int i; for (INICIALIZACAO, CONDICAO_PARADA, INCREMENTO){ /*codigo aqui*/ } INICIALIZACAO é o valor inicial que sua variavel contadora recebe. geralmente é 0. (no seu caso, i = 1) CONDICAO_PARADA é quando seu loop deve terminar. (no seu caso i <= 10) INCREMENTO é quanto deve ser incrementada a variavel. (no seu caso, i = i + 1) O loop funciona da seguinte forma: A inicializacao é feita apenas uma vez e é a primeira coisa a ser feita quando o loop comeca a ser executado. Depois disso é verificada a condicao de parada. Se ela for verdadeira, o codigo dentro do loop é executado e depois é executado o codigo de incremento. Caso contrario o loop termina e o codigo dentro dele não é mais executado.
×
×
  • Criar Novo...