Ir ao conteúdo
  • Cadastre-se

ScreenBlack

Membro Pleno
  • Posts

    1.062
  • Cadastrado em

  • Última visita

Tópicos solucionados

  1. O post de ScreenBlack em Problema com ponteiros para gerenciar memoria foi marcado como solução   
    O problema é apenas de apresentação. Você está trabalhando como caracter, mas a rotina que mostra o conteúdo da memoria está apresentando o resultado como string, fazendo com que todo o conteúdo seja apresentado junto.
     
    Troque a rotina para:
     
    for (opcao = 0; opcao<25; opcao++) { printf ("%c | %p ",Memoria[opcao],&Memoria[opcao]); printf("\n"); }  
     
    Pelo que entendi, é este o erro que você está comentando.
    Se não for, me avise.
     
    EDIT:
    OBS: As imagens contidas em "Correto Imagem" não estão carregando.
  2. O post de ScreenBlack em Programa p/ caastro: não guarda as info na struct foi marcado como solução   
    A função "scanf_s()" veio a ser implementada apenas na biblioteca padrão C versão C11. Antes disso, ele fazia parte apenas da biblioteca Microsoft.
    Devido a retrocompatibilidade, troquei por "scanf()".
    Mas você pode utilizar a função "scanf_s()", sim. Ela é até melhor, porque trata buffer overflow.
     
    A função "fgets()" eu não aconselho utilizar, porque fará a leitura da tecla "ENTER" no buffer, fazendo com que a leitura seguinte não ocorra.
  3. O post de ScreenBlack em Valores nao sao salvos no vetor em c - tad foi marcado como solução   
    Você não está armazenando a lista retornada pela função 'inserirCliente()'
     
    Fiz alguns ajustes em seu código, apenas para melhorar o tratamento.
    Comentei em cada linha alterada:
     
     
     
    Sempre que criar uma variável, não esqueça de inicializa-la, para evitar tratamentos com 'lixo' em memória.
  4. O post de ScreenBlack em Problema em exercicio em c foi marcado como solução   
    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.
  5. O post de ScreenBlack em Resultado 0,0 foi marcado como solução   
    Sim. Você não está informando valor correto na variável "medianota" para ser divido.
    Troque esse trecho:

    if (contanota > 0) { medianota = medianota/contanota; printf ("\n\nA média das %i notas é: %0.2f!\n", contanota, medianota); }Por este:
    medianota = soma / (float) contanota; // Soma das notas dividido pelo total de notas, retorna a média printf ("\n\nA média das %i notas é: %0.2f!\n", contanota, medianota);
  6. O post de ScreenBlack em Ajude-me a comentar o código. foi marcado como solução   
    Segue:


    #include<stdio.h>#include<malloc.h>#include<stdlib.h> typedef struct tCaixa{    int valor;    int status;    struct tCaixa* prox;} Caixa; typedef struct tFila{    int quantidade;    int ativos;    struct tCaixa *inicio;} Fila;  /*    Cria um elemento fila e define valores padrões*/Fila * inicializar_fila(void){    Fila *fila = malloc( sizeof(Fila) );     if ( fila == NULL )    {        printf("Memoria insuficiente\n");        exit(1);    }     fila->quantidade = 0;    fila->ativos = 0;    fila->inicio = NULL;     return fila;} /*    Remove todas os elementos da fila circular (geralmente só o sobrevivente)*/Fila * finalizar_fila(Fila *fila){    int tmp = 0;    Caixa *tmpCaixa = NULL;     for ( tmp = 0; tmp < fila->quantidade; tmp++ ) // Remoção dos elementos da fila    {        tmpCaixa = fila->inicio;        fila->inicio = fila->inicio->prox;         free(tmpCaixa);    }     free(fila); // Liberação do controlador da fila     return NULL;} /*    Insere elementos na fila circular*/void enfileirar(Fila *fila){    Caixa *caixa = NULL;    Caixa *tmpCaixa = fila->inicio;     if ( fila->inicio == NULL ) // Insere primeiro elemento caso fila esteja vazia    {        fila->inicio = malloc( sizeof(Caixa) );         fila->quantidade++;        fila->ativos++;         fila->inicio->valor = fila->quantidade;        fila->inicio->status = 1;        fila->inicio->prox = fila->inicio;    }    else // Insere novos elementos na última posição controlada pela variável quantidade    {        while ( tmpCaixa->valor < fila->quantidade )            tmpCaixa = tmpCaixa->prox;         caixa = malloc( sizeof(Caixa) );         fila->quantidade++;        fila->ativos++;         caixa->valor = fila->quantidade;        caixa->status = 1;        caixa->prox = tmpCaixa->prox;        tmpCaixa->prox = caixa;    }} /*    Remoção dos elementos da fila baseada na quantidade de passos, até sobrar um sobrevivente*/void desenfileirar(Fila * fila, int qtdPassos){    int passos = 0;     Caixa *tmpCaixa = fila->inicio;     while ( fila->ativos > 1 ) // Enquanto tiver mais de um sobrevivente    {        if ( tmpCaixa->status == 1 ) // Se a pessoa estiver viva, conta o passo a ser dado            passos++;         while ( passos < qtdPassos + 1 ) // Percorre a fila até alcançar a quantidade de passos        {                tmpCaixa = tmpCaixa->prox;                 if ( tmpCaixa->status == 1 )                    passos++;        }         if ( fila->ativos == 1 ) // Se houver apenas uma pessoa ativa (viva), será a sobrevivente            printf("Pessoa %d sobreviveu\n", tmpCaixa->valor );        else        {            printf("Pessoa %d morreu\n", tmpCaixa->valor );            tmpCaixa->status = 0;             fila->ativos--;        }         passos = 0;    }} /*    Lista o estado das pessoas (vivas ou mortas)*/void mostrar_fila(Fila *fila){    int tmp = 0;     Caixa *tmpCaixa = fila->inicio;     for ( tmp = 0; tmp < fila->quantidade; tmp++ ) // Percorre a fila baseado na quantidade    {        printf("Pessoa: %d - Status: %d \n", tmpCaixa->valor, tmpCaixa->status ); // Status 1: Viva - Status 0: Morta        tmpCaixa = tmpCaixa->prox;    }} /*    Lista apenas as pessoas vivas*/void mostrar_fila_ativa(Fila *fila){    int tmp = 0;     Caixa *tmpCaixa = fila->inicio;     for ( tmp = 0; tmp < fila->quantidade; tmp++ )    {        if ( tmpCaixa->status == 1 )            printf("Caixa: %d\n", tmpCaixa->valor);        tmpCaixa = tmpCaixa->prox;    }} /*    Demonstração de que a fila realmente está circular    Lista as 20 posições sequenciais*/void mostrar_fila_20(Fila *fila){    int tmp = 0;    int tmp_2 = 0;     Caixa *tmpCaixa = fila->inicio;     for ( tmp = 0; tmp < 4; tmp++ ) // Mostra 4 linhas    {        for ( tmp_2 = 0; tmp_2 < 5; tmp_2++ ) // Mostra 5 pessoas por linha (5 x 4 = 20)        {            if ( tmp != 4 && tmp_2 != 5 )                printf(" Caixa: %d -> ", tmpCaixa->valor);            else                printf(" Caixa: %d", tmpCaixa->valor);             tmpCaixa = tmpCaixa->prox;        }         printf("\n");    }} int main(void){    int qtdPessoas = 0;    int qtdPassos = 0;    int tmp = 0;     Fila *fila = inicializar_fila();     printf("Quantidade de participantes: ");    scanf("%d", &qtdPessoas);     printf("Quantidade de passos: ");    scanf("%d", &qtdPassos);     for ( tmp = 0; tmp < qtdPessoas; tmp++ )        enfileirar( fila );     printf("-- Inicio --\n");    mostrar_fila( fila );     desenfileirar(fila, qtdPassos);     printf("-- Fim --\n");    mostrar_fila( fila );     fila = finalizar_fila(fila);     return 0;}
  7. O post de ScreenBlack em Alguém consegue me ajudar aqui? Calcular o Peso Ideal. foi marcado como solução   
    E erro ocorre por causa da máscara usada na função "scanf ("%f", &peso)"
    Troque para:

    printf ("Digite sua altura (em metros): "); scanf (" %f", &alt); printf ("\nDigite seu peso: "); scanf (" %f", &peso); printf ("\nDigite F para Feminino e M para Masculino: "); scanf (" %c", &sexo);O espaço adicionado antes do '%', serve para ignorar o carácter referente a tecla ENTER, que é a razão por não permitir a leitura do 'M' ou 'F'.
  8. O post de ScreenBlack em Maior e Menor - Matriz e Vetor foi marcado como solução   
    Entendi o que você quis dizer.
    Mas acredito que você ainda não entendeu o que tentamos explicar.
    Se você conseguiu encontrar o maior e o menor valor, então, você também encontrou a posição do vetor em que esses valores se encontram.
    É essa posição que utilizo para também fazer a busca do nome.
    Vou tentar demonstrar em exemplo.
    Caso o maior valor esteja na posição 3 (índice 2) do vetor:

    char *nome[] = { "lapis", "caneta", "caderno" };float preco[] = { 1.0, 2.0, 8.0 };int maior_valor = 2; // índice do vetor que possui o produto com o maior valorprintf("Produto: %s - Valor: %f\n", nome[maior_valor], preco[maior_valor] );Trabalhando da forma apresentada acima, o valor do índice serve para posicionar todos os vetores.Assim, não precisa ficar copiando nomes e atualizando valores nos vetores.
    Independente da ideia que apresentei anteriormente, apresentarei o erro que está ocorrendo utilizando sua lógica:

    for ( i = 0; i <= 3; ++i) //AQUI ESTÁ PRONTO O MAIOR E O MENOR PRECO ATUALIZADOS { if (preco[i] >= maior) { maior = preco_at[i]; strcpy (maior_preco[0], nome[i]); } }
  9. O post de ScreenBlack em Ajuda C - Calcule a soma de dois tempos registrados em horas e minutos. foi marcado como solução   
    É questão de raciocínio lógico.
    Exemplo prático:
    Se somarmos 40 minutos com 40 minutos, teremos 80 minutos, ou seja, valor superior a uma hora (60 minutos).
    Então, executamos duas vezes a divisão de 80 por 60. A primeira divisão para obter a parte inteira e, na segunda, para obter a parte fracionada.

    80 / 60 = 1 (quantidade de horas, portanto, soma-se com a quantidade de horas já existentes)80 % 60 = 20 (resultado da fração de hora, ou seja, minutos)Resultado: 1 hora e 20 minutosExemplo código:
    minutos_total = minutos_1 + minutos_2; if ( minutos_total > 60 ) // Se total de minutos for superior a uma hora { horas_total = horas_total + (minutos_total / 60); // Armazenamos a quantidade de horas referente a quantidade de minutos if ( (minutos_total % 60) > 0 ) // Se o resto da divisão for maior que zero, significa que ainda sobraram minutos minutos_total = (minutos_total % 60); }
  10. O post de ScreenBlack em Ajuda com recursividade em c foi marcado como solução   
    Acho que é isso:

    void imprime(int quantidade, int posicao){ int valor = 0; if ( posicao < quantidade ) { printf("Digite o valor %d: ", posicao + 1); scanf(" %d", &valor); imprime( quantidade, posicao + 1 ); printf("Valor na posicao %d: %d\n", posicao + 1, valor); }}
  11. O post de ScreenBlack em Inicializar matriz! foi marcado como solução   
    Primeiro faça a alocação ponteiro para memória no ponteiro inicial da matriz (linhas), depois faça a alocação de memória para o float.
     
        if ( ( *matriz = malloc( *quantEleme * sizeof(float *)) ) == NULL )    {        printf("Memória insuficiente");        quantEleme = 0;        return;    }     for ( i = 0; i < *quantEleme; i++ )    {        if ( ( (*matriz)[i] = malloc( sizeof(float) * 2 ) ) == NULL )        {            printf("Memória insuficiente");            quantEleme = 0;            return;        }    }
  12. O post de ScreenBlack em Erro no sprintf foi marcado como solução   
    Pode trocar as chamadas das funções para essas que passei acima.
     
    Os dois únicos erro de lógica que encontrei, foram:
    1) Na função "main()", passar a chamada da função "obtemLocalIdadeMenorMedia()" para dentro do "for" e trocar o parâmetro "qtdePessoas" para "contador2".
        printf("Tabela de pessoas que possuem idade menor que a media das idades:\n");    printf("SEXO     IDADE     LOCAL\n");    for ( contador2 = 0; contador2 <= qtdePessoas-1; contador2++ )        if ( idades[contador2] < mediaIdades )        {            obtemLocalIdadeMenorMedia(idades,localIdadeMenorMedia,localViagem, mediaIdades, contador2);            printf("%4c     %5d         %s\n", sexo[contador2], idades[contador2], localIdadeMenorMedia);        }  
    2) Na função "obtemLocalIdadeMenorMedia()", remover o tratamento para validar idades inferiores a média (pois ela já está inclusa no "for" do item 1) e remover o "for", pois a posição está sendo passada por parâmetro:
    void obtemLocalIdadeMenorMedia(int idades[500], char localIdadeMenorMedia[100], char localViagem[500], float mediaIdades, int posicaoCadastro){    if ( localViagem[posicaoCadastro] == 'S' )        sprintf(localIdadeMenorMedia, "ASIA");    else        if ( localViagem[posicaoCadastro] == 'E' )            sprintf(localIdadeMenorMedia, "EUROPA");        else            if ( localViagem[posicaoCadastro] == 'A' )                sprintf(localIdadeMenorMedia, "AMERICA DO NORTE");            else                sprintf(localIdadeMenorMedia, "NUNCA SAIU DO PAIS"); }
  13. O post de ScreenBlack em Usando letras coloridas em C foi marcado como solução   
    O retorno da função strcmp() será zero caso os conteúdos comparados sejam iguais.

    Tente assim:
    for(i=0; i<n; i++) { printf("%s, ", vs[i]); if ( !strcmp(jog[i], "vm") ){ printf("%so ", COR_VERMELHO); } if ( !strcmp(jog[i], "vd") ){ printf("%so ", COR_VERDE); } if ( !strcmp(jog[i], "am") ) { printf("%so ", COR_AMARELO); } if ( !strcmp(jog[i], "az") ) { printf("%so ", COR_AZUL); } if ( !strcmp(jog[i], "mg") ) { printf("%so ", COR_MAGENTA); } if ( !strcmp(jog[i], "ci") ){ printf("%so ", COR_CIANO); } } Para o if() valer, esse valor retornado precisa ser diferente de zero. A exclamação ('!') na frente da função, nesse caso, serve para inverter o resultado. Ou seja, se o retorno for zero (0), ele inverte para um (1).
  14. O post de ScreenBlack em Ajuda, struct, unions ? foi marcado como solução   
    1) A declaração da union segue o mesmo princípio de uma struct, porém, a diferença é que ela compartilha a mesma área de memória entre todos os elementos contidos no "bloco".
        O tamanho dessa área de memória será o do maior elemento contido nela.
        Como a área de memória é compartilhada, logo, o conteúdo de um elemento será sobrescrito e/ou lido pelo do outro.
     
    Por exemplo:

    union Teste{    int valor; // tipo inteiro contém 32 bits    char letra; // tipo char contém 8 bits}; Memória alocada para a union é de 32 bits.
     
    Exemplo struct:

    struct Teste{    int valor; // tipo inteiro contém 32 bits    char letra; // tipo char contém 8 bits}; Memória alocada para a struct é de 40 bits.
     
    2) Para mostrar o valor da multa, pode ser feito através de uma função, onde esta receberá os valores de velocidade da via e do veículo. A partir daí você pode decidir se quer que a função retorne o resultado do cálculo ou ela mesma mostre na tela.
        Depois disso, é só chamar essa função sempre que for mostrar os dados de um veículo.
     
    3) Para fazer a busca pela placa, atualmente você já faz uma leitura dela (para cadastro do veículo), basta fazer outra leitura e então compará-las.
        A comparação seguirá o mesmo princípio que a atual opção 2 do programa, onde mostra os valores.
        Pode utilizar a função strcmp() para isso.
     
    Exemplo:

        char placa[20];     scanf(" %[^\n]s", placa);     if ( strcmp(placa, m[i].placa) == 0 )        printf("Sao Iguais!\n");
  15. O post de ScreenBlack em Biblioteca C - Problema com Code Blocks foi marcado como solução   
    Na linha que referencia o arquivo, tem a expressão "Dev-Cpp". Você está as bibliotecas que vem no Dev-C++ ? Elas estão atualizados?
    Acredito que este seja o motivo.
     
    Encontrei um erro similar, no fórum do projeto Dev-C++ da Bloodshed (a desenvolvedora que parou de atualizar o projeto em 2005), nesse link.
     
    Se desejar, pode baixar a versão do Code::Blocks que vem com o compilador junto (mingw-setup).
    Ou então, utilizar o MinGW Installation Manager, para baixar e manter atualizada sua biblioteca.
     
    Att.
  16. O post de ScreenBlack em Shell Sort não está ordenando foi marcado como solução   
    A necessidade é por causa da função "time(NULL)" chamada na função "srand()".
  17. O post de ScreenBlack em Dúvida sobre Alocação Dinâmica foi marcado como solução   
    Até onde sei, para fazer alocação desse tipo, precisa de um vetor sim.
    Porém, um vetor alocado de maneira dinâmica, ou seja, alocar o índice para ele também.

    Segue um link para um post onde apresento esse exemplo.
     
    Att.
  18. O post de ScreenBlack em "Destrinchando" programa em C/C++ foi marcado como solução   
    "underscore" usado como prefixo, costumam ser usados para especificar tratamentos internos e específicos no código. Não recebem conteúdo informado diretamente pelo usuário ou bibliotecas independentes.
    Os defines destacados por você, são redefinições para chamadas de funções ou simplificações de rotinas.
    Exemplo de um define especificado acima:

    [b]#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo[/b] Quando chamada a função "SERVO_INDEX_TO_TIMER(_servo_nbr)" na verdade estará fazendo a divisão "_servo_nbr / SERVOS_PER_TIMER" e definindo que o valor resultante será do tipo "timer16_Sequence_t".
    É apenas uma forma de simplificação para executar o cálculo.
    Sobre a linha:

    digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,LOW);a expressão:SERVO(timer,Channel[timer])é uma referência para uma posição do vetor "servos":servos[SERVO_INDEX(_timer,_channel)]A expressão acima está especificada pelo define:#define SERVO(_timer,_channel) ( servos[SERVO_INDEX(_timer,_channel)] )A chamada inteira seria:digitalWrite( servos[SERVO_INDEX(_timer,_channel)].Pin.nbr, LOW );Acredito que, suprimindo essas dúvidas, consiga entender de maneira mais clara as demais dúvidas destadas.Att.
  19. O post de ScreenBlack em ajuda para solucionar conflicting type error foi marcado como solução   
    No arquivo listaDeFilas.h, foi declarada uma struct com elementos do tipo fila, porém, no arquivo listaDeFilas.c, está sendo atribuído esse tipo fila em uma variável tipo listaDeFilas:
     
        while ( p->prox )    {        p = p->prox;    } Troquei na struct listaDeFilas.h o tipo dos elementos para listaDeFilas, e o código compilou corretamente:
    typedef struct listaDeFilas{    TF* unidade;    struct listaDeFilas *prox;    struct listaDeFilas *ant;} TLF; Só não sei dizer se o resultado de saída é o que você pretende:
     5  3  4  3  3 5  4  5  4
  20. O post de ScreenBlack em Duvida sobre a licença do MinGW? foi marcado como solução   
    Não sei se esse seria o fórum mais adequado, pois trata-se de licenças e não de código.
    Mas respondendo: Pelo que lí nas licenças, parece ser totalmente livre para distribuição. Isso confirma a permissão do Code::Blocks poder distribuir o MinGW na instalação.
     
    Link para a licença do MinGW
     
    Link para a licença GCC
  21. O post de ScreenBlack em Copiar uma string de trás para a frente em outra string foi marcado como solução   
    Vamos lá...
    Existem alguns errinhos de linguagem específicos do C.
     
    1) Quando se trabalha com string, necessitamos de um terminador de string (definido como '\0'). Ele é um caracter no final da string.
    Dessa forma, se quisermos uma string com 3 caracteres, precisamos declarar o vetor com 4 posições.
    char vetor[4];vetor[0] = 'a';vetor[1] = 'b';vetor[2] = 'c';vetor[3] = '\0'; printf("vetor: %s", vetor); 2) Para declarar uma string como "limpa", deve-se colocar o terminador de string em todas as posições. Existem duas maneiras simples de fazer isso.
    - Usando a forma como você fez, porém trocando o espaço pelo terminador (espaço é um caracter legível, por isso que não considera como limpeza)
    - Usando a limpeza de maneira direta:
    char vetor[10] = {'\0'}; // Inicia limpo o vetor 3) Você está utilizando o sinal de comparação (igualdade) quando vai atribuir o valor do vetor a em b. O sinal de atribuição é apenas um igual ("=").
     
     
    Corrigi seu código para você comparar:
    int main(void){    char a[4] = {'\0'};    char b[4] = {'\0'};    int i = 0;    int j = 0;    int n = 0;     printf ("Digite uma palavra de 3 letras: ");    scanf("%s", a);     for ( i = 2; i >= 0; i-- )        b[i] = a[2-i];     printf ("\n\nPalavra digitada: %s \n", a);    printf ("A palavra digitada anteriormente copiada de tras para frente em b: %s \n\n", ;     system("pause");     return 0;}
  22. O post de ScreenBlack em Alguem me tira essa duvida sobre C por favor :) foi marcado como solução   
    Não é bem assim.
    É possível ter um único caracter em uma string.
    Quando especificado o tipo char como vetor, para utilizar as funções da biblioteca string.h, faz necessário o caracter finalizador de string, mesmo se ela possuir apenas um caracter. É isso que a máscara "%s" trata.
    Já não ocorre quando trabalha com variável simples (não vetor). A máscara "%c" não fará a verificação do terminador de string.
     
    @lunalovegood não é aconselhavel utilizar a função "fflush()" para limpeza no buffer de entrada. A documentação especifica o uso dela apenas para buffer de saída. Por mais que possa funcionar em um ambiente/biblioteca, não é garantida a funcionalidade dela em todos (portabilidade).
    O erro que ocorre quando utiliza a função "scanf()", é que mantem armazenado no buffer de entrada o caracter do "ENTER", depois da letra especificada. Por isso que, na próxima execução da função "scanf()", pode passar batido, sem que ocorra a devida leitura.
     
    Para contornar isso, pode utilizar a limpeza desse "ENTER" de duas formas:
    scanf("%c%*c", &op); // Ignora o caracter seguinte ao pretendido, ou seja, o ENTER ou entãoscanf(" %c", &op); // Adicionar um espaço na frente da máscara Att.

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!