Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

a_gomes89

Dúvida sobre arrays

Recommended Posts

a_gomes89

boa noite,

Sou estudante e preciso de ajuda na resolução de um problema.

Sei que a versão 6 para a versão 10 e um pouco diferente mas penso que neste caso não há problema.

Portanto o enunciado do problema é:

Elabore um programa que declara um array de inteiro com 100 posições.

O programa deve ter um botão “Preenche” que permite preencher o array de 100 posições com o valor da sua posição acrescida de uma unidade (na posição 0 é inserido o 1).

Deve existir um segundo botão, SOMA, que, quando selecionado, soma nas primeiras 50 posições do array o valor das últimas 50. Ou seja, guarda na posição 0 o resultado da soma do valor que está na posição 0 com o da posição 50, , na 1 guarda o resultado da soma do valor que está na posição 1 com o valor da 51, etc.

Deve existir um terceiro botão, MIRROR, que, quando selecionado, copia as primeiras 50 posições do array para as últimas 50 posições, invertendo a ordem dos valores na segunda metade do array. Ou seja, o valor da primeira posição é copiado para a última, da segunda para a penúltima, etc.

A solução que comecei por fazer foi:

Public Class Form1

   Private Sub ClearList()
       ListBox1.Items.Clear()
   End Sub

   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       ClearList()
       Dim i(99) As Integer
       Dim total As Integer
       i(0) = "1"

       For total = 0 To 99
           ListBox1.Items.Add(i(total))
       Next
   End Sub
End Class

mas o resultado desta solução são 99 valores todos em 0 excepto a primeira posição que esta em 1.

Alguém me poderá ajudar a solucionar este exercício?

Obrigado

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

Então como queres que o programa adivinhe os restantes 99 valores? Dás-lhe o primeiro, e depois mandas imprimir os seus valores numa ListBox: o programa não funciona com bolas de cristal.

Tens de preencher a Array toda com um ciclo For. E mais, recomendo que revejas bem a tua atribuição de uma String a uma variável do tipo Integer:

Dim i(99) As Integer  ' Um array de Integer
i(0) = "1"            ' Atribuis uma String - como é isto?

Sei que a versão 6 para a versão 10 e um pouco diferente mas penso que neste caso não há problema.

Tenho uma dúvida sobre como cozinhar uma feijoada, pelo que vou colocar a questão na secção de saladas.

Se a dúvida é em VB.NET, então falamos na secção de VB.NET ;)

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
a_gomes89

obrigado pela a ajuda, realmente foi um gralha muito grande onde meti o tópico.

ok então como faço o ciclo?

obrigado pelo conselho vou então rever a atribuição do tipo de variável.

cumprimentos

Share this post


Link to post
Share on other sites
thoga31

ok então como faço o ciclo?

Pensa lá um pouco. Tens um Array de 100 elementos, em que cada um tem atribuído a si o valor do seu próprio índice.

Ou seja, array(i) = i

obrigado pelo conselho vou então rever a atribuição do tipo de variável.

A atribuição da variável, não é do tipo da variável.

A revisão é muito simples: se tens um Array de Integer, atribuis um Integer.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
a_gomes89

boa tarde novamente consegui chegar a conclusão da primeira e segunda parte do problema, a solução é esta:

Public Class Form1
   Dim array(99) As Integer
       Dim arraysoma(49) As Integer
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       array(0) = 1
       For i = 0 To 99
           array(0 + i) = array(0) + 1 * i
           ListBox1.Items.Add(array(i))
       Next
   End Sub
   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       arraysoma(0) = array(0) + array(50)
       For i = 0 To 49
           arraysoma(0 + i) = array(0 + i) + array(50 + i)
           MsgBox("resultado" & arraysoma(0 + i))
       Next
       Close()
   End Sub
End Class

agr preciso de ajuda para o terceiro ponto do exercicio que e a para o botão mirror, podem me ajudar?

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

Tens códigos que podem ser optimizados e/ou são despropositados.

array(0 + i) = array(0) + 1 * i

arraysoma(0 + i) = array(0 + i) + array(50 + i)

Porquê array(0) + 1*i? Não basta i?

Porquê 1*i? Não basta i?

Porquê 0+i? Não basta i?

Para o mirror tens de fazer um processo de troca com a ajuda de uma variável auxiliar.

Como trocas 2 valores de uma array entre si? Por exemplo, colocar o valor da posição 13 na posição 45, e vice-versa?

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
a_gomes89

hum... obrigado realmente tinha código a mais.

entao com a variavel auxiliar por exemplo:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim primeiro As Integer       
primeiro = CInt(InputBox("insira valor inteiro", "valores inteiros"))
       Dim i As Integer
       For i = 1 To 50

           array(50) = primeiro

           array(50 - i) = primeiro + i
           MsgBox("o resultado e " & array(50 - i))

       Next
   End Sub

é isto?

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

Isso é que é uma troca de valores entre dois índices de uma Array?

INÍCIO:
Array(13) = 236
Array(45) = 754

FINAL:
Array(13) = 754
Array(45) = 236

Como implementas uma troca destas?


Knowledge is free!

Share this post


Link to post
Share on other sites
a_gomes89

Acho que não, o que o código que eu pus faz é o seguinte: o programa pede ao utilizador que insira um valor inteiro e este valor é somado a posição i que o seu resultante(valor + i) entra na posição do array - i.

nunca estive tão perdida como agora, não sei como implemento a troca, percebi a lógica mas não sei como implementa-la.

se já tenho dificuldades a preencher as posições, quanto mais fazer trocas entre elas.

Share this post


Link to post
Share on other sites
thoga31

Acho que não, o que o código que eu pus faz é o seguinte: o programa pede ao utilizador que insira um valor inteiro e este valor é somado a posição i que o seu resultante(valor + i) entra na posição do array - i.

Isto não é o pedido no enunciado.

nunca estive tão perdida como agora, não sei como implemento a troca, percebi a lógica mas não sei como implementa-la.

se já tenho dificuldades a preencher as posições, quanto mais fazer trocas entre elas.

"Preencher" as posições é como "preencher" uma outra variável qualquer. A única diferença é que tens uma lista de variáveis, digamos assim.

Uma Array de 100 elementos contém dentro de si o equivalente a 100 variáveis "isoladas". O acesso a cada elemento é feito através do índice.

Se lista for uma Array de Integers com 100 elementos, então lista(13) é o 14º elemento da Array (não esquecer que o 1º elemento é dado pelo índice 0).

Antes de passarmos à troca de valores em Arrays, resolve-me primeiro este pequenino exercício:

Considera as variáveis A e B, do tipo Integer, às quais estão atribuídos valores arbitrários. Troque os valores entre as variáveis. Código inicial:

Dim A As Integer = 25
Dim B As Integer = 56

' Código para trocar os valores...?

' No final, A = 56 e B = 25.


Knowledge is free!

Share this post


Link to post
Share on other sites
a_gomes89

eu devo estar a complicar muito mas aqui vai:

Public Class Form1
   Dim a As Integer
   Dim b As Integer
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       a = 25
       b = 56

   End Sub
   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       If CheckBox1.Checked = True Then
           b = a
           MsgBox("" & b)
       ElseIf CheckBox1.Checked = False Then
           b = 56
           MsgBox("" & b)
       ElseIf CheckBox2.Checked = True Then
           a = b
           MsgBox("" & a)
       ElseIf CheckBox2.Checked = False Then
           a = 25
           MsgBox("" & a)
       End If
   End Sub
End Class

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

CheckBoxes? Para quê? No final não tenho os valores trocados... não tenho nada daquilo que pedi.

E essa dependência do GUI tem de desaparecer, uma coisa é o algoritmo, outra é o GUI. Treina antes em Console Applications. Aquilo que eu pedi pode muito bem ser escrito de forma independente do GUI.

Vê se o seguinte código faz aquilo que eu pedi: trocar os valores entre as variáveis.

' Valores iniciais
Dim A As Integer = 25
Dim B As Integer = 56

' Troca das variáveis
A = B
B = A

' Os valores estão trocados??


Knowledge is free!

Share this post


Link to post
Share on other sites
a_gomes89

como tinha mal modifiquei

Public Class Form1
Dim a As Integer = 25
Dim b As Integer = 52
Dim baba As Integer

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    baba = a
    a = b
    b = baba
    MsgBox("" & a & b)
End Sub
End Class

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

Exactamente! Agora pega nesse código e transforma-o para que troque os valores de dois elementos de uma Array.

    MsgBox("" & a & b)

Para que serve o "" &?


Knowledge is free!

Share this post


Link to post
Share on other sites
a_gomes89
Public Class Form1
   Dim a As Integer = 25
   Dim b As Integer = 52
   Dim baba() As Integer

   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    baba(0) = a
    baba(a) = b
    baba(b) = baba(0)
   End Sub
End Class

Edited by a_gomes89

Share this post


Link to post
Share on other sites
a_gomes89

como nao sei se esta bem pensei melhor e pus assim:

Public Class Form1
   Dim a As Integer = 25
   Dim b As Integer = 52
   Dim array() As Integer
   Dim baba As Integer
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Dim i As Integer
    array(baba) = a
    array(a) = b
    array(b) = array(baba)
    For i = 0 To 24
	    array(a) = b
    Next
    For i = 0 To 51
	    array(b) = baba
    Next

   End Sub

Share this post


Link to post
Share on other sites
Dominick

Parece-me que estás a afastar-te do pedido no enunciado.

Pelo que percebi do enunciado, o pretendido é que a 2ª metade do array seja igual á 1ª metade invertida (por isso é que o botão pedido chama-se "MIRROR", que significa espelho).

Exemplo:

Um array com os valores 1-2-3-4-5-6-7-8 passa a ser 1-2-3-4-4-3-2-1.

Daí o efeito espelho, a 2ª metade é igual á 1ª mas invertida.

Basta então fazer um ciclo para correr a primeira metade e copiar os valores para a segunda.

Algo do genero:

For i = 0 to 49
     Array(99-i)=Array(i)
Next i

Bom trabalho, e espero ter ajudado!

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

@Dominick, não sei se leste o tópico todo, mas tendo o facto de @a_gomes89 ter dificuldades em Arrays, tenho vindo a tentar dar uns conhecimentos genéricos sobre o assunto antes de chegar a esse ponto ;)

@a_gomes89, no teu código para a troca de valores em Arrays baralhaste os índices com os valores de cada elemento. Tem em atenção o seguinte: Array(índice) = valor.

Por isso, a troca de valores entre variáveis é dada por:

aux = Lista(0)
Lista(indice1) = Lista(indice2)
Lista(indice2) = aux

Posto isto, a questão que se coloca é: para o mirror é preciso fazer trocas? Não. Então mas porque debati este assunto? Porque é importante distinguir o mirror da troca de valores.

No mirror tu queres algo como isto:

1  <-- índice 0
2
3
4
5    <-- ponto de
5    <-- simetria
4
3
2
1  <-- índice final (neste caso, 8)

Ou seja, sendo comp o "comprimento" da Array:

Array(comp) = Array(0)
Array(comp - 1) = Array(1)
Array(comp - 2) = Array(2)

'generalizando ...

Array(comp - i) = Array(i)

Como traduzir isto num ciclo? É tornar a variável i no iterador do ciclo For. O @Dominick já deu aí uma excelente dica (aka a resposta ao problema).


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.