Ir ao conteúdo
  • Cadastre-se

isrnick

Membro Pleno
  • Posts

    1.543
  • Cadastrado em

  • Última visita

Tudo que isrnick postou

  1. Veja se funciona: void testarPadrao(){ FILE *arq; bool correto = true; int ponto, i = 0, k = 0; int padraoDesbloqueio[41]; if(!(arq = fopen("padrao_desbloqueio.txt", "r"))) printf("\nErro ao tentar abrir arquivo!\n"); else{ //fseek(arq, 0, SEEK_END); //long tam = ftell(arq); while(fscanf(arq, "%d", &ponto) == 1) { printf("\nPonto %d do padrão: ", k); scanf("%d", &padraoDesbloqueio[k]); //fseek(arq, i, SEEK_SET); //fscanf(arq, "%d", &ponto); printf("\n"); if(ponto != padraoDesbloqueio[k]){ correto = false; break; } //i = i + k * (sizeof(int) + sizeof('\t')); k++; } if(correto) printf("\nPadrão correto!\n"); else printf("\nPadrão incorreto!\n"); } }
  2. Se entendi direito seria algo assim (?) : #include <stdio.h> #include <string.h> int main() { const char *s = "1000"; int vet[strlen(s)]; printf( "A string s: %s\n" "Tamanho do vetor de inteiros: %d\n", s, sizeof vet / sizeof *vet ); return 0; }
  3. @Gabbie1 a solução do @Flávio Pedroza funciona sem ponteiros, declarou a variável tamanho como uma variável global, esse tamanho não é o tamanho real usado na declaração do vetor, mas sim uma variável que indica quantas posições do vetor estão sendo usadas (e o restante do vetor é ignorado). Veja o vetor poderia ter qualquer tamanho: int tamanho = 10; (...) void remover (int v[1000], int pos){ int i; for (i=pos+1;i<tamanho;i++){ v[i-1] = v[i]; } tamanho--; } Aqui o vetor tem 1000 posições mas nosso tamanho só tem valor muito menor pois na verdade indica quantas posições estão sendo usadas, e pode ser decrementado (ou incrementado) conforme for necessário.
  4. Não dá, o tamanho do vetor é fixo, o tamanho indica quanta memória foi alocada para o vetor, e continua alocado até não precisar mais do vetor, e aí desaloca o vetor inteiro automaticamente. Nesse caso o fato de ter o valor duplicado é irrelevante, você poderia ignorar o tamanho real do vetor e considerar apenas parte dele como sendo a parte que contém informação relevante. Outra opção seria colocar um valor inválido para a sua situação na posição final, por exemplo em um caso que somente valores maior que zero são guardados no vetor poderia usar 0 ou um número negativo para indicar que a posição não é considerada parte do vetor. Mas para fazer o que você está pensando seria necessário lidar com alocação dinâmica (malloc() ou calloc() no C), nesse caso você mesmo programaria a alocação de memória, e então poderia usar realloc() para realocar a memória com tamanho diferente, nesse caso um tamanho menor.
  5. Você está tentando fazer algo mais complexo do que o enunciado pede, o enunciado diz que deve decodificar o texto do arquivo original em um novo arquivo, não no próprio arquivo original. Então abra 2 arquivos ao mesmo tempo o arquivo original em modo de leitura, e o novo arquivo em modo de escrita, aí leia o texto do arquivo original e escreva o texto decodificado no arquivo novo.
  6. Isto: int naoehprimo(int num) { é o cabeçalho/protótipo da função naoehprimo(), int num é o parâmetro desta função, indicando que deve ser passado um número inteiro na chamada desta função, e o int no começo da linha indica que quando a função for finalizada ela deverá retornar (usando a palavra chave return) um valor inteiro para o escopo que a chamou. O nome da função indica o que ela faz, ou seja checa se o número passado como parâmetro não é primo. No C o valor 0 é igual a FALSO e qualquer valor diferente de 0 é igual a VERDADEIRO. Então se a função retornar 1 (que é diferente de 0) é sinônimo de retornar VERDADEIRO, ou seja nesse caso o número não é primo, mas se retornar 0 estará retornado FALSO indicando que o número é sim primo.
  7. Segue o código reorganizado e corretamente indentado para facilitar entendimento: #include <stdio.h> int naoehprimo(int num) { int i; // 1 não é primo if (num == 1) { return 1; } // se num for divisível por qualquer numero entre 2 e num-1, retorna 1 for (i = 2; i < num; i++) { if (num % i == 0) { return 1; } } // se ainda nao retornou nada, não é 1 e não foi divisivel por nenhum numero entre 2 e num-1, então retorna 0 return 0; } int main() { int num, i; scanf("%d", & num); for (i = 1; i <= num; i++) { if (naoehprimo(i)) { printf("%d ", i); } } return 0; }
  8. scanf é a função mais versátil para ler dados do terminal no C. No caso %s é um especificador para ler caracteres até encontrar o primeiro caractere vazio (seja ele espaço, tabulação, nova linha, ou etc), então realmente só vai conseguir ler o primeiro nome usando esse especificador pois para de ler quando encontra o espaço. Mas para ler tudo que é digitado até o Enter ser apertado basta usar outro especificador de string que leia tudo até encontrar o primeiro caractere nova linha '\n'. Para isso usamos o especificador %[ que é outro especificador de strings no qual você diz que caracteres deve, ou que não deve, guardar, por exemplo %[abc] só guardaria strings contendo esses 3 caracteres, como "aabbaacc", mas se colocar o caractere ^ logo após o [, como %[^123] estará indicando que os caracteres que não podem ser capturados, nesse caso qualquer coisa que não tenha 1, 2 ou 3 será capturado. Então desejamos usar um especificador que leia tudo até entrar o caractere nova linha '\n' colocado ao apertar Enter no terminal cmd.exe, o que é o mesmo que dizer que vamos capturar tudo menos o caractere nova linha '\n', então usando o especificador %[ isso ficaria assim %[^\n], que vai ler tudo até achar um '\n' e para de ler aí sem capturar o '\n'. Logo, nosso scanf ficaria assim: scanf (" %19[^\n]", vn[i]);
  9. tf do número de colunas da matriz não pode ser igual a 3 nesse caso (a menos que cada nome só tivesse 2 letras...) E tem algumas coisas a corrigir no scanf: Não vai & antes do nome no caso de vetores e matrizes; Seria bom colocar um espaço antes do %s na string de especificadores para limpar espaços em branco antes de começar a obter a string; E quando é feita leitura de dados na forma de string é importante indicar o número máximo de caracteres que pode ser lidos, ou seja a capacidade máxima de caracteres que podem ser guardados no vetor de caracteres, pois além disso estouraria o tamanho do vetor. No caso de um vetor de 20 posições poderia guardar no máximo 19 caracteres (a última posição guardaria o caractere nulo '\0' nesse caso extremo). Então ficaria assim: scanf (" %19s", vn[i]);
  10. Para guardar um vetor de nomes tem que usar uma matriz de caracteres. Assim cada linha da matriz pode armazenar uma string contendo um nome. char clientes[20][20]; //O nome do primeiro cliente fica na primeira posição do "vetor": clientes[0] scanf é sim o mais indicado para ler strings.
  11. O problema é que está usando um ponteiro para ponteiro (**ponteiro) para armazenar uma referencia que aponta para um vetor/array inteiro, e não são compatíveis. Expliquei a diferença nesse outro tópico veja se te ajuda:
  12. pessoa.cpf[ i ] é um vetor de caracteres armazenando uma string de dígitos, é preciso transformar a string de dígitos em um número inteiro antes de realizar cálculos com o número inteiro, para isso use a função atoi() da biblioteca stdlib.h que serve exatamente para fazer isso. https://en.cppreference.com/w/c/string/byte/atoi Leia minha assinatura abaixo para ver como postar código no fórum sem que o fórum faça alterações no seu código, como aconteceu no seu código onde todos os [ i ] sem espaços sumiram.
  13. Mude: scanf("%[^\n]s",aluno.nome); Para: scanf(" %[^\n]",aluno.nome); Com espaço antes do especificador (e sem o s no final pois não serve pra nada).
  14. No Windows precisa mudar a Code Page do terminal, o vangodp aqui do fórum explicou bem nesse post: A lista completa dos números das Code Pages pode ser vista aqui: https://msdn.microsoft.com/library/windows/desktop/dd317756
  15. Use strtok() para separar cada parte da string separada por vírgula, usando a vírgula como separador no strtok. adicionado 4 minutos depois Outra opção seria já pegar separado no próprio fscanf, usando especificador "%[^,\n]" por exemplo para ler 1 dado entre vírgulas por vez.
  16. Parece ser uma variação desse aqui postado em 2010: https://www.vivaolinux.com.br/script/Pilha-algoritmos-push-pop-e-imprimir-explicados O código é bem similar com algumas coisas diferentes, até os comentários são praticamente iguais com algumas alterações. Mas o do link já era com vetor de caracteres ao invés de int.
  17. Seu código corrigido: #include <stdio.h> #include <stdlib.h> #include <string.h> //A função é esta, não englobe ela dentro de outra função: char *strcopy(char *str){ } //Fiz um main para você testar a função: int main(){ char *string = NULL; string = strcopy("testando a funcao de copia de string."); printf("%s\n", string); free(string); return 0; } Agora tente implementar a função de fato, que é o que o enunciado do exercício pede.
  18. isrnick

    C Erro ao inserir dados

    @GoytaGuy Aqui funcionou como deveria. Qual o seu peso e altura? 100 1.5 Seu i.m.c. e 44.4 voce esta obeso! ...Program finished with exit code 0 Press ENTER to exit console. Você digitou os dados corretamente durante a execução? Número de ponto flutuante deve ser digitado com ponto ao invés de vírgula, ou seja 1.50, e não 1,50 . E a entrada deve ser peso primeiro e depois altura, como sugere a pergunta.
  19. @arfneto Não entendi muito bem o que você quis dizer sobre o número de sorteios e tal. Mas para ficar claro vou postar aqui também o código como ficaria usando o vetor auxiliar e fazendo apenas z sorteios, como sugeri originalmente: #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); //Matriz 5 x 6 int matriz[5][6] = {}, pos[5*6], i, j, aux, n; //z é o número de casas com minas: int z = 10; //Inicia cada posição em seu devido lugar n = 5*6; for(i = 0; i < n; i++){ pos[i] = i; } //Embaralha com algoritmo Fisher-Yates for(i = 0; i < z; i++){ //Apenas z sorteios são realizados //Sorteia uma das posições ainda não selecionadas restantes j = i + rand() % (n-i); //Põe mina na posição sorteada matriz[ pos[j]/6 ][ pos[j]%6 ] = -1; //Faz a troca da posição atual i com a sorteada j //aux = pos[j]; //Não é necessário pos[j] = pos[i]; //pos[i] = aux; //Não é necessário //As linhas comentadas acima estão aí só para mostrar a troca //que seria feita no algoritmo original, mas não é necessário //nesse caso, não usaremos a posição sorteada novamente, logo //não precisamos guardá-la. } //imprime matriz com as minas nas posições sorteadas printf("Matriz\n"); for (i = 0; i < 5; i++){ for (j = 0; j < 6; j++){ printf("%2d ", matriz[i][j]); } printf("\n"); } printf("\n"); return 0; } Como meu código anterior as vantagens de diminuição de complexidade e simplificação da lógica se mantém, e a "desvantagem" é que usa mais memória por causa do vetor auxiliar de posições.
  20. Sim, esse é o método que eu fazia também, ir diminuindo o número de possibilidades após cada sorteio, e contar dês do início pulando as posições já sorteadas. É o jeito mais fácil de pensar em fazer isso logo como você cheguei ao mesmo método. O único problema desse método é a complexidade assintótica do algoritmo, tem que percorrer a matriz toda vez que um número é sorteado, então no pior caso uma matrix com N posições, serão feitos N-1 sorteios, e percorrerá a matriz N vezes, logo N-1 sorteios vezes N/2 posições percorridas da matriz, a complexidade é O(N2). A vantagem é que usando o algoritmo Fisher-Yates a complexidade assintótica no pior caso é O(N). Sim, tem razão, usando o vetor auxiliar e sorteando z posições como falei aumenta o uso de memória. Mas tem ainda outro método pra fazer ainda mais simples, sem o vetor auxiliar, basta por exemplo preencher as z primeiras casas da matriz m x n com minas (o restante não tem minas), e embaralhar os valores contidos na própria matriz. Veja: #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); //Matriz 5 x 6 int matriz[5][6] = {}, i, j, aux, n; //z é o número de casas com minas: int z = 10; //Inicialmente marca as z primeiras casas com minas for(i = 0; i < z; i++){ matriz[i/6][i%6] = -1; } //imprime matriz printf("Matriz inicial\n"); for (i = 0; i < 5; i++){ for (j = 0; j < 6; j++){ printf("%2d ", matriz[i][j]); } printf("\n"); } printf("\n"); //Embaralha com algoritmo Fisher-Yates n = 5*6; for(i = 0; i < n-1; i++){ //Sorteia uma das posições ainda não selecionadas restantes j = i + rand() % (n-i); //Faz a troca de valores da posição atual i com a sorteada j aux = matriz[i/6][i%6]; matriz[i/6][i%6] = matriz[j/6][j%6]; matriz[j/6][j%6] = aux; } //imprime matriz após embaralhar printf("Matriz embaralhada\n"); for (i = 0; i < 5; i++){ for (j = 0; j < 6; j++){ printf("%2d ", matriz[i][j]); } printf("\n"); } printf("\n"); return 0; }
  21. isrnick

    C Struct em C, Loop

    O vetor de caracteres precisa ter 1 char a mais que a string para poder armazená-la, pois precisa guardar o caractere nulo '\0', que indica o fim da string, isso é fato para qualquer string: Mas estamos falando sobre outra coisa aqui no tópico. Toda vez que você digita algo no terminal (no caso do Windows seria o terminal cmd.exe), como por exemplo "123" e em seguida aperta Enter, é adicionado um caractere nova linha '\n' ao final da sequência de caracteres digitado quando você apertou Enter. Então nesse nosso exemplo a string digitada de fato seria essa "123\n", que contém 4 caracteres não nulos '1', '2', '3', '\n'. Nessa caso um scanf usando especificador %d pegaria os caracteres digitados que são relevantes para ele, os números 123, mas fica sobrando na stdin aquilo que ele não usou, nesse caso o '\n'. Agora, se colocar um fgets logo em seguida terá o problema de que ele vai capturar esse "\n" que ficou sobrando, ao invés de esperar que o usuário digite algo novo. Por isso precisamos limpar a stdin após o scanf e antes do fgets.
  22. isrnick

    C Struct em C, Loop

    stdin é um stream/fluxo de entrada, mas a função fflush é para esvaziar streams de saída, e tem comportamento indefinido para streams de entrada: https://en.cppreference.com/w/c/io/fflush http://www.cplusplus.com/reference/cstdio/fflush/ https://www.geeksforgeeks.org/use-fflushstdin-c/ Então, apesar de que em algumas implementações de compilador usar fflush(stdin) vai limpar a stdin, isso não é garantido, então você poderia compilar o mesmo código C com compiladores diferentes no mesmo sistema e funcionar com um mas não usando outro, apesar da função ser parte da biblioteca padrão. Por exemplo, teste esse seu código aqui do tópico em um compilador online: https://www.onlinegdb.com/online_c_compiler https://repl.it/languages/c E verá que nesse caso o fflush não limpa a stdin como esperado, resultando que o fgets pega o "\n" como entrada e guarda em prod[ i ].nome . Portanto, não é recomendado usar fflush para limpar stdin pois não há garantia de que vai esvaziar a stdin como se espera. Ou seja, basicamente usar fflush(stdin) é um mau design que pode levar a erros.
  23. isrnick

    C Struct em C, Loop

    Faltou o & para passar o endereço da variável, ao invés do valor guardado nela, para a função scanf. E no lugar de fflush(stdin) use algo como: void limpastdin(){ int ch; while((ch = getchar()) != '\n' && ch != EOF); } Ou assim: for(int ch = getchar(); ch != '\n' && ch != EOF; ch = getchar());
  24. main.c: #include <stdio.h> #include "calculos.h" int main(){ printf("Usando headers\n"); int y = 5; int quad = quadrado(y); int cub = cubo(y); printf("Quadrado de %d: %d\n", y, quad); printf("Cubo de %d: %d\n", y, cub); return 0; } calculos.h contém os protótipos das funções: #ifndef CALCULOS_H_ #define CALCULOS_H_ int quadrado(int x); int cubo(int x); #endif calculos.c contém as implementações das funções: #include "calculos.h" int quadrado(int x){ return x*x; } int cubo(int x){ return x*x*x; }
  25. Não vai esse s depois do ] na string de especificação. O especificador %[ já é um especificador de string.

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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!