Página 1 de 2

matriz

MensagemEnviado: 09 Fev 2009 09:03
por antonio
Pessoal tudo bem!

Pessoal a minha duvida de hoje è a seguinte......todos nós sabemos como declarar de forma basica uma matriz ou seja Ex;

int v[5];

bem ...isto è declaramos uma matriz de 6 elememtos ou seja, de indice
0 ao indice 4;

Se eu quiser colocar no indice 0 o numero 23 seria assim...v[0]=23;

Agora o que eu pertendo è receber por teclado 4x4 o numero 23 e colocar no indece 0 da matriz "v"

Como nós sabemos para receber esse numero temos que armezenar numa variavel do tipo INT ,
int res;
res=kbhit ();
Atè aqui penso que a logica esta certa, agora para o numero 23 e necessario presionar as teclas 2 e 3 no teclado e armazenar na variavel "res" num só, ou seja 23! e depois vai para o indice 0 da matriz "v"

A duvida è...... como devo fazer pra via teclado armazenar o numero 23 no indice 0 da matriz "v"?? e outro numero no indice 1 e os segintes indices?

Pessoal estou um pouco confuso com este assunto das matriz, espero que comprirendam a minha duvida e me ajudem ok!

Até
Um abraço

Re: matriz

MensagemEnviado: 09 Fev 2009 09:07
por ffcprog
antonio escreveu:Pessoal tudo bem!

Pessoal a minha duvida de hoje è a seguinte......todos nós sabemos como declarar de forma basica uma matriz ou seja Ex;

int v[5]; ??? como é? matriz de 6 ? Achava que éra de 0 a 4...


bem ...isto è declaramos uma matriz de 6 elememtos ou seja, de indice
0 ao indice 6;

Se eu quiser colocar no indice 0 o numero 23 seria assim...v[0]=23;

Agora o que eu pertendo è receber por teclado 4x4 o numero 23 e colocar no indece 0 da matriz "v"

Como nós sabemos para receber esse numero temos que armezenar numa variavel do tipo INT ,
int res;
res=kbhit ();
Atè aqui penso que a logica esta certa, agora para o numero 23 e necessario presionar as teclas 2 e 3 no teclado e armazenar na variavel "res" num só, ou seja 23! e depois vai para o indice 0 da matriz "v"

A duvida è...... como devo fazer pra via teclado armazenar o numero 23 no indice 0 da matriz "v"?? e outro numero no indice 1 e os segintes indices?

Pessoal estou um pouco confuso com este assunto das matriz, espero que comprirendam a minha duvida e me ajudem ok!

Até
Um abraço

MensagemEnviado: 09 Fev 2009 09:17
por antonio
Amigo ffcprog,voce cara tem razão !

agradeço por lembar o erro,mas como eu disse estou um pouco confuso! com isto das matrizes!

Mas quanto a duvida contunua :shock:

grato mesmo

MensagemEnviado: 09 Fev 2009 09:59
por joao
Olha só,

vc tem que entender o seguinte:
int v[5]; //Tem 5 posições! De 0 a 4.

agora, kbhit é usado para vc saber se uma tecla foi ou não pressionada.
Logo, se temos:
Código: Selecionar todos
while(1)
{
   printf("teste");
   if(kbhit())
   {
        break;
    }
}

Vc vai ficar imprimindo teste até alguém pressionar uma tecla do teclado. Qual tecla? Não se sabe! Pois ele apenas retorna falando que tem uma tecla no buffer!

Mas, tentando entender o que vc quer, vc quer pegar um valor passado pelo usuário e somar mais 100 por exemplo:
Código: Selecionar todos
int  main(int argc, char **argv)
{
    int numero;

    printf ("digite um numero: ");
    scanf ("%d",&numero); //pegando o número da pessoa

    printf("%d + 100 = %d ", numero, numero +100);

    return 0;
}


Viu que eu não usei nada além de um int?
Você não precisaria usar um array de ints aqui por que não é necessário! :)

[]'s

MensagemEnviado: 09 Fev 2009 12:52
por msamsoniuk
nao seria isso que vc quer?

Código: Selecionar todos
#include <stdio.h>

int main()
{
        int v[6];
        int i,c;

        for(i=0;i!=6;i++)
        {
                v[i] = 0;

                while(1)
                {
                        c = getchar()-'0';

                        if(c>=0&&c<=9)
                        {
                                v[i] = 10*v[i] + c;
                        }
                        else
                        {
                                break;
                        }
                }
        }

        for(i=0;i!=6;i++)
        {
                printf("v[%d] = %d\n",i,v[i]);
        }

        return 0;
}


basicamente ele varre o array do elemento 0 a 6, ele limpa a entrada do array e entao entra em um loop de recepcao de caracteres. a cada caractere recebido, ele valida se eh um numero de 0 a 9, se for ele multiplica o valor existente no array por 10 e soma o novo valor digitado. se nao for um numero de 0 a 6, ele entende que o numero atual acabou, sai fora do loop de entrada e parte para o proximo elemento do array.

no final imprimo todos os elementos do array e vejo os numeros q eu digitei. nao eh uma rotina de entrada muito completa, entre um numero e outro pode existir apenas 1 separador (enter, espaco ou qq outro caracter nao numerico). mas dando uma pensada eh bem facil consertar isso. em um teclado apenas numerico, tipo telefone, vc poderia usar * ou # para deliminar os numeros, por exemplo.

MensagemEnviado: 09 Fev 2009 15:29
por Djalma Toledo Rodrigues
Marcelo Samsoniuk escreveu: v[i] = 10*v[i] + c;

Que legal.

MensagemEnviado: 09 Fev 2009 19:20
por antonio
Pessoal tudo bem !!

Desde jà agrdeço mais uma vez aos colegas pela força !¨

eu esqueci de falar ue eu estou programando em C e com o compilador CCS !

Marcelo voce percebeu minha duvida e era isso que realmente eu estava de ver claro e fivou beleza mesmo ! só resta a seguinte duvida!

Pelo que entendi no seu codigo so vai atè a contagem até 99 com este exemplo!
v[i] = 10*v[i] + c;

Agora se eu quiser colocar o numero 123 na matriz do mesmo modo do exemplo cima ou seja os 23 no indice 0 não dà? por o que eu percebi, como fazer para colocar qualquer numero desde 0 atè 255 ou mais se for possivel? numa posição da matriz!

Eu espero nao estando enchendo ! Ok

Abraço

MensagemEnviado: 09 Fev 2009 19:37
por msamsoniuk
opa! eu pensei nisso sim... na verdade ele esta em loop fazendo a entrada, entao vc pode digitar numeros realmente muito grandes e ele vai aceitar na entrada! :)

para vc entender melhor:

vc digita 1, ele armazena v[i] = 1
vc digita 2, ele armazena v[i] = v[i]*10 + 2, portanto v[i] = 12
vc digita 3, ele armazena v[i] = v[i]*10 + 3, portanto v[i] = 123
vc digita *, ele incrementa i e vai para o proximo v[i]

ateh funciona! ele soh para de acumular quando vc digita um codigo nao numerico, por exemplo, *. assim, se vc decarar v[] como long, vc pode digitar numeros realmente longos, sem problemas! :)

um bug obvio do codigo eh que ele nao aceita numeros negativos, entao uma boa ideia eh usar o atributo unsigned para o array v[]. outro bug obvio eh que ele nao testa overflow.

entao se vc declarar v[] como unsigned e digitar 1234, vai ter o seguinte resultado:

vc digita 1, ele armazena v[i] = 1
vc digita 2, ele armazena v[i] = v[i]*10 + 2, portanto v[i] = 12
vc digita 3, ele armazena v[i] = v[i]*10 + 3, portanto v[i] = 123
vc digita 4, ele armazena v[i] = v[i]*10 + 4... mas 123*10 = 1230 e isso eh truncado como 206, somando 4 fica v[i] = 210...

um resultado bem estranho... a alternativa seria testar antes de multiplicar. se v[i]<25, v[i]*10 sera 250 e pode aceitar valores de 0 a 5, assim fica limitado a 255 o valor maximo.

outra possibilidade bem bacana seria fazer o teste para ver se v[i]>25, dae ativa um flag que indica overfow. se v[i] = 25, testa se o proximo valor eh maior que 5, se for ativa o flag de overflow. assim em qq situacao, de overflow, vc simplesmente coloca o maximo valor possivel 255... fica bacana, pq o cara com pressa pode digitar 999 direto e jah sair automaticamente o valor maximo 255 :)

MensagemEnviado: 09 Fev 2009 20:50
por antonio
Amigo Marcelo Grato pelo apoio !

Bem ....vou estudar melhor o seu topico, è bem interessante !tem materia que eu nao tinha conhecimento !

Neste momento so tenho a agradecer

Um abraço

MensagemEnviado: 10 Fev 2009 01:01
por Renie
Marcelo Sam...,

Este post não é offtopic! É um comentário sobre o seu post com o código!

Eu não uso C, e também não vou repetir aqui os motivos, mas, entendo
de 80% a 100% a maioria dos que leio (acho!).

Então, meu comentário será só sobre o código, pequeno, conciso,
correto ( eu ví/sei que não há o controle de overflow! e nem deveria,
isso deve ser implementado por quem vai usar e saber seus limites!).

Eu trabalho com software, e reconheço um bem implementado!

Parabéns pelo algorítmo!

[]'s
Renie

Ps: post editado para corrigir os erros de Português (se sobrou algum,
me desculpe!)

MensagemEnviado: 10 Fev 2009 09:52
por antonio
um bug obvio do codigo eh que ele nao aceita numeros negativos, entao uma boa ideia eh usar o atributo unsigned para o array v[]. outro bug obvio eh que ele nao testa overflow.

entao se vc declarar v[] como unsigned e digitar 1234, vai ter o seguinte resultado:

vc digita 1, ele armazena v[i] = 1
vc digita 2, ele armazena v[i] = v[i]*10 + 2, portanto v[i] = 12
vc digita 3, ele armazena v[i] = v[i]*10 + 3, portanto v[i] = 123
vc digita 4, ele armazena v[i] = v[i]*10 + 4... mas 123*10 = 1230 e isso eh truncado como 206, somando 4 fica v[i] = 210...

um resultado bem estranho... a alternativa seria testar antes de multiplicar. se v[i]<25, v[i]*10 sera 250 e pode aceitar valores de 0 a 5, assim fica limitado a 255 o valor maximo.

outra possibilidade bem bacana seria fazer o teste para ver se v[i]>25, dae ativa um flag que indica overfow. se v[i] = 25, testa se o proximo valor eh maior que 5, se for ativa o flag de overflow. assim em qq situacao, de overflow, vc simplesmente coloca o maximo valor possivel 255... fica bacana, pq o cara com pressa pode digitar 999 direto e jah sair automaticamente o valor maximo 255 :)[/quote]

Marcelo tudo bem !

cara depois de analizar esta parte do teu poste te comento que nao entendi realmente o que voce falou!

olha soh voce falou......vc digita 4, ele armazena v[i] = v[i]*10 + 4... mas 123*10 = 1230 e isso eh truncado como 206, somando 4 fica v[i] = 210... aqui eu entendi que 206 e porque a variavel "v" ser tipo int, eu estou certo ou errado?

Depois isto aqui nao entrou não,voce falouo seguinte.......outra possibilidade bem bacana seria fazer o teste para ver se v[i]>25, dae ativa um flag que indica overfow. se v[i] = 25, testa se o proximo valor eh maior que 5, se for ativa o flag de overflow. assim em qq situacao, de overflow, vc simplesmente coloca o maximo valor possivel 255... fica bacana, pq o cara com pressa pode digitar 999 direto e jah sair automaticamente o valor maximo 255 :)[/quote]..........!

aqui(seria fazer o teste para ver se v[i]>25,) o porque de fazer o teste >25?

Olha se tem um tempo e me poder clarificar de forma mais basica estes pontos agradeço

Mais uma vez agradeço

MensagemEnviado: 10 Fev 2009 10:30
por pbernardi
Olá antonio,

Nesse caso. vamos supor que será feito a entrada de 3 números: a, b e c (no caso, seriam v[0], v[1] e v[2]).

Entra com um número a qualquer.
Depois, entra-se com um número b qualquer.

Observe que a e b são os seus números mais significativos, e falta entrar com o c, que é o número menos significativo (a*100 + b*10 + c).

Então, se você testar a e b, e verificar se for maior que 25, já é um número inválido, pois sua variável só armazena até 255.

Se for igual a 25, então é feita mais uma checagem, no valor c, para verificar se essa é menor ou igual a 5. Se for 6, por exemplo, você terá 256 e sua variável terá um overflow.

Ficou mais claro?

MensagemEnviado: 10 Fev 2009 10:50
por msamsoniuk
entao antonio, a jogada eh que a rotina de entrada permite o usuario digitar quantos caracteres ele quiser para formar o numero desejado... obviamente isso tem o efeito colateral de permitir que ele digite numeros maiores do que vc pode armazenar nas variaveis.

usei como exemplo um unsigned char, onde os valores podem variar apenas entre 0 e 255 (no caso de int, depende da plataforma, mas em um mcu tipico o valor pode ser entre 0 e 65535). por exemplo, uma rotina para entrada de endereco IP irah requerer 4 numeros com valor entre 0 e 255. como vimos, se vc deixar o usuario digitar qq numero, o resultado armazenado sera meio aleatorio, resultado de uma multiplicacao e soma truncados, o que nao eh muito legal. se o usuario digitar 256, por exemplo, o valor efetivamente computado na variavel sera zero. se o usuario digitar 257, o valor computado sera zero. isso ocorre devido a truncagem durante a multiplicacao e soma.

obviamente, nao tem como vc detectar o overflow depois q ele ocorre, entao nao tem como vc fazer um tratamento. a unica fora eh detectar antes de ocorrer, por isso eh feito o teste de v[i]<25. se v[i] for 26, por exemplo, quando v[i] for multiplicado por 10 ele tera valor 260, portanto sera truncado para o valor 4.

assim, vc pode pensar da seguinte forma de multiplicar e somar:

Código: Selecionar todos
if(v[i]>25) /* detecta overflow antes de multiplicar por v[i] por 10 */
{
  v[i] = 255; /* seta o valor maximo */
}
else
{
  if(v[i]==25 && c > 5) /* verifica outra condicao de overflow */
  {
    v[i] = 255; /* seta o valor maximo */
  }
  else
  {
    v[i] = v[i]*10+c; /* condicao normal */
  }
}


no primeiro if ele testa se v[i] eh maior que 25. se for maior, independente do numero que o usuario digitar teremos overflow, entao ele jah fixa o resultado como 255.

no segundo if temos v[i] menor ou igual a 25. se for igual a 25, teremos algo bem no limite, ou seja, multiplicado ele tera valor 250, mas pode receber apenas digitos de 0 a 5. se for maior que 5, setamos o valor maximo de 255.

finalmente, a condicao final eh a condicao normal, onde nao temos overflow. se o teste fosse para uma variavel unsigned int de 16 bits, a condicao limite para overflow seria v[i] > 6553 e, de forma similar, o ultimo digito maximo para a condicao limite seria 5, assim teriamos o valor fixo de 65535 quando as condicoes de overflow fossem encontradas.

MensagemEnviado: 10 Fev 2009 17:52
por antonio
Ok Marcelo agora esto mais claro!

Marcelo voce è professor?, voce è um proficional com alta qualidade mesmo de ensino! com voce fica claro as coisa beleza!

Levou tempo mas ahora entendi direito a sua logica de programação,bem legal!
Mais uma vez agradeço

Antonio F.

MensagemEnviado: 10 Fev 2009 18:19
por proex
Me perdoem a perguntinha tosca.

Cade a tecla ENTER pra delimitar o numero digitado?

.