Bom dia Celso,

Creio que você esteja fazendo um curso na área de informática aplicada ao
desenvolvimento de sistemas, como Sistemas de Informação, Tecnologia em
Informática, Ciências da Computação, ou algo do gênero.

Eu não sou formado, mas entendo um pouco de C, e até poderia te dar um
código com a solução pronta, mas se eu fizer isso não estaria te ajudando,
apenas estaria retardando seu aprendizado.

Baseado na minha experiência, para você aprender programação não há melhor
caminho do que o sistema "tentativa erro/acerto", só assim mesmo para
aprender C e lógica de programação. E, sinceramente, se você está com
dificuldades com este problema, prepare-se, pois a frente vem coisa muito
mais complicada. Portanto, estude, sente na frente do computador, e destroce
os bytes, sem dó.

Não se esqueça de deixar uma garrafa de café do lado do seu computador
pronta para te servir (com sua intervenção é claro =D). E outra coisa, nós
seres humanos não somos máquinas perfeitas, somos como o Windows, de vez em
quando travamos. Nestes casos, o melhor mesmo é você dar uma paradinha,
levantar do computador, dar um tempo pra cabeça. As soluções surgem que nem
um piscar de olhos.

Para não ficar só no sermão, vou te dar umas dicas do que você deverá fazer.

Pelo que vi, em termos gerais, o programa faz uma conversão binária dos
números lidos, conta os números 1 resultante da conversão e diz se a
contagem deles é impar ou par. Ou seja, não é só separar números pares de
ímpares, pois teremos números pares que, com sua contagem de números uns,
ficarão ímpares, e vice-versa. Vou citar alguns exemplos:
  DEC BIN  1 0001  2 0010  3 0011  4 0100  5 0101  6 0110

Observe que os números 1, 2 e 4 seriam alocados como números ímpares, pois
tem um número ímpar de uns (ou que a soma deles for ímpar), e que os números
3, 5 e 6 seriam pares. É assim que o algoritmo do programa funciona.

Na boa, não é difícil você resolver esse problema. Com 4 ou 5 linhas de
código simples você resolve. Esse é o tipo de código que você tem que ler
ele, entender o que ele faz, e modificar o necessário.

Abraços





 Em 10 de setembro de 2011 08:57, Celso Henrique
<celsofigueir...@gmail.com>escreveu:

> Prezados Ubundistas.
>
> Estou precisando resolver este programa em C, abaixo, mas não estou
> conseguindo, sera que voce poderia me ajudar.
>
> UM ODIOSO E MALVADO PROGRAMA EM C
> Brincadeiras à parte, de fato existe um conjunto de números chamado
> Odious (de odd – paridade
> ímpar), cuja conversão binária possui um número ímpar de 1s. Qualquer
> número que não é
> considerado “odious” é considerado Evil (de even – paridade ímpar),
> significando que sua conversão
> binária possui um número par de 1s.
> Seu desafio nesta etapa será modificar um programa em C para que ele
> atenda aos requisitos listados
> abaixo:
> Algumas explicações sobre o que esses membros são capazes!
> ODIOUSRC – É o programa em C. Neste momento tudo que ele faz é listar
> números Odious e erros,
> mas iremos mudar isso!
>
> ODIOUS – É o arquivo de entrada com todos os números a serem
> verificados pelo programa.
>
> Ok, tudo certo?  visualize os dois membros que foram criados, o ODIOUS
> e o OERROR.
> 1. Modifique o ODIOUSRC de forma a gerar um terceiro output. Seu
> programa já cria o ODIOUS e
> OERROR, agora deverá gerar o membro OEVIL, que imprime números “evil”.
> 2. Modifique o ODIOUSRC de forma a incluir duas linhas de cabeçalho em
> cada output:
> 1. Seu nome - Odious/Evil Number (ex: “Agatha Flesch – Odious Number”
> para um relatório de
> número odious, e assim por diante).
> 2. Linha em branco
>
> Nota: Se seu membro OERROR repetir as linhas duas vezes, você não
> completou esta parte com
> sucesso. Refaça seu código.
> -----------------------------
> ODIOUSRC:
> ----------
> #include <stdio.h>
> #include <stdlib.h>
> #include <errno.h>
> #include <string.h>
>        FILE *odiousFile;
>        FILE *errorFile;
>        FILE *inputFile;
>        char buffer[81];
>        int bytesWritten;
> main()
> {
>  int isOdious(int);
>  int NumberOfOnes;
>        int i;
>        /*************************************/
>        /*     Open file to write output     */
>        /*************************************/
>        odiousFile = fopen("DD:ODIOUS", "w");
>        if (odiousFile == NULL)
>        {
>                printf("open error:   %d/%s\n", errno, strerror(errno));
>                exit(99);
>        }
>        /*************************************/
>        /*     Open file to write errors     */
>        /*************************************/
>        errorFile = fopen("DD:ERRORS", "w");
>        if (errorFile == NULL)
>        {
>                printf("open error:   %d/%s\n", errno, strerror(errno));
>                exit(99);
>        }
>        /*************************************/
>        /*     Open file to read input       */
>        /*************************************/
>        inputFile = fopen("DD:INPUT", "r");
>        if (inputFile == NULL)
>        {
>                printf("open error:   %d/%s\n", errno, strerror(errno));
>                exit(98);
>        }
>        /*************************************/
>        /*     Run program                   */
>        /*************************************/
>  while (fscanf(inputFile,"%d",&i) != EOF) {
>    if (isOdious(i)==1) {
>                           bytesWritten = sprintf(buffer,"%d is
> odious\n",i);
>                           fwrite(buffer, 1, bytesWritten, odiousFile);
>    }
>  }
>        /*************************************/
>        /*     Close output files            */
>        /*************************************/
>        fclose(odiousFile);
>        fclose(errorFile);
>        /*************************************/
>        /*     Close input file              */
>        /*************************************/
>        fclose(inputFile);
>        return 0;
> }
> int isOdious (int myInt)
> {
>  int NumberOfOnes;
>  NumberOfOnes=0;
>  if (myInt==0) {
>                         bytesWritten = sprintf(buffer,"0 not
> supported!\n");
>                         fwrite(buffer, 1, bytesWritten, errorFile);
>    return 100;
>  }
>  if (myInt>1024) {
>                         bytesWritten = sprintf(buffer,"%d too
> large!\n",myInt);
>                         fwrite(buffer, 1, bytesWritten, errorFile);
>    return 101;
>  }
>  while (myInt>0) {
>    if (myInt%2==1) {
>      NumberOfOnes=NumberOfOnes+1;
>      myInt=myInt-1;
>    }
>    myInt=myInt/2;
>  }
>  if (NumberOfOnes%2==1)
>           return 1;
>  else
>    return 0;
> }
> ------------------------------------------
> ODIOUS:
> -------
> É o arquivo que contem os numeros de: 1,2,3,....498,499,500,1027.
> Este programa da forma em que esta, gera, dois arquivos; o ODIOUS e o
> OERROR.
> Este programa diz se o numero tem paridade par.
> O que eu devo fazer ou alterar, para gerar o outro arquivo de paridade
> impar.
>
> Celso.
>
>  --
> Mais sobre o Ubuntu em português: http://www.ubuntu-br.org/comece
>
> Lista de discussão Ubuntu Brasil
> Histórico, descadastramento e outras opções:
> https://lists.ubuntu.com/mailman/listinfo/ubuntu-br
>
-- 
Mais sobre o Ubuntu em português: http://www.ubuntu-br.org/comece

Lista de discussão Ubuntu Brasil
Histórico, descadastramento e outras opções:
https://lists.ubuntu.com/mailman/listinfo/ubuntu-br

Responder a