Side 1 av 1

Javaspørsmål.

Lagt inn: 05/11-2014 22:00
av Markussen
Hei. Jeg har et lite problem med å skjønne noen programmeringsoppgaver, og jeg håper noen av dere kan hjelpe meg.


Oppgave:

Du skal lage et program som regner ut hovedkarakteren ut fra en rekke karakterer (A-E, F regnes ikke). Hovedkarakteren regnes ut som gjennomsnittet av alle karakterene. Dersom gjennomsnittet havner mellom to karakterer, f.eks. B og C, vil karakteren regnes opp og karakteren vil da være B.

Jeg vil helst bruke en while-løkke slik at brukeren kan legge inn så mange karakteren den vil, men jeg ser at det ikke er like lett som å lage en for-løkke.

Det jeg har tenk da er; Lage en for-løkke som regner 5 karakterer.

Kode: Velg alt

import static javax.swing.JOptionPane.*;
class Main{
        public static void main(String[] args){
                String karakterLest = showInputDialog("Karakter");
                char karakter = karakterLest.charAt(0);
 
                if(karakter >= 60 && karakter <= 65){ // Hvis karakteren er mellom A og E gjør det under.
                        String res = "";
                        for(char i = 0; i <= 5; i++){
                               
                        }
                }
        }
}
Dette er hva jeg har foreløpig, så jeg håper noen kan hjelpe meg litt. Jeg skjønner forøvrig ikke helt det med karakterLest.charAt(0), gjerne forklar dette også.

Re: Javaspørsmål.

Lagt inn: 05/11-2014 22:31
av hallapaadeg
Det blir et kort svar fra meg, da jeg har litt dårlig tid :D Men det er jo gøy å se at det dukker opp litt Java her.

En string kan sees på som en array av characters. Når du bruker showInputDialog metoden slik du gjør her, kan jo brukeren skrive inn en hvilken som helst String.

Hvis brukeren da skriver AB, vil charAt(0) sørge for at du får A'en fra Stringen AB, og ikke B'en. Indexene i en array starter jo å telle fra 0, som du bør kjenne til.

det betyr at, hadde du skrevet charAt(1) derimot, ville du fått B'en..

Så at du gjør det slik du gjør her, sørger for at du alltid får den første bokstaven i String-inputen!

Et alternativ til å predefinere antall karakterer brukeren kan taste inn, kan du prompte etter dette tallet istedet, i starten av programmet!

Kode: Velg alt

int antallKarakterer = Integer.parseInt(JOPtionPane.showInputDialog("Hvor mange karakterer ønsker du å skrive inn?"));
(Kan hende jeg har litt feil i syntaks, altfor lenge siden jeg har programmert :( )

Re: Javaspørsmål.

Lagt inn: 06/11-2014 08:57
av Markussen
Takk for svar! Jeg sliter med å få det til å legges sammen.

Det jeg har nå er;

Kode: Velg alt

import static javax.swing.JOptionPane.*;
class Main{
	public static void main(String[] args){
		
		String aK = showInputDialog("Skriv antall karakterer du ønsker: ");
		int antallKarakterer = Integer.parseInt(aK);

		String karakterLest = showInputDialog("Karakter");
		char karakter = karakterLest.charAt(0);

		if(karakter >= 60 && karakter <= 65){
			String res = "";
			for(char i = 0; i <= antallKarakterer; i++){
				res += "Karakteren er nå: " + karakter/antallKarakterer;
			} 
		} else {
			System.out.println("Bokstaven er ikke gyldig som karakter");
		}
	}
} 
Og jeg vil jo at brukeren skal kunne skrive inn flere karakterer enn kun én.

Re: Javaspørsmål.

Lagt inn: 06/11-2014 22:07
av hallapaadeg
Du kan sette opp en slags "hoved"- loop her. En for loop, med en do/while loop inni, der du f.eks sjekker en statisk boolean metode om tallverdien til bokstaven er godkjent, slik at programmet ikke fortsetter før bokstaven er nettopp godkjent, og dermed lagrer en karakter av gangen, i f.eks en char array. da slipper man også en stygg if setning midt i det hele.

Et ekstra tips er at her antar du at brukeren taster inn store bokstaver ABCDEF. Det finnes en metode i Character klassen ved navn "toUpperCase" som kan være kjekk, slik at brukeren kan taste inn små bokstaver også abcdef.

Jeg kan gi deg et forslag til løsning, men det blir jo også litt feil. Det er enklere enn å forklare hvertfall, da jeg ikke vet hva slags kunnskap du har :X

Re: Javaspørsmål.

Lagt inn: 07/11-2014 15:38
av Markussen
Det som er tingen er at jeg ikke skal bruke array. Da vi "ikke" har lært det enda. Eller vi har lært det, men jeg løser gamle oppgaver, og da skal jeg kunne gjøre det uten arrays.

Men hvordan synes du selve koden ser ut? Er det en grei start?

Re: Javaspørsmål.

Lagt inn: 07/11-2014 17:27
av hallapaadeg
Jeg skjønner. Da antar jeg det det er en del andre verktøy som ikke er "lov" også.

Den if-setningen er ikke helt bra. Du hadde den rette idèen med loops, fortsett med den tanken. Selvfølgelig helt greit å bruke if setninger, men den er ikke pen, og du har ikke løst problemet ennå.

Re: Javaspørsmål.

Lagt inn: 07/11-2014 18:06
av Markussen
Hvordan burde jeg har skrevet den istedenfor?

Re: Javaspørsmål.

Lagt inn: 07/11-2014 19:20
av hallapaadeg
Se bort fra if-setningen for nå, og gå litt tilbake til starten av programmet, slik at du får løst hovedproblemet først.

Etter at brukeren taster inn hvor mange karakterer den vil skrive inn, kan det første, neste steget videre være at du nettopp lar brukeren skrive inn disse karakterne.

Hvis du vil at brukeren skal skrive inn èn karakter av gangen, kan det være lurt å sette opp en loop som spør x antall ganger.

Så må du pønske ut hvordan du kan lagre disse karakterene.

Et hint kan være å sette opp noen variabler som lagrer og behandler karakterne som brukeren taster inn, kanskje printe ut en sum til slutt, da har du et program som compiler og du har noe å bygge videre på.

Når du først har løst dette, kan du begynne å tenke på en elegant måte å ekskludere uønskede bokstaver.

Re: Javaspørsmål.

Lagt inn: 07/11-2014 23:48
av Markussen

Kode: Velg alt

import static javax.swing.JOptionPane.*;
class Main{
	public static void main(String[] args){
		
		String aK = showInputDialog("Skriv antall karakterer du ønsker: ");
		int antallKarakterer = Integer.parseInt(aK);

		String karakterLest = showInputDialog("Karakter");
		char karakter = karakterLest.charAt(0); //LESER BOKSTAVEN PÅ PLASS 0, ALTSÅ BOKSTAVEN BRUKEREN SKRIVER INN.

			for(char i = 0; i <= antallKarakterer; i++){
				String res = "";

				if(karakter <= 70 && karakter >= 65){ //HVIS BOKSTAVEN ER MELLOM A-E.
					karakter++; //PLUSSER HVER KARAKTER SAMMEN
					res = "Gjennomsnittskarakteren er:  " + sum/antallKarakterer;
				}else {
					System.out.println("Bokstaven er ikke gyldig som karakter"); //HVIS KARAKTEREN ER UTENFOR INTERVALLET, GI BESKJED.
			} 
		}
	}
} 
Nå har jeg skrevet kommentar til kodebiten også. Men jeg får fortsatt ikke til å lagre karakterene. Er det feil å bruke karakter++? Vil jeg da kun øke karakteren?

Re: Javaspørsmål.

Lagt inn: 08/11-2014 08:24
av hallapaadeg
Det er et par problemer:

Du spør brukeren om å skrive inn karakterene kun èn gang her. loopen utfører egentlig ingenting.

Hvis du vil lagre karakterene i stringen Res, må du se på hva du egentlig gjør med den her. Se på denne kodebiten her, og se om du kan gjette hva som blir printet ut til slutt

Kode: Velg alt

 
		String test = "hei";
		for(int i=0; i<=10; i++) {
			test = "";
			test +=i;
		}
		System.out.println(test);
Så er det slik at variabler som blir deklarert inne i en loop, kun er synlig inne i loopen. Hvis du vil at variablene skal være tilgjengelig gjennom hele programmet i dette tilfellet her, må de deklareres på toppen. Dette sier jeg fordi du antakeligvis har lyst til å kunne behandle et resultat på slutten, da må variabelen(e) som lagrer informasjonen være tilgjengelig!

Ta èn ting av gangen. Forstå hvordan du kan lagre summen av alle char's før du ekskluderer noe (dvs. at if-setningen fortsatt er mindre pen)

Fokuser først og fremst på det med å lagre en sum karakterer, enten i en string, eller som en tallverdi, eller ennå bedre, begge deler, og print alt ut til slutt, hver for seg. Jeg kan heller vise deg en løsning på problemet med uønskede bokstaver når du har fikset det.

Re: Javaspørsmål.

Lagt inn: 08/11-2014 13:08
av Markussen

Kode: Velg alt

import static javax.swing.JOptionPane.*;
class Main{
	public static void main(String[] args){
		
		String aK = showInputDialog("Antall karakterer: ");
		int antallKarakterer = Integer.parseInt(aK);

		int sum = 0;

		for(int i = 0; i < antallKarakterer; i++){
			
			String karakterLest = showInputDialog("Karakter");
			char karakter = karakterLest.toUpperCase().charAt(0);

			sum += karakter/antallKarakterer;

		}

		if(sum == 65){
			System.out.println("Karakteren er: A");
		} 
		else if(sum == 66){
			System.out.println("Karakteren er: B");
		}
		else if(sum == 67){
			System.out.println("Karakteren er: C");
		}
		else if(sum == 68){
			System.out.println("Karakteren er: D");
		}
		else if(sum == 69){
			System.out.println("Karakteren er: E");
		}
		else{
			System.out.println("Ikke gyldig karakter");
		}	
	}
} 
Har endret for-løkka slik at brukeren får lest inn riktig antall karakterer. Problemet nå er at gjennomsnittet ikke stemmer....

Re: Javaspørsmål.

Lagt inn: 08/11-2014 14:26
av hallapaadeg
Hmm, tror det har noe med at du tar sum/antallKarakterer hver gang

prøv noe sånt

Kode: Velg alt

for {
   blablabla
   sum+= karakter;
}

sum = sum / antallKarakterer;

print(sum);


Re: Javaspørsmål.

Lagt inn: 08/11-2014 15:02
av Markussen
Der funka det! Tusen takk for hjelpen :)