Ajuda em programa em C

blue_ice

Power Member
Boa noite,

Precisso da vossa ajuda e de dicas para eu preceber como e que vou fazer este programa:
o programa deve de ler um numero inteiro positivo e escerver no ecrã a soma dos produtos dos seu numeros pelas posiçãoes que ocupam, o programa deve de se certificar que o numero lido e valido e que todas as condições de erro são tratadas de forma adequada.
o programa deve possuir um ciclo de leitura e ser capaz de processar mais de um numero de cada vez.
o programa deve dizer que este tipo de numero 15a215 não e valido.

so posso usar printf, scanf, if, while

agradecia qualquer ajuda ou dica em como fazer este tipo de programa.
 
Não percebi bem o objectivo do programa. É simplesmente pedia ao user que digite um número e somar propriamente o quê?...
Cumps
 
boa noite

o objectivo do programa é, digitas um numero ex:24566 e depois divide o numero 2-1º,4-2º,5-3º... depois multiplicas o 2*1+4*2+5*3... e no fim apresentas o resultado, o que o programa tem de fazer e isto mas tem de dizer ao introduzires um numero destes 254s1 que não e valido e não pode ser lido caracter a carecter tem de ser lido num só.
 
não podes ler o numero como uma string? é que não estou mesmo a ver sem leres caracter a caracter ou como string, como é que podes fazer isso. Se puderes ler como string, então o programa é bastante facil.
 
tem de ser em C "puro" né?
lês o input para um buffer, iteras por esse buffer char a char a ver se é tudo números.

aqui vai algum codigo, mas com comments:

Código:
// funcao le do stdin para um buffer e mete a string so com numeros:
void readInputToBuffer( char* buffer, int size )
{
    int i = 0;
    // le do stdin para o buffer
    scanf( "%s", buffer );

    // verificar se todos os chars la dentro sao numeros
    for( i = 0; i < size; i++ )
    {
        if( buffer[i] < '0' || buffer[i] > '9' )
        {
            // tem um char nao digito, mete a NULL e retorna
            buffer = NULL;
            return;
        }
    }
    // agora ja se tem a certeza que e so numeros la dentro
    // meter um '\0' no final da string para se poder trabalhar com ela
    for( i = 0; i < size; i++ )
    {
        if( buffer[i] == '\n' )
        {
             buffer[i] = '\0';
             return;
        }
    }
    // se chegou aqui e porque foi introduzido mais elementos que o buffer aguenta
    // aumentar o size para a proxima
    buffer = NULL;
    return;
}

e pronto agora no main é chamar essa funcao e é uma string so com numeros de certeza, é facil fazer o pedido agora, basta iterar por ela e trabalhar. usando atoi() converte char para int, e strlen() para saber o tamanho

Código:
int main( int argc, char** argv )
{
    char buffer[100];
    readInputToBuffer( buffer, 100 );

    if( buffer == NULL )
    {
        printf( "O input nao contem so numeros." );
        return 0;
    }
    // pronto agora e trabalhar com a string como quiseres.. e so iterar e fazer o pedido.. facil.
    for( i = 0; i < strlen( buffer ); i++ )
    {
        // fica aqui por completar para ver se aprendeste alguma coisa
        // sugestao, usa a funcao atoi() e faz contas. guarda resultados em variaveis temporarias.
        // i tem a posicao actual, usa isso.
    }

    printf( "resultado: %d\n", resultado );
    return 0;
}

http://www.cplusplus.com tens la a referencia para a biblioteca standard toda.

PS: ha funcoes do genero isdigit() etc, isso agora fica para ti para melhorares. o que eu fiz serve como guia.
PS2: so agora vi que não podes usar atoi() ou strlen(), mas lá está é facil saber que digito é fazendo camparações como buffer == '1', e strlen() podes guardar num inteiro quando estas a iterar pelo buffer até encontrar '\0'. e assim tb sabes o tamanho do imput.
 
Última edição:
Credo, usar strings para um problema numérico? E que tal usar divisões e restos de divisões?

Nota: Se os números a ler forem muito grandes até compreendo o uso de strings.
 
Última edição:
Credo, usar strings para um problema numérico? E que tal usar divisões e restos de divisões?

Nota: Se os números a ler forem muito grandes até compreendo o uso de strings.
o problema é que o programa dele tem de tratar erros de input, se fizeres scanf( "%d", numero ) e o user meter la algo sem ser numeros, o comportamento da funcao é "undefined". ou seja mete lixo la dentro.
 
o problema é que o programa dele tem de tratar erros de input, se fizeres scanf( "%d", numero ) e o user meter la algo sem ser numeros, o comportamento da funcao é "undefined". ou seja mete lixo la dentro.

Do man do scanf

RETURN VALUES
These functions return the number of input items assigned. This can be
fewer than provided for, or even zero, in the event of a matching fail-
ure. Zero indicates that, although there was input available, no conver-
sions were assigned; typically this is due to an invalid input character,
such as an alphabetic character for a `%d' conversion. The value EOF is
returned if an input failure occurs before any conversion such as an end-
of-file occurs. If an error or end-of-file occurs after conversion has
begun, the number of conversions which were successfully completed is
returned.
 
Do man do scanf
*sigh*

isso é realmente assim quando o input começa só com characteres, a verdade é que o scanf começa logo a conversão sem sequer ver o que vem a frente.

se fizeres input de numeros seguido de characteres não-numericos a conversão é errada mas ainda devolve como se tivesse sido realizada.

int input;
int numero;

numero = scanf( "%d", &input );
printf( "%d\n", numero );

agora mete como input: "123asd" e vê qual o valor em numero.

por alguma razão o scanf (e praticamente todas as funções de argumento variavel da stdlib) são consideradas perigosas e aconselha-se o uso alternativo que os compiladores fornecem (como scanf_s no visual studio).
 
Última edição:
sapropel o resultado scanf é correcto, lê para o inteiro até acabarem os digitos o que está muito longe de ser um comportamento "undefined".

Edit: Reparei agora que o programa tem de detectar números mal formados. Sendo assim é mesmo melhor verificar a string.
 
Última edição:
Back
Topo