Dúvida com arrays [RESOLVIDO]

Meu professor de lógica passou um exercício, para trabalharmos com vetores e matrizes.
A questão é simples, criar um vetor para guardar o nome das filiais, outro para o nome dos remédios, outro para o preço, outro para a valor de todos os remédios de cada filial, e checar qual tem mais R$, e uma matriz para guardar a quantidade que cada filial tem de cada remédio.

A parte de criação de arrays e manipulação de dados eu até que fiz, mas no final, ele pediu para que fizesse outra checagem, dessa vez pelo nome do remédio, e ver quantos desse remédio tem em todas a filiais somadas.

Estou achando que preciso fazer outro somatório na parte final, mas não estou vendo como faze-lo. Também acho que a última checagem não está certa, onde r = -1.

[code]import java.util.Scanner;

public class Farmacia {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
// declaração de variaveis e criação de arrays
int[][] q = new int[2][2];
String[] nr = new String[2];
double[] pr = new double[2];
String[] nf = new String[2];
double[] sf = new double[2];
int r = 1;
String rm;
// armazenar o nome das filiais
for (int j = 0; j < nf.length; j++) {
System.out.print("Qual o nome da "+(j+1)+“ª filial?”);
nf[j] = s.next();
}
// armazenar o nome e o preço dos remedios
for (int i = 0; i < nr.length; i++) {
System.out.print("Qual o nome do "+(i+1)+“º remédio?”);
nr[i] = s.next().toUpperCase();
System.out.print(“Qual o preço dele? R$”);
pr[i] = s.nextDouble();
// armazenar a quantidade de caixas existem em cada filial
for (int j = 0; j < q.length; j++) {
System.out.print(“Quantas caixas de “+nr[i]+” tem na filial “+nf[j]+”?”);
q[i][j] = s.nextInt();
}
}
// checar qual filial tem mais R$ no total
for (int j = 0; j < sf.length; j++) {
sf[j] = 0;
for (int i = 0; i < q.length; i++) {
sf[j] = sf[j] + q[i][j] * pr[i];
}
if (sf[j] > sf[r])
r = j;
}
System.out.println("A filial mais rica é a "+nf[r]);
//Checar quantos do tal remédio existem em todas as filiais somadas
System.out.print("Qual é o remédio? ");
rm = s.next().toUpperCase();
r = -1;
do {
System.out.println(nr[r]);
System.out.println(rm);
r++;
}while (nr[r] == rm || r == 2);
if (nr[r] == rm){
int x = 0;
for (int j = 0; j < nr.length; j++) {
x = x + q[r][j];
}
System.out.println("Quantidade de caixas de “+rm+” é "+x);
} else{
System.out.println("Não existe estoque de "+rm);
}
}
}
[/code]

Para comparar duas Strings, usa-se o método equals. O == só compara se as duas Strings estão na mesma posição de memória, e não o seu valor.

Para contar quantos remédios de terminado nome você tem, portanto, você faz assim:

[code]String nomeRemedio = “Bezetacil Indolor”;

int total = 0;
for (int i = 0; i < nr.length; i++) {
if (nr[i].equals(nomeRemedio)) {
total++;
}
}

System.out.println(“A quantidade de '” + nomeRemedio + "’ é: " + total);
[/code]

Para ignorar maiusculas e minúsculas, você também pode usar o equalsIgnoreCase. Mas acho que não será necessário, pois vc usa toUpperCase() em tudo.

PS: É uma boa deixar a preguiça de lado e dar nomes mais descritivos para suas variáveis como nomeRemedio, quantidade, etc…

Oi,

Você quer saber a quantidade de remedios ou de caixas deste remedios ?

[code] System.out.print("Qual é o remédio? ");
rm = s.next().toUpperCase();

	int cont = 0;
	for (int far = 0; far < nf.length; far++) {
		for (int rem = 0; rem < nr.length; rem++)
		{	
			if (rm.equalsIgnoreCase(nr[rem])) {
				cont++;		
			}
		}
	}
	
	System.out.println("Quantidade de remedios: "+cont);[/code]

Tchauzin!

thiago,

Nesse exercicio você é obrigado a utilizar arrays? Porque você não usa a Collections framework? Ou seja, a implementação java.util.List, mais especificamente a ArrayList. 

acho que o metodo contains() resolveria seu problema.

Abraço…

@daniellfeijo
Agora que nos vimos arrays, não vimos nada de coleções ainda, então tem que ser feito com array mesmo.

@ViniGodoy
Eu alterei um pouco o seu código para se adequar ao meu programa, mas ele não conta a quantidade de remedios, apenas a quantidade de vezes que ele achou o nome igual do remédio.
Eu preciso trabalhar com o “q” que guarda a quantidade de remédios em cada filial, certo?
Então eu teria que saber quantas filiais existem, e somar todos os “q” de cada uma, certo?

System.out.print("Qual é o remédio? "); rm = s.next().toUpperCase(); int x = 0; for (int j = 0; j < nr.length ; j++) { if (nr[j].equals(rm)) { x++; //x = x + q[r][j]; ? O q guarda a quantidade de remédios em cada filial. System.out.println("A quantidade de caixas de " + rm + " em todas as filiais é: " + x); // agora acho que expliquei direito o que eu preciso } else { System.out.println("Não existe estoque de " + rm); } }

@lina
Acho que o seu código apresenta o mesmo problema, ele não diz quantas caixas de remédios da marca “rm” existem, apenas o número de vezes que ele foi encontrado em todas a filiais.

Deixa eu ver se me explico melhor. Eu preciso saber ao final, quantas caixas de “rm” eu tenho na filial 1 + quantas caixas de “rm” eu tenho na filial 2. E caso não exista, dizer que não existe estoque do remédio “rm”. Acho que não estava explicando direito o que queria no ultimo print…

Desculpe, é que o seu programa, do jeito que está, está difícil de entender. Os nomes de variáveis são confusos, e não dá para saber o que exatamente cada uma guarda.

Mas vamos tentar refazer:

[code]//Função que acha o índice do remédio em rm
public int indiceDoRemedio(String nomeRemedio) {
for (int i = 0; i < nr.length; i++) {
if (nr[i].equals(nomeRemedio)) {
return nr[i];
}
}
return -1;
}

//Função que conta todos os remédios com um determinado nome
public int contarRemedios(String nome) {
int indice = indiceDoRemedio(nome);
//Se não encontrou aquele remédio na lista nr,
//é pq ele não está em nenhuma filial, logo sua quantidade é 0.
if (indice == -1) {
return 0;
}
int total = 0;
for (int i = 0; i < q[indice].length; i++) {
total += q[indice][i];
}
return total;
}[/code]

thiago tenta isso:

System.out.print("Qual é o remédio? ");   
        rm = s.next().toUpperCase();   
        int x = 0;   
        
        for (int i = 0; i < nr.length; i++) {
        	for (int j = 0; j < q.length; j++) {
        		if (nr[j].equals(rm)) {   
                    x += q [i][j];
                    System.out.println("A quantidade de caixas de " + rm + "  em todas as filiais é: " + x);   
        		} else {   
                    System.out.println("Não existe estoque de " + rm);   
                }
        	}   
        }

será que não é assim?

Abraço…

Daniel

thiago,

desculpe testei esse codigo acima que postei e não da certo. Tenta esse que eu acho que da certo:

System.out.print("Qual é o remédio? ");   
        rm = s.next().toUpperCase();   
        int x = 0;   
        
        for (int i = 0; i < nr.length; i++) {
        	if (nr[i].equals(rm)) {
        		for (int j = 0; j < q.length; j++) {
        		   x += q [i][j];
        		}
        	}
        }
        if(x==0){
        	System.out.println("Não existe estoque de "+rm);
        }else{
        	System.out.println("A quantidade de caixas de " + rm + "  em todas as filiais é: " + x);
        }
        

postar codigo sem testar antes é um problema… risos…

Abraço cara…

Daniel

Desculpa pelo organização do código, o prof. na sala usa uns nomes pequenos para variáveis, para evitar de escrever mais na lousa.
Refatorei para algo de melhor leitura. Espero que agora fique melhor para entender, junto com os comentários.

@daniellfeijo
Agora estou entendendo o que está errado.
Eu enchi de println para ver o que estava acontecendo. A resposta que eu quero é quando ele roda o loop pela última vez, quando ele realmente soma a quantidade de caixas de todas as filiais.

[code]
import java.util.Scanner;

public class Farmacia {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
// declaração de variaveis e criação de arrays
int[][] quantidade = new int[2][2];
String[] nomeRemedio = new String[2];
double[] precoRemedio = new double[2];
String[] nomeFilial = new String[2];
double[] filialMaiorValor = new double[2];
int rica = 1;
String remedio;
// armazenar o nome das filiais
for (int j = 0; j < nomeFilial.length; j++) {
System.out.print("Qual o nome da " + (j + 1) + “ª filial?”);
nomeFilial[j] = s.next();
}
// armazenar o nome e o preço dos remedios
for (int i = 0; i < nomeRemedio.length; i++) {
System.out.print("Qual o nome do " + (i + 1) + “º remédio?”);
nomeRemedio[i] = s.next().toUpperCase();
System.out.print(“Qual o preço dele? R$”);
precoRemedio[i] = s.nextDouble();
// armazenar a quantidade de caixas existem em cada filial
for (int j = 0; j < quantidade.length; j++) {
System.out.print("Quantas caixas de " + nomeRemedio[i]
+ " tem na filial " + nomeFilial[j] + “?”);
quantidade[i][j] = s.nextInt();
}
}
// checar qual filial tem mais R$ no total
for (int j = 0; j < filialMaiorValor.length; j++) {
filialMaiorValor[j] = 0;
for (int i = 0; i < quantidade.length; i++) {
filialMaiorValor[j] = filialMaiorValor[j] + quantidade[i][j] * precoRemedio[i];
}
if (filialMaiorValor[j] > filialMaiorValor[rica])
rica = j;
}
System.out.println("A filial mais rica é a " + nomeFilial[rica]);
// checar quantos do tal remédio existem em todas as filiais somadas
System.out.print("Qual é o remédio? ");
remedio = s.next().toUpperCase();
int x = 0;
for (int i = 0; i < nomeRemedio.length; i++) {
System.out.println(“entrei no 1st for”);
for (int j = 0; j < quantidade.length; j++) {
System.out.println(“entrei no 2nd for”);
if (nomeRemedio[j].equals(remedio)) {
System.out.println(“entrei no if”);
x += quantidade[i][j];
System.out.println("A quantidade de caixas de " + remedio+ " em todas as filiais é: " + x);
} else {
System.out.println(“entrei no else”);
System.out.println("Não existe estoque de " + remedio);
}
}
}
}
}[/code]

Quando eu rodo com esses println a mais, e digito a quantidade de caixas sendo 10, a soma deveria ser 20.
Esse é o output do console:

Qual é o remédio? dorflex
entrei no 1st for
entrei no 2nd for
entrei no else
Não existe estoque de DORFLEX
entrei no 2nd for
entrei no if
A quantidade de caixas de DORFLEX em todas as filiais é: 10
entrei no 1st for
entrei no 2nd for
entrei no else
Não existe estoque de DORFLEX
entrei no 2nd for
entrei no if
A quantidade de caixas de DORFLEX em todas as filiais é: 20

isso… olhe o último codigo que postei que está certo! Pode testar!

Abraço…

Daniel

Valeu pessoal, agora eu entendi.
Pergunta, agora ta melhor de entender meu código? Sou novo com programação ainda.
Depois vou modificar para incluir metodos, gostei da ideia do ViniGodoy. Por enquanto segue o código rodando:

import java.util.Scanner;

public class Farmacia {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		// declaração de variaveis e criação de arrays
		int[][] quantidade = new int[2][2];
		String[] nomeRemedio = new String[2];
		double[] precoRemedio = new double[2];
		String[] nomeFilial = new String[2];
		double[] filialMaiorValor = new double[2];
		int rica = 1;
		String remedio;
		// armazenar o nome das filiais
		for (int j = 0; j < nomeFilial.length; j++) {
			System.out.print("Qual o nome da " + (j + 1) + "ª filial?");
			nomeFilial[j] = s.next();
		}
		// armazenar o nome e o preço dos remedios
		for (int i = 0; i < nomeRemedio.length; i++) {
			System.out.print("Qual o nome do " + (i + 1) + "º remédio?");
			nomeRemedio[i] = s.next().toUpperCase();
			System.out.print("Qual o preço dele? R$");
			precoRemedio[i] = s.nextDouble();
			// armazenar a quantidade de caixas existem em cada filial
			for (int j = 0; j < quantidade.length; j++) {
				System.out.print("Quantas caixas de " + nomeRemedio[i]+ " tem na filial " + nomeFilial[j] + "?");
				quantidade[i][j] = s.nextInt();
			}
		}
		// checar qual filial tem mais R$ no total
		for (int j = 0; j < filialMaiorValor.length; j++) {
			filialMaiorValor[j] = 0;
			for (int i = 0; i < quantidade.length; i++) {
				filialMaiorValor[j] += quantidade[i][j] * precoRemedio[i];
			}
			if (filialMaiorValor[j] > filialMaiorValor[rica])
				rica = j;
		}
		System.out.println("A filial mais rica: " + nomeFilial[rica]);
		// checar quantos do tal remédio existem em todas as filiais
		int contador = 0;
		do {
			System.out.print("Qual é o remédio? ");
			remedio = s.next().toUpperCase();
			int x = 0;
			for (int i = 0; i < nomeRemedio.length; i++) {
				if (nomeRemedio[i].equals(remedio)) {
					for (int j = 0; j < quantidade.length; j++) {
						x += quantidade[i][j];
					}
				}
			}
			if (x == 0) {
				System.out.println("Não existe estoque de " + remedio);
			} else {
				System.out.println("A quantidade de caixas de " + remedio
						+ "  em todas as filiais é: " + x);
			}
			contador++;
		}while (contador < precoRemedio.length); 
	}
}

Oi,

Agora ficou um pouco melhor sim =)

Tchauzin!