-
Posts
57 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que Aoi Todo postou
-
Para aprender linguagem C, eu recomendo muito o site: https://programacaodescomplicada.wordpress.com/indice/linguagem-c/ Tem aulas gratuitas, bem interessantes, mas não da nenhum certificado. Além de aulas de C tem aulas de estruturas de dados, que você pode aproveitar para outras linguagens. O mesmo autor das vídeo aulas fez um livro "linguagem C descomplicada", recomendo muito o livro. Tem um outro site ,que eu consulto as vezes, que ensina C e C++, que é o: http://www.cplusplus.com Só que está tudo em inglês nesse ultimo. Gosto de seguir livros ou cursos, porque ajuda a não ficar "perdido" sem saber o que tem para aprender. adicionado 2 minutos depois Se quiser outras plataformas, vale a pena criar um tópico pra isso, o pessoal aqui sempre recomenda umas coisas boas.
-
C Como variáveis do tipo struct ficam alocadas na memória
Aoi Todo respondeu ao tópico de Alberto_Santos em C/C#/C++
Basicamente, as structs se parecem muito com as classes da orientação a objetos, mas sem os métodos (funções) inbutidos dentro dela. adicionado 16 minutos depois Cara, incrível isso ai, o texto explicou bem a duvida. Não fazia ideia da existência do alinhamento haha. Obrigado Flávio! adicionado 17 minutos depois Falei coisa errada, na segunda vez que aconteceu o espaço vazio, haviam 3 bytes vazios e não 2. -
C Como variáveis do tipo struct ficam alocadas na memória
Aoi Todo respondeu ao tópico de Alberto_Santos em C/C#/C++
Até onde eu sabia, as variáveis de uma structs ficam uma seguida da outra na memória ("coladas"). Porém fiz um programa pra testar, elas ficaram próximas, entre a string autor[10] e preco existe 2 bytes vazios que eu não soube explicar. Acredito que seja algo das strings ou char. Porém coloquei mais uma variável para testar, depois da float preco e elas ficaram "coladas" na memória. Criei outras ainda para melhorar o teste. Essa e quando coloquei um char simples, esse espaço "vazio" na memória ocorreu novamente. O programa está ai caso queira ver: #include<stdio.h> #include<stdlib.h> #include<string.h> struct livro{ char autor[10]; float preco; int teste; char teste2; int teste3; float teste4; }; int main(){ //como essas variaveis fica alocado na memória? struct livro livro1; strcpy( livro1.autor , "Deitel"); livro1.preco = 320.25; printf("tamanho livro.autor(char[10]): %d \n",sizeof(livro1.autor)); // imrpime o tamanho da variavel printf("tamanho preco(float): %d \n\n",sizeof(livro1.preco));// imprime o tamanho da variavel printf("tamanho char: %d \n\n",sizeof(char)); printf("tamanho int: %d \n\n",sizeof(int)); printf("endereco autor:%d\n",&( livro1.autor[0] ));// sempre que colocar & antes de uma variavel, // esta se referindo ao endereco na memoria da variavel printf("endereco preco: %d \n",& livro1.preco); printf("endereco variavel teste :%d \n",&livro1.teste); printf("endereco variavel char teste2 :%d \n",&livro1.teste2); printf("endereco variavel int teste3 :%d \n",&livro1.teste3); printf("endereco variavel float teste4 :%d \n",&livro1.teste4); return 0; } O resultado foi o seguinte: Eu acreditava que a variável preço deveria estar na posição 6487810. e a variável teste3 na posição 648721 (já que cada char possui tamanho de 1 byte). Interessante analisar que os 2 espaços "vazios" são de 2 bytes. Agora vejo que não sei mais haha, vou esperar contigo pra ver se alguém responde. -
Obrigado! Vou dar umas pesquisadas na internet ver o que eu acho. Muito massa esse pdf do windows, vou aproveitar isso ai.
-
Eu encontrei alguns problemas, vou mostrar no seu código mesmo: (vou deixar como comentario algumas partes que eu reescrevi). Mas ei não desanime, programação é complicado mesmo, logo pega o jeito. #include <stdio.h> #include <string.h> #include <conio.h> int main() { FILE* arquivo = fopen("ArqTeste.txt", "r"); if(arquivo == NULL) { fprintf(stderr, "Erro ao abrir o arquivo"); return 1; } char linha[1024]; while(fgets(linha, sizeof(linha), arquivo) != NULL) { // essa variaveis que você declarou dentro do while, so // existiram dentro desse while, se quiser usar elas fora do while // tem que declarar antes do while. (isso ai tem haver com escopo da variavel) char situacao1[16]= "pedido efetivado"; char situacao2[17]="cadastro pendente"; // aqui tinha faltado " ; " int retorno; char *pStr; // ponteiro para string, vai precisar dele para strtok int contador = 0; // a parte a baixo eh so para voce entender como funciona o strtok // bom voce compilar ai no seu computador, e executar e tentar entender o que aconteceu olhando pro codigo. ///////////////// uso de strtok pStr = strtok (linha," "); while( contador <= 5 ){ // " " eh o caracter barra de espaço printf("linha: %s\n",linha); printf("pStr: %s\n" , pStr); pStr = strtok ( NULL , " "); } ///////////////// // retorno = strcmp(str1, str2);// aqui você esta comparando duas strings que você // nao declarou, nem atribuiu nenhum valor. str1 e str2. printf("retorno = %d\n", retorno); // aqui tb faltou " ; " getch(); } fclose(arquivo); return 0; } Se precisar eu tenho um programa explicativo do strtok aqui, posso postar ele aqui. adicionado 9 minutos depois Caso queira o programa que explica a função strtok(), vou deixar aqui nesse post: #include <stdio.h> #include <string.h> // esse programa foi um exemplo do professor H. Eberspacker. // Serve como exemplo para verificar o funcionamento da funcao strtok // Uma pagina na internet que explica bem é o seguinte https://en.cppreference.com/w/c/string/byte/strtok // a funcao strtok divide um string em substrings, a divisao eh feito com relação a caracteres enviados como parametro. // A funcao retorna um ponteiro para o inicio do pedaco da substring // A funcao recebe como parametro um ponteiro para o inicio de uma string e caracteres que serao usados para dividir a string // por exemplo strtok( string, ";*" ) ira separar dividir uma string a cada ponto e virgula e/ ou asterisco encontrados // a string " oi ; 22 * 33" seria dividida nas sequintes 3 strings : // " oi " // " 22 " // " 33 " // observe que os parametros de divisao " ;* " nao sao salvos nas substrings // quando strtok eh usada com parametro NULL no lugar da string, a funcao strtok funciona como continuacao de suas chamadas anteriores // isso sera visto e melhor explicado no codigo abaixo VVV. int main () { char str[] ="Ola, tudo bem contigo? Nao! Perdi meu guarda-chuva!"; char *p; printf ("String original: %s\n", str); p = strtok (str," ,?!-"); // faz o ponteiro "p" apontar para a primeira parte da string while ( p != NULL ){// quando strtok terminar de ler as substrings, a funcao retorna o valor "NULL". printf ("%s\n", p ); p = strtok ( NULL, " ,?!-"); // quando usada com parametro NULL, a funcao strtok funciona como continuacao de suas chamadas anteriores // cada vez que ela eh usada, ela retorna um ponteiro para a proxima string } printf("%s",str); // aqui deveria imprimir a str[], mas ao usar strtok a string str foi "destruida". So a primeira parte dela esta salva. // por isso "Ola", que eh a primeira parte da string, eh imprimida. return 0; }
-
Olá, eu quero começar a aprender C++ e gostaria saber se alguém pode me recomendar um livro ou outra meio para aprender. Eu programo em C e aprendi quase tudo num livro, achei muito bom, mas realmente não tenho ideia se é a melhor forma de aprender.
-
Obrigado cara! vou dar uma olhada nelas.
-
C Calcular media e ordenar por ordem alfabetica.
Aoi Todo respondeu ao tópico de PepsiColly em C/C#/C++
Percebi mais uma coisa. Quando for ler o segundo aluno, a variável media ainda vai estar com o valor do aluno 1 salvo, se não zerar a variável, a média vai ser um valor estranho. Bom zerar a variável media. Se quiser fazer os a média de todos alunos, seria bom salvar elas em outro lugar( ou transformar a variável em um vetor), depois somar todas as medias e fazer a media entre elas. -
Olá, estou procurando uma ide para C que rode em linux (uso o ubunto). Queria uma ide bem leve (tenho pc bem devagar...). A ide é mais para eu não ter que ficar compilando os arquivos no terminal, seria bom que ajudasse a mostrar os erros na hora de compilar, mas não precisa ser algo sofisticado.
-
C Calcular media e ordenar por ordem alfabetica.
Aoi Todo respondeu ao tópico de PepsiColly em C/C#/C++
Olá, fiz umas alterações no seu código e coloquei uns comentários para explicar o que fiz e deixei o que você tinha escrito como comentário, pra identificar melhor as mudanças. Qualquer coisa só falar. Está ai: int main(){ // tinha faltado colocar "int" nessa linha char nome [3][50]; double nota[5], media = 0, soma = 0; int i, j, cont; for(i = 0;i < 3;i++){ soma = 0; printf("Nome aluno %do: ", i+1); scanf("%s", &nome); for(j = 0;j < 5;j++){ printf("Insira a %do nota: ",j+1); // scanf("%lf",¬a); // quando se escreve o nome de um vetor sem posicao, esta sendo considerado a primeira posicao do vetor scanf("%lf",¬a[ j ]); // as posições dos vetores começam do 0 e não do 1, 1º posicao do vetor = vet[0] //soma += nota[j + 1]; soma += nota[ j ]; media = soma / 5; // essa linha estava como comentario, a media nao estava sendo calculada nunca } // printf("Aluno: %s \nMedia das notas: %.lf\n", nome, soma); // você colocou para imprimir a soma, nao a media. printf("Aluno: %s \nMedia das notas: %lf\n", nome, media); // E no indicador de float "%.lf" você colocou um ponto, se o ponto estiver ali // e nao acompanhado de um numero, nenhum numero depois da virgula sera imprimido. } for(i = 0;i < 3;i++){ } return 0; // em C a main() é sempre bom retornar um valor a sua escolha. Porque se retornar um valor diferente, // ai você saberá que houve um erro. } -
Olá. Pra resolver isso você vai precisar saber abrir , criar e fechar ( funções : fopen() e fclose ()), bom dar uma pesquisada nisso e em ponteiros tipo FILE *. OBS; fopen() serve tanto para abrir arquivos, quanto para criar arquivos. Você também vai precisar saber como ler o conteúdo do arquivo, pra isso recomendo a função fgets(). Basicamente essa função vai ler uma linha (até encontrar "\n"), e retornar uma string contendo os caracteres da linha lida. Tem mais uns detalhes, mas eu não sei se essa é sua duvida. Da pra ver pelo texto que você escreveu que as palavras são separadas por espaço (isso é importante), então seria bom cada palavra ou numero ser uma string diferente. Por exemplo "joao" seria uma string "444" seria outra " casa " outra, etc. Isso pra você poder analisar se está escrito "cadastro" e em seguida "pendente" na linha. Pra dividir a string lida por fgets() eu uso a função strtok(), da biblioteca <string.h>. No seu caso eu usaria strtok() enviando barra de espaço( " ") como parâmetro de divisão da string. Você pode usar uns if()s depois e a função strcmp() que compara duas strings . strcmp() também é da biblioteca <string.h>. Enquanto o programa está lendo o arquivo, ele pode estar ao mesmo tempo escrevendo outro ( le uma string, e já copia essa string no novo arquivo) , e caso encontre cadastro pendente ele escreve pedido efetivado. Pra isso recomendo usar a função fputs(); No final, não esqueça de fechar os 2 arquivos. E é isso, espero ter ajudado. Recomendo fazer uma coisa de cada vez, tipo primeiro aprende a usar a função fgets() bem, depois que tiver bem certo, faz algo pra identificar o "cadastro pendente" e por ai vai. Manda ver! adicionado 3 minutos depois Ei, esqueci de avisar, eu programo em C, não em C++. Possivelmente existem funções melhores para resolver o problema nas bibliotecas de C++. De qualquer forma pode resolver com as funções que eu disse, só não esqueça de no inicio do programa colocar essas bibliotecas: #include <stdio.h> #include <string.h>
-
Olá. Primeira coisa é entender o problema. No caso a fórmula matemática, diz que "e" (que é uma constante, tipo numero pi) elevado a x ( que uma variável, que pode ter qualquer valor entre - e + infinito, ou seja pertence ao conjunto dos reais) é igual aquela expressão, que pode ser reescrita desse jeito: tal que o n = infinito: Mas você não tem que realmente usar o valor infinito ( isso seria impossível), você só precisa usar um valor bem grande, para fazer uma aproximação de e ^ x. Um valor tipo n = 100 000. Ou algo maior. O valor exato seria impossível de ser calculado (por causa do infinito). Só cuidado, que um int comum só vai até 2 bilhões e alguma coisa se não me engano, cuidado para não passar desse valor. Ao meu ver, o melhor depois de entender o problema, sempre é dividir ele em partes menores. Um problema é fazer o fatorial dos números, o outro é fazer a soma de todas as frações. Eu faria primeiro uma macro ou uma função que faz o fatorial de um inteiro (para usar nas frações). Depois faria um laço de repetição (for ou while) que faz a soma das frações. Nos expoentes e denominadores você coloca uma variavel, digamos variavel "int cont", que nem na ultima fração, ai você faz cont variar de 0 até n ( que seria o numero bem grande). o código poderia ter esse esqueleto: int fatorial(int numero);// escreva essa funcao e faça ela retornar o resultado int main(){ int cont;// cont de contador. int n = numero grande;// substitua por um valor alto a sua escolha float e = 0; // dependendo da precisão do valor calculado, talvez você precisa usar um double no lugar de float for( cont = 0 ; cont <= n ; cont ++ ){ /// aqui você coloca as contas, sempre colocando no lugar do fatorial a funcao // Por exemplo, se tivesse a expressão: 2/x!, você escreveria: 2/ ( fatorial(x)) } return 0; }
-
Obrigado, vou dar umas pesquisadas agora kk.
-
Olá @Marcela da Silva de Souza não sei quanto aos pontos de interrogação, porém a barra dupla " || " na linha 13, é o operador lógico " ou ". No caso seu caso : if(vet[j]<99 || vet[j]>99){ // alterei pra ficar melhora a visualização // talvez tenha encontrado um erro no seu código no lugar de vet[j]<99 estava escrito // vet[j]<- 99, eu retirei o " - ", que para mim não faz sentido, desculpe se estiver errado. flag=1; } Se vet[ j ] for menor que 99 flag será igua a 1, ou se vet[ j] for maior do que 99 o flag será igual a 1. Para qualquer um dos 2 casos o flag será igual a 1, o que está dentro do "if" só não ocoerrá se o vet[ j ] for igual a 99. Uma dica é que ,s e o que eu falei está correto , você pode substituir esse if pelo seguinte if: if ( vet[ j ] != 99) { flag = 1 } Espero ter ajudado.
-
Olá, eu gostaria de saber como umas funções básicas de C (como a função rand() ) foram feitas. Eu sei como usa-las perfeitamente, porém gostaria de saber, por curiosidade, como os desenvolvedores fizeram a função. A minha dúvida é pelo que pesquisar, não sei como procurar esse tipo de coisa. Se alguém puder me ajudar, eu agradeço.
-
Olá. Encontrei alguns erros no programa, o principal é que você está tentando usar a função printf( ) para salvar os inteiros no arquivo texto, mas a função printf só serve para imprimir coisas na tela, não para escrever em arquivos. Para salvar variáveis você tem que usar outras funções, uma delas é a função fprintf( ). Você usa ela da seguinte forma fprintf ( ponteiro para o arquivo " testo como se fosse o printf e os identificadores tipo %d %f %d " , aqui o nome das variaveis, que nem no printf). As vírgulas são importantes. Outra coisa, você está usando dois ponteiros do tipo FILE, mas seria necessário apenas 1, e também você abriu varias vezes o mesmo arquivo, isso é desnecessário. E além do mais, no inicio você esta abrindo ele para leitura "r", e leitura binario "rb". Bom você dar uma pesquisada nas diferenças. No final você também abriu o arquivo em modo de leitura "w", isso não é o suficiente para gravar os dados, é necessario usar uma funcao como fprintf()Outra coisa que eu achei estranho é o foi isso: Aqui você está multiplicando tudo por 1, isso não fará diferença nenhuma. Eu faria o código da seguinte forma: #include <stdio.h> #include <stdlib.h> int main() { FILE *pArq; // apenas 1 ponteiro int i, j, result=0, matrix[3][3]; pArq = fopen("matrix.txt", "w"); // cria um arquivo chamado "matrix.txt" e o abre na forma de leitura ( write ) // caso ja exista um arquivo chamado "matrix.txt" o arquivo antigo será excluido // atribui o local da memoria do inicio do arquivo para o ponteiro pArq. Esse valor vai aumentando conforme usam-se funções // de escrita ou leitura de arquivo. if( pArq == NULL ){ printf("\nerro ao abrir o arquivo 'matrix.txt'\n"); exit(1); } for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("Elemento[%d][%d]= ", i, j); scanf("%d", &matrix[i][j]); } } // printf("\n::: Valores Digitados :::\n"); para escrever isso no arquivo pode ser feito o seguinte: fprintf(pArq, "\n::: Valores Digitados :::\n"); for(i=0;i<3;i++) // esse for salva os valores da matriz, no arquivo matrix.txt { for(j=0;j<3;j++) { fprintf( pArq,"%d\t", matrix[i][j]); printf("\n"); } fprintf( pArq,"\n"); } for(i=0;i<3;i++) { for(j=0;j<3;j++) result=result+matrix[i][j]; } fprintf( pArq , "\n\nA soma dos valores e: %d\n", result); // salva o texto digitado e a soma dos valores no arquivo "matrix.txt" fclose(pArq); // fecha o arquivo para o qual pArq aponta, no caso "matrix.txt". return 0; } Espero ter ajudado, e não desanime, esses negócios de programação são complicados mesmo.
-
Muito obrigado @AnsiC, consegui fazer funcionar, fui pesquisar a diferença e ai resolvi. Se alguém quiser ver como o código ficou, esta aqui: #include <stdio.h> #include <stdlib.h> // esse programa tem como objetivo apreender a mexer com arquivos (abrir, fechar, ler e escrever), com os comandos fopen, fclose, fgetc e fputc int main(){ FILE *pTexto; char anel[115]= "Um Anel para a todos governar, Um Anel para encontra-los, Um Anel para a todos trazer e na escuridao aprisiona-los"; char anelLeitura[115]; char anelLeitura2[115]; char anelLeitura3[115]; int cont; pTexto = fopen("sauron.txt","w"); if( pTexto == NULL ){ printf("erro ao abrir o arquivo \n"); exit(1); } /*for( cont = 0 ; cont <= 200 ; cont++ ){ fputc( anel[cont] , pTexto ); }*/ for( cont = 0 ; cont <= 113; cont++ ){ fputc( anel[cont] , pTexto ); } fclose(pTexto); pTexto = NULL; pTexto = fopen("sauron.txt","r"); for( cont = 0 ; cont <= 113; cont++ ){ anelLeitura[cont] = fgetc(pTexto); } anelLeitura[cont]= '\0'; fclose(pTexto); pTexto = NULL; printf("\nLEITURA 1.0:%s\n",anelLeitura); fclose(pTexto); // a parte a baixo é igual a parte de leitura a cima, porém e foi usada //a constante EOF para nao precisar determinar o tamanho do arquivo no for // EOF = end of file, dado que representa fim do arquivo, geralmente é -1 pTexto = NULL; pTexto = fopen("sauron.txt","r"); if( pTexto == NULL ){ printf("erro ao abrir o arquivo \n"); exit(1); } printf("\nLEITURA 1.1:%s\n",anelLeitura); for( cont = 0 ; ( anelLeitura2[cont] = fgetc(pTexto) )!= EOF ; cont++ ){ // acontece enquanto anelLeitura2[cont] for diferente de EOF, } // aqui o valor fgetc(pTexto) eh atribuido a variavel anelLeitura[cont] e entao eh verificado se esse valor eh diferente de EOF anelLeitura2[cont] = '\0'; printf("\nLEITURA 1.2:%s\n",anelLeitura);// COISA ESTRANHA NAO E IMRPIMIDA ^^ fclose(pTexto); pTexto = NULL; printf("\nLEITURA 2.0%s\n",anelLeitura2); printf("\nLEITURA 1.3:%s\n",anelLeitura);// COISA ESTRANHA NAO E IMRPIMIDA ^^ // outra alternativa é usar o comando e feof(). Esse comando e util , pois em arquivos binarios um inteiro no meio do arquivo pode ter o valor igual a null // o que indicaria o fim do arquivo sem chegar no final do arquivo pTexto = NULL; pTexto = fopen("sauron.txt","r"); if( pTexto == NULL ){ printf("erro ao abrir o arquivo \n"); exit(1); } printf("\nLEITURA 2.1%s\n",anelLeitura2); printf("\nLEITURA 1.4:%s\n",anelLeitura);// COISA ESTRANHA NAO E IMRPIMIDA ^^ for( cont = 0 ; !feof(pTexto) ; cont++ ){ // feof() retorna 0, quando nao se esta no final do arquivo, e retorna algo diferente de 0 quando se esta no final anelLeitura3[cont] = fgetc(pTexto); } anelLeitura3[cont] = '\0'; fclose(pTexto); pTexto = NULL; printf("\nLEITURA 3:%s\n",anelLeitura3); printf("\nLEITURA 1.5:%s\n",anelLeitura);// COISA ESTRANHA NAO E IMRPIMIDA ^^ printf("\nLEITURA 2.2:%s\n",anelLeitura2);// COISA ESTRANHA NAO E IMRPIMIDA ^^ return 0; }
-
Não entendi muito bem a duvida, seria bom você esclarecer melhor, mas acho que noite alguns erros. Nessa parte, não deveria estar lendo apenas 1 valor para o vetor? aqui você está lendo 6 valores. Outra coisa, antes disso, você deu um valor para varias coordenadas do vetor, quando você ler os valores , com o for, todos esses valores vão ser substituídos, então por que deu os valores? Outra coisa, seu programa só funcionaria se você digitasse o numero 6, por que não vai imprimir todos os valores, por exemplo de 0 até 55, mas ele deveria funcionar para qualquer valor. Pra ler o numero e fazer o vetor, eu sugiro que você declare o vetor com um tamanho bem grande, por exemplo [100] , salvasse o numero que tem que ser lido numa variavel separada do vetor, ( int nlido, ou algo assim), ai você faz um for para preencher os valores do vetor, e manda ele parar quando o valor for igual a essa variavel lido. Tipo isto: int n; int vetor[100]; int nlido = 0; //scanf("%d",&temp); // você pode por esse scanf dentro de um "while". //para que nao seja digitado um numero invalido // digamos que queira que o numero seja maior que 1 e menor ou igual a 99 while(( nlido <= 1 ) || ( nlido >= 99 )){ // o que esta dentro desse "while" acontece enquanto nlido for menor ou igual a 1 // OU maior que 99 scanf("%d",&nlido); } for( n = 0; n <= nlido ; n ++){ // isso aqui dara valor a todos as posições do vetor, em ordem crescente de 1 em 1 vetor[n] = n; }// por exemplo se você digitou 5, o vetor tera valores : vetor[0] = 0; vetor[1] = 1 ... vetor[5] = 5; // o resto do vetor (vetor[6] até vetor[99]) ficam sem serem utilizadas. // quando você precisar usar o valor que eh a metade do valor digitado, sugiro que use : nlido/2
-
Olá, eu estava fazendo um programa para aprender a mexer com arquivos, e notei que quando imprimo algumas strings, em certos lugares saem coisas estranhas, gostaria de entender o por que disso. Agradeço quem puder me ajudar. Este é o meu código (coloquei comentários com asterisco na parte que imprime estranho): #include <stdio.h> #include <stdlib.h> // esse programa tem como objetivo apreender a mexer com arquivos (abrir, fechar, ler e escrever), com os comandos fopen, fclose, fgetc e fputc int main(){ FILE *pTexto; char anel[116]= "Um Anel para a todos governar, Um Anel para encontra-los, Um Anel para a todos trazer e na escuridao aprisiona-los "; char anelLeitura[116]; char anelLeitura2[116]; char anelLeitura3[116]; int cont; pTexto = fopen("sauron.txt","w"); if( pTexto == NULL ){ printf("erro ao abrir o arquivo \n"); exit(1); } for( cont = 0 ; cont <= 200 ; cont++ ){ fputc( anel[cont] , pTexto ); } fclose(pTexto); pTexto = NULL; pTexto = fopen("sauron.txt","r"); for( cont = 0 ; cont <= 115; cont++ ){ anelLeitura[cont] = fgetc(pTexto); } fclose(pTexto); pTexto = NULL; printf("\nLEITURA 1.0:%s\n",anelLeitura); fclose(pTexto); // a parte a baixo é igual a parte de leitura a cima, porém e foi usada //a constante EOF pTexto = NULL; pTexto = fopen("sauron.txt","r"); if( pTexto == NULL ){ printf("erro ao abrir o arquivo \n"); exit(1); } printf("\nLEITURA 1.1:%s\n",anelLeitura); for( cont = 0 ; ( anelLeitura2[cont] = fgetc(pTexto) )!= EOF ; cont++ ){ // acontece enquanto anelLeitura2[cont] for diferente de EOF, } // aqui o valor fgetc(pTexto) eh atribuido a variavel anelLeitura[cont] e entao eh verificado se esse valor eh diferente de EOF printf("\nLEITURA 1.2:%s\n",anelLeitura);// COISA ESTRANHA É IMRPIMIDA !!****************************************** fclose(pTexto); pTexto = NULL; printf("\nLEITURA 2.0%s\n",anelLeitura2); printf("\nLEITURA 1.3:%s\n",anelLeitura);// COISA ESTRANHA É IMRPIMIDA !! ****************************************** // outra alternativa é usar o comando e feof(). Esse comando e util , pois em arquivos binarios um inteiro no meio do arquivo pode ter o valor igual a null // o que indicaria o fim do arquivo sem chegar no final do arquivo pTexto = NULL; pTexto = fopen("sauron.txt","r"); if( pTexto == NULL ){ printf("erro ao abrir o arquivo \n"); exit(1); } printf("\nLEITURA 2.1%s\n",anelLeitura2); printf("\nLEITURA 1.4:%s\n",anelLeitura);// COISA ESTRANHA É IMRPIMIDA !!****************************************** for( cont = 0 ; !feof(pTexto) ; cont++ ){ // feof() retorna 0, quando nao se esta no final do arquivo, e retorna algo diferente de 0 quando se esta no final anelLeitura3[cont] = fgetc(pTexto); } fclose(pTexto); pTexto = NULL; printf("\nLEITURA 3:%s\n",anelLeitura3); printf("\nLEITURA 1.5:%s\n",anelLeitura);// COISA ESTRANHA É IMRPIMIDA !!****************************************** printf("\nLEITURA 2.2:%s\n",anelLeitura2);// COISA ESTRANHA É IMRPIMIDA !!****************************************** return 0; }
-
Um professor de programação me disse que a função realloc libera o espaço de memória antigo.
-
C Crie matriz onde os números de linhas e colunas serão digitados pelo usuário
Aoi Todo respondeu ao tópico de Luis Gonzales em C/C#/C++
Sim, ficaria assim, isso está tudo certo. -
Alguém pode me auxiliar nas respostas dessas questões de algoritmo?
Aoi Todo respondeu ao tópico de Thaís Sampaio Rutz em C/C#/C++
Seria bom você dizer exatamente qual é a sua dúvida, mas vou dar aqui umas sugestões pro problema, que talvez sejam úteis. Para o primeiro problema, eu sugiro que você salve os valores lidos num vetor. Ai depois você utilize a funcao "mod" junto com o valor "2" para cada numero lido. Uma sugestão é trocar a palavra "mod" por " % ". Se o resultado for 1 significa que o numero dividido por 2 tem resto 1 (ex: 5 % 2 = 1 ) , ou seja é impar, se o resultado tiver resto 0 (ex: 6 % 2 = 0), o numero será par. Ai conforme você vai descobrindo se um numero é par você pode ir fazendo as operações pedidas com "if". Mais ou menos assim: if( numeros[cont] % 2 == 0) { // verifica se o numero no vetor "numeros" na posicao "cont" é par. aqui faz os calculos para a média dos numeros pares }else{ // significa que o numero é impar aqui faz os calculos para a soma dos numeros impares } Da pra juntar isso com um "for" ou "while" para verificar todas as posições da matriz. Para o segundo problema, acho que da para fazer mais ou menos o mesmo, salvar os valores num vetor e usar um "if" para ver se os números estão no intervalo. Esse if teria que ter duas condições, sugiro usar o operador "&&". Se tiver duvidas de como ler os números, sugiro usar a função "scanf()" dentro de um "while" ou "for" para ler exatamente a quantidade de números pedidos. -
C Crie matriz onde os números de linhas e colunas serão digitados pelo usuário
Aoi Todo respondeu ao tópico de Luis Gonzales em C/C#/C++
Olá @devair1010, muito bom o seu post, mas acho que notei uma coisa faltando no código de alocação dinâmica ( desculpe se estiver errado). Com relação a seguinte parte: Não seria necessário antes liberar na memória, as colunas da matriz? Com um "for" , tipo isto: for( i = 0 ; i < y ; i++){ free(matriz[i]); } free(matriz); -
Obrigado novamente!
-
Muito obrigado por tudo! Testei aqui, está funcionando mesmo, me ajudou bastante. Ah não vou perder o tesão não haha estou gostando bastante de programação. Só fiquei com uma duvida no seu código.Tem uma parte você escreveu : (void) vetor[(colunas * y) + (x)]; Só não entendi a finalidade do "(void)".
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais