Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

a_gomes89

Dúvida sobre arrays

Mensagens Recomendadas

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

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ;)

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por a_gomes89

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.