Ir ao conteúdo
  • Cadastre-se

isrnick

Membros Plenos
  • Total de itens

    1.529
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

1.478

Informações gerais

  • Cidade e Estado
    Sao Paulo
  • Sexo
    Masculino
  1. Quase isso. Veja, o seu primeiro scanf é: scanf("%f",&h); Logo espera ler um número decimal racional (número com ponto flutuante). Então quando executar o programa e ele perguntar "Qual sua altura: ", você vai digitar um número no terminal, como 1.8 por exemplo, e então vai apertar Enter para confirmar. Na prática isso significa que você digitou 4 caracteres no terminal '1', '.', '8' e '\n' (quando apertou Enter), ou seja agora tem "1.8\n" na stream de entrada padrão (stdin). O scanf por sua vez vai pegar os caracteres relevantes para o tipo de dado que ele espera ler, nesse caso ele espera ler um número decimal racional, logo ele vai ler os caracteres "1.8" da entrada padrão, converter para o formato de número de ponto flutuante float, e armazenar no endereço de memória apontado por &h. Mas note que o scanf não leu o caractere '\n' da entrada padrão, pois não é relevante para o tipo de dado que ele espera ler, logo ficou sobrando "\n" na entrada padrão sem ser lido. O seu próximo scanf que era: scanf("%c",&sexo); Esperava ler 1 caractere, mas já tem 1 caractere na entrada padrão, o caractere '\n', portanto ele vai ler esse caractere e armazenar no endereço apontado por &sexo. Aí o programa acaba nem dando a oportunidade para o usuário digitar um caractere novo para ser armazenado na variável. adicionado 20 minutos depois Edit: @Malcolm X Agora se não quiser ter que lidar com esse problema eu fiz uma versão do scanf que nunca deixa nada sobrando na entrada padrão:
  2. Mude: scanf("%c",&sexo); Para: scanf(" %c",&sexo); Ou seja, incluindo o espaço antes do %c no scanf, para descartar o caractere nova linha '\n' (e qualquer outro caractere vazio como espaço, tabulação, etc, que tiver) que ficou sobrando do scanf anterior (o caractere é adicionado à entrada quando você aperta Enter no terminal/cmd), assim o %c no scanf não vai mais ler esse caractere nova linha como a entrada digitada pelo usuário.
  3. Sim. Bom, minha função na verdade deveria se chamar IBMfloattoSystemfloat, afinal numa máquina que não use o formato IEEE754 para o tipo float ela converteria para esse outro formato de tipo float (e imprimiria o número correto de qualquer maneira). Eu não tentei, mas converter no sentido oposto pode não ser tão trivial.
  4. @Mauro Britivaldo Elabore nos motivos de escolher char * e como usaria no lugar do int.
  5. Sim, eu não quis dizer que usar uma variável static em uma função recursiva seria um erro. Eu estava dizendo que se está acompanhando a posição numa variável estática deve ter um modo de sempre colocar o caractere na posição correta diretamente, e fazer a função sem ter que copiar várias vezes. Entendi. Aqui está minha melhor versão até agora, usando uma variável static para contar o número de bits, e usa o retorno do ponteiro para ir avançando pelo vetor para mover para a posição correta para colocar o respectivo caractere 0 ou 1 do bit, e usa a variável contadora para saber quando deve parar de avançar. E mais importante não tem ciclos de repetição percorrendo o vetor várias vezes e nem faz cópias, cada posição da string só é atribuída um caractere uma vez. char *binarystr(char *bin, long long int n){ unsigned long long int b = (unsigned long long int)n; static int count = 0; char *p; if (b){ count++; p = binarystr(bin, b >> 1); *p = (b & 1) ? '1' : '0'; if(p-bin+1 < count) return p+1; else count = 0; } else if (count == 0){ bin[0] = '0'; bin[1] = '\0'; } else { bin[count] = '\0'; } return bin; }
  6. Não entendi... Esse strcat copia apenas 2 bytes toda vez. Seria o mesmo que fazer: int i; for(i=0; bin[i]; i++); bin[i] = c[0]; //bin[i] = (b & 1) ? '1' : '0'; bin[i+1] = c[1]; //bin[i+1] = '\0'; adicionado 10 minutos depois @arfneto Aqui deixa eu reescrever a função sem usar funções da biblioteca string.h para ficar mais claro: char *binarystr(char *bin, long long int n){ unsigned long long int b = (unsigned long long int)n; static int notzero = 0; if (b){ notzero = 1; binarystr(bin, b >> 1); size_t i; for(i=0; bin[i]; i++); bin[i] = (b & 1) ? '1' : '0'; bin[i+1] = '\0'; } else if(notzero) { *bin = '\0'; } else { bin[0] = '0'; bin[1] = '\0'; } notzero = 0; return bin; }
  7. @Mauro Britivaldo Sua solução é meio complicada, atualizando uma variável static para saber onde está, e também fazendo várias cópias para mover os caracteres para a direita... Segue minha solução para preencher um vetor de char com a string do número binário: #include <string.h> char *binarystr(char *bin, long long int n){ unsigned long long int b = (unsigned long long int)n; static int notzero = 0; char c[] = {'\0','\0'}; if (b){ notzero = 1; c[0] = (b & 1) ? '1' : '0'; binarystr(bin, b >> 1); strcat(bin, c); } else if(notzero) { *bin = '\0'; } else { bin[0] = '0'; bin[1] = '\0'; } notzero = 0; return bin; } E um exemplo de programa utilizando a função: #include <stdio.h> #include <limits.h> #include <string.h> char *binarystr(char *bin, long long int n){ unsigned long long int b = (unsigned long long int)n; static int notzero = 0; char c[] = {'\0','\0'}; if (b){ notzero = 1; c[0] = (b & 1) ? '1' : '0'; binarystr(bin, b >> 1); strcat(bin, c); } else if(notzero) { *bin = '\0'; } else { bin[0] = '0'; bin[1] = '\0'; } notzero = 0; return bin; } int main() { long long int n; char s[1 + 8*sizeof n]; printf(" Decimal -> Binario\n"); n = 12; printf("%20lld -> %s\n", n, binarystr(s, n)); n = 1; printf("%20lld -> %s\n", n, binarystr(s, n)); n = -1; printf("%20lld -> %s\n", n, binarystr(s, n)); n = LLONG_MAX; printf("%20lld -> %s\n", n, binarystr(s, n)); n = LLONG_MIN; printf("%20lld -> %s\n", n, binarystr(s, n)); return 0; }
  8. Onde está o enunciado? De qualquer maneira se é estritamente n > 0 então deveria ser unsigned long int n , mas ainda assim não dá pra retornar todos os valores possíveis de long int n para n > 0 como uma representação decimal do número binário, visto que mesmo para o tipo short só cabe no tipo long long int . Nesse caso seria melhor fazer uma função que imprime o binário ao invés de retornar um número decimal que representa o binário, pois assim poderia converter corretamente qualquer tamanho de número binário, nesse caso a função ficaria assim (também fiz funcionar para números negativos): #include <stdio.h> #include <limits.h> void printbinary(int a){ unsigned int b = (unsigned int)a; static int notzero = 0; if (b){ notzero = 1; printbinary(b >> 1); printf("%d", b & 1); } else if (notzero){ notzero = 0; } else { printf("0"); } } int main() { long int n; printf(" Decimal -> Binario\n"); n = 12; printf("%20ld -> ", n); printbinary(n); n = 1; printf("\n%20ld -> ", n); printbinary(n); n = LONG_MAX; printf("\n%20ld -> ", n); printbinary(n); return 0; } Ou então teria que fazer uma função que recebe um vetor de char como parâmetro e o preenche com uma string que compõe o número binário, mas aí teria que passar 2 parâmetros para a função recursiva: o vetor e o número a ser convertido.
  9. Nenhuma das funções apresentadas até agora funcionam para números negativos (números grandes também seria um problema). Segue uma solução que funciona para números negativos: #include <stdio.h> #include <limits.h> unsigned long long int binary(short a){ unsigned short b = (unsigned short)a; if (b){ return (unsigned long long int) binary(b >> 1) * 10LLU + (b & 1); } return 0LLU; } int main() { short n = 12; printf("Decimal -> Binario\n"); printf(" %6hd -> %16llu\n", n, binary(n)); n = -12; printf(" %6hd -> %16llu\n", n, binary(n)); n = 1; printf(" %6hd -> %16llu\n", n, binary(n)); n = -1; printf(" %6hd -> %16llu\n", n, binary(n)); n = SHRT_MAX; printf(" %6hd -> %16llu\n", n, binary(n)); n = SHRT_MIN; printf(" %6hd -> %16llu\n", n, binary(n)); return 0; } Note que o parâmetro da função precisa ser do tipo short (para limitar a 16 bits) e que o retorno da função precisa ter tipo unsigned long long int para caber o número decimal com 16 casas que representa o número binário no valor retornado.
  10. Não, strcmp() não ignora espaços. Precisa remover os espaços da string também.
  11. @userpc_2020 @AdrianoSiqueira Nenhum dos 2 programas atendem aos requisitos do enunciado, pois de acordo com o enunciado o programa deve ser capaz de ler frases inteiras, e analisar se são palíndromos eliminando os espaçamentos e pontuação antes de inverter e checar se é igual ao sentido normal. Outro problema é que os programas não consideram que pode ter letras maiúsculas e letras minúsculas na frase, e por isso ele pode acusar que não é palíndromo quando realmente é palíndromo, pois em C o caractere de uma letra maiúscula não é considerado igual ao caractere dessa mesma letra minúscula. Eu e o @Mauro Britivaldo postamos soluções mais completas para esse problema nesse tópico: Esse é um exercício comum, segue outro tópico com o mesmo problema:
  12. isrnick

    C Resultado é sempre zero

    Segue uma lista do que tem que corrigir no código original postado no tópico: 1 - Incluir as bibliotecas stdio.h e math.h 2 - Mudar o tipo da função calcularhipotenusa para double para retornar um número double 3 - Mudar os tipos dos parâmetros da função c1 e c2 para double ao invés de int 4 - Corrigir a equação para calcular a hipotenusa corretamente usando c1 e c2 5 - Corrigir o tipo da função main trocando o tipo de void para int 6 - Corrigir o especificador de tipo nas funções scanf para usar o especificador correto para o tipo double ( %lf ) 7 - Corrigir o último comando da função main para retornar 0 (zero) ao invés de retornar a função calcularhipotenusa
  13. isrnick

    C++ Lançamentos de nota em C++

    if(nota > maior){ nota = maior; } else if(nota < menor){ nota = menor; } Estão errados, não é nota que deve receber maior (ou menor), é o contrário, maior (ou menor) deve receber o valor da nota. adicionado 5 minutos depois Não faz sentido usar valores máximos e mínimos do tipo int para variáveis float, se vai usar esse método é melhor usar os valores máximo e mínimo do tipo float. @kampa896 De qualquer maneira recomendo usar a primeira nota digitada como valores maior e menor iniciais.
  14. @devair1010 É que ele chama "alterar um vetor recebido por um ponteiro parâmetro da função" de "retornar através do parâmetro". Retornar não está se referindo a usar a palavra chave return nesse caso.
  15. @XIXX posta o que você tentou fazer e não deu certo.

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...

Aprenda a ler resistores e capacitores

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!