-
Posts
1.062 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que ScreenBlack postou
-
Está parecendo ser problema no chipset da placa-mãe. Além do teclado, os demais periféricos funcionam corretamente? Tentou resetar a BIOS? (usando hard reset)
-
Apenas para corrigir sua explicação. O programa não faz a leitura do arquivo, mas sim, da entrada padrão (stdin) através de streaming do conteúdo do arquivo. Trabalhando desta forma, tanto faz para o programa se o conteúdo vem de arquivo ou de outra forma qualquer que utilize o buffer stdin. Que bom que você descobriu como fazer.
-
Para receber o nome do arquivo por parâmetro, utilize os argumentos "argc" e "argv" na função "main()": O código acima considera que o nome do arquivo seja o primeiro parâmetro repassado ao programa.
-
Algumas funções básicas para manipulação de arquivo: "fopen()" para abrir "fclose()" para fechar "fprintf()" para escrever "fscanf()" para ler OBS: Nunca esqueça de fechar o arquivo após sua utilização, porque isso informa ao sistema operacional que o arquivo estará liberado para acesso de outro programa caso seja necessário.
-
Programa para determinar números primos está com erro. como posso arrumar?
ScreenBlack respondeu ao tópico de Felipe Pessina em C/C#/C++
Pode simplificar todas essas rotinas, por apenas esta: int primo = ; int fatores[MAX] = {}; int contFator = ; int tmpContFator = ; int resto = ; /* Fator inicial */ fatores[contFator++] = 2; /* Inicio da rotina com valor posterior ao fator inicial (2) */ for ( primo = 3; primo < MAX; primo++ ) { for (tmpContFator = ; tmpContFator < contFator; tmpContFator++) { resto = primo % fatores[tmpContFator]; /* Testando a divisibilidade do numero por todos os demais contidos no vetor */ if ( resto == ) break; else if ( tmpContFator == (contFator - 1) ) /* Se estiver na ultima posicao do vetor, insere o numero primo no final do vetor */ fatores[contFator++] = primo; } } -
A rotina não tem muito segredo. Elaborei essa, com as partes comentadas: /* MONTAGEM DE FIGURA - INICIO */ int divisor = qtdfilascomp - 1; int tmpCont = 0; int tmpCont2 = 0; int repetirFigura = 1; int contRepetirFigura = 0; int alternarFigura = 1; for (tmpCont = 0; tmpCont < qtdfilascomp; tmpCont++) /* Define a fila */ { for (tmpCont2 = 0; tmpCont2 < ( (qtdfilascomp * 2) - 1); tmpCont2++) /* Percorre as fileiras */ { if ( ( tmpCont2 >= divisor ) && ( contRepetirFigura++ < repetirFigura ) ) /* Trata as alternacias ( "-" e "|" ) a partir da posicão 'divisor' */ { if ( alternarFigura == 1 ) { printf("|"); alternarFigura = 0; } else { printf("-"); alternarFigura = 1; } } else printf("-"); } printf("\n"); repetirFigura += 2; contRepetirFigura = 0; divisor--; alternarFigura = 1; } printf("\n"); /* MONTAGEM DE FIGURA - FIM */ Explicar o processo utilizando palavras é um pouco complicado, pois é mais fácil complicar as idéias do que clareá-las.
-
Faça uma rotina que será a contagem de fila. E utilize esse contador para subtrair do total de atletas: for (qtdFilas = 1; qtdFilas <= qtdAtletas; qtdFilas++ ) qtdAtletas -= qtdFilas; if ( qtdAtletas == 0 ) qtdFilas--;
-
Tem basicamente 2 erros no código 1) Precisa isolar o tratamento de ano bissexto no "if" (destaque em vermelho): Na função "valida()": if ( ( (data.ano % 4 == 0) && (data.ano % 100 != 0) ) || ( data.ano % 400 == 0 ) ) Na função "dias_decorridos()": if ( ( ( (data_ini.ano % 4 == 0) && (data_ini.ano % 100 != 0) ) || ( data_ini.ano % 400 == 0 )) && data_ini.mes > 2 ) 2) Na função "dias_decorridos()" troque para "float" o retorno da função e também defina para "float" as variáveis "dias_no_mes", "tot_dias_ini" e "tot_dias_fim". Testei as rotinas e funcionou corretamente depois das mudanças que apresentei acima.
-
Nas variáveis "pesoAltura" e "nomeSexo", você está definindo 4 linhas e 1 coluna, e na rotina, você está fazendo a leitura de 2 linhas e 2 colunas. Outro problema, é que você está definindo apenas 1 char para armazenar o nome. Esses dois problemas resultarão em buffer overflow. Para o código ficar mais limpo, aconselho separar as variáveis em: float peso[4]; float altura[4]; char nome[4][128]; // 4 linhas com 127 caracteres em cada (desconsiderando o finalizador de string) char sexo[4]; Desta forma, precisará apenas fazer a leitura por linha: "for (int lin = 0; lin < 4; lin++)"
-
Tente utilizar uma versão live cd de algum sistema operacional, para conferir se o problema está no windows ou não. Por exemplo o SystemRescueCD
-
Esta mudança de comportamento começou a ocorrer depois de alguma mudança feita no sistema? O notebook está rodando windows? Caso esteja, tentou acessar pelo modo de segurança para rever as configurações para rever a configuração?
-
Seu código possui variáveis desnecessárias. Pode utilizar a variável saldo para armazenar o saldo da conta. Utilizar uma variável "movimento" para receber o valor que vai depositar ou sacar, fazendo a atualização na variável "saldo" Dei uma organizada no seu código atual e adicionei apenas um loop para poder repetir as operações. Acredito que seja suficiente para você entender e dar continuidade no desenvolvimento do código. Agora a rotina de depósito ficará por sua conta. Tente desenvolve-la e se tiver dúvida apresente o código que criou.
-
Na criação da lista a ordem a inserção estava invertida. Na função que elimina o valor do meio, estava apontando para uma variável criada na própria função e não para a lista oficial, impedindo que a eliminação fosse concluída corretamente. Segue as funções corrigidas e comentadas os pontos alterados: ponteiro criar_lista(ponteiro pont) { int valor; ponteiro aux = NULL; if (pont != NULL) /* Se escolher novamente a opção de criar lista, eliminará a lista antiga */ free(pont); printf("\n\n"); printf("Entre com o Valor: "); scanf("%i", &valor); while ( valor > ) { /* Cadastra primeiro elemento na lista */ if (pont == NULL) { pont = malloc(sizeof(struct NO)); pont->info = valor; pont->link = NULL; aux = pont; } else /* Insere os demais */ { aux->link = malloc(sizeof(struct NO)); aux = aux->link; aux->info = valor; aux->link = NULL; } printf("Entre com o Valor: "); scanf("%i", &valor); } return pont; } ponteiro remove_meio(ponteiro pont) { ponteiro aux1 = NULL; ponteiro aux2 = NULL; int cont, meio; if(pont != NULL) { if (pont->link == NULL) { free(pont); pont = NULL; } else { meio = contagem_nos(pont); if ((meio % 2) > ) /* Aponta para o valor central da lista */ meio = (meio / 2) + 1; else meio = meio / 2; aux1 = pont; cont = 2; while (cont < meio) { aux1 = aux1->link; cont++; } aux2 = aux1->link; aux1->link = aux1->link->link; free(aux2); } } else { printf("Lista Vazia!"); } return pont; }
-
Como faço para uma função receber um char e retornar um inteiro?
ScreenBlack respondeu ao tópico de Diego Galdino em C/C#/C++
Troque "int CodVel(char a)" para "int CodVel(char entrada)" e remova "char entrada;" -
Isso vai depender de como o compilador vai tratar a atribuição do valor para o ponteiro. Estou usando o MinGW32 4.4.1. Ele não permitiu alteração de valor nesses casos. Além disso, a boa prática de programação é, sempre alocar memória a ser referenciada por um ponteiro, fazendo a desalocação ao final de seu uso. Usando dessa maneira, estará criando um código portável. EDIT: Sobre o "fgets()", o certo é usar o valor 40, ao invés do 39. Como a função é de string, ela mesma fará a validação e inserirá o terminador. Fonte: cplusplus - fgets
-
Troque por: char texto[] = "teste 123"; Ou então, por: char *texto = malloc(sizeof(char) * (strlen("teste 123") + 1) ); strcpy(texto, "teste 123"); converte(texto); printf("Texto = %s", texto); free(texto);
-
C++ leia um valor int positivo e menor que 1000, armazenar em uma variável inteira
ScreenBlack respondeu ao tópico de KrS em C/C#/C++
Basta você fazer a divisão por 10, somando a parte fracionada. A parte inteira, será atribuída novamente a variável inicial. unsigned valor = 0; unsigned soma = 0; printf("Entre com um valor de 0 a 999: "); fscanf(stdin, "%d%*c", &valor); while( valor > 0 ) { soma = soma + (valor % 10); valor = valor / 10; } printf("Resultado: %d\n", soma); -
Como verificar último digito de um número ?
ScreenBlack respondeu ao tópico de felipe.fmarques em C/C#/C++
Primeiro: Para capturar o último número, basta pegar a sobra da divisão do número pelo valor 10 (dez). Ex: int valor = 5432; int sobra = 0; sobra = valor % 10; Segundo: Pode sim fazer mais de uma comparação no 'if'. Ex: if ( (sobra == 0) || (sobra == 1) || (sobra == 3) || (sobra == 5) ) { ... } Terceiro: Para aninhar vários 'if'. Ex: if (sobra == 0) { ... } else { if (sobra == 1) { ... } else { if (sobra == 3) { ... } else { if (sobra == 5) { ... } } } } -
Faltava apenas o tratamento de quebra de linha, que eu havia esquecido de comentar, e o controle de espaços duplicados. Segue código: #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char c; FILE *fp; int count = 0; int flag = 0; if ((fp=fopen("Teste1.txt", "r"))==NULL) { printf("DEU ERRO"); exit(1); } while(!feof(fp)) { c = getc(fp); if ( c == ' ' || c == '\n' ) { if (flag == 0) { count++; flag = 1; } } else { if ( flag == 1 ) flag = 0; } /*str2[i]=c; * str2=(char*)malloc(MAX*sizeof(int));*/ } fclose(fp); printf("%d\n", count); return (0); }
-
Quando houver dois ou mais espaços, basta ignorar a contagem. Para isso, poderá usar uma variável de controle, ou seja, quando encontrar um espaço, atribua 1 para essa variável, caso o próximo caracter seja espaço e a variável estiver em 1, ignore a contagem, caso contrário, a variável voltará para o valor 0.
-
Basta fazer a leitura do arquivo caminhando char-por-char, e cada vez que encontrar um espaço, incremente uma variável de controle. Quando chegar no final, basta incrementar em mais um essa variável, obtendo assim o total de palavras no arquivo.
-
Espiral quadrada pode-se usar matriz para representar. Para identificar a posições relativas, pode-se utilizar o valor da posição média da matriz. Por exemplo uma matriz 3x3, sendo 1 o valor intermediário entre 0 e 3: |0 1 2| <- posição lógica da linha é 0. posição relativa será 0 - 1 = -1 |3 4 5| <- posição lógica da linha é 1. posição relativa será 1 - 1 = 0 |6 7 8| <- posição lógica da linha é 2. posição relativa será 2 - 1 = 1 O exemplo acima vale também para as colunas. Baseando-se nesse principio, depois é só fazer os cálculos necessários para preencher a matriz e determinar a espiral quadrada.
-
Seria interessante você postar a solução. Caso alguém mais tenha essa mesma dificuldade e procurar no histórico do fórum, encontrará a solução.
-
Exemplo de conversão float para string: #include <stdio.h> #include <stdlib.h> int main() { float fpi = 3.1416; char spi[30]; snprintf(spi, 7, "%f", fpi); // converte o valor de float na variavel do tipo string fprintf(stdout, "float: %.4f\n", fpi); // imprime string fprintf(stdout, "string: %s\n", spi); // imprime string return 0; } Já para a parte de precisão, não consegui achar algo mais consistente do que valores que possuam no máximo 6 casas decimais usando float simples, mas, existem comentários dizendo que usando "double float" consegue precisão de até 15 casas decimais, só que não funcionou aqui no meu compilador, pois ele não reconhece esse tipo.
-
Pode usar o comando "snprintf()". Acho que esse link irá te ajudar: http://www.c-for-dummies.com/lessons/float2string/
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