Javaspørsmål.

Her kan du stille spørsmål vedrørende problemer og oppgaver i matematikk på høyskolenivå. Alle som har kunnskapen er velkommen med et svar. Men, ikke forvent at admin i matematikk.net er spesielt aktive her.

Moderatorer: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Svar
Markussen
Galois
Galois
Innlegg: 585
Registrert: 13/11-2012 14:42

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å.
hallapaadeg
Ramanujan
Ramanujan
Innlegg: 297
Registrert: 24/04-2014 14:33
Sted: Cyberspace

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 :( )
Markussen
Galois
Galois
Innlegg: 585
Registrert: 13/11-2012 14:42

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.
hallapaadeg
Ramanujan
Ramanujan
Innlegg: 297
Registrert: 24/04-2014 14:33
Sted: Cyberspace

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
Markussen
Galois
Galois
Innlegg: 585
Registrert: 13/11-2012 14:42

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?
hallapaadeg
Ramanujan
Ramanujan
Innlegg: 297
Registrert: 24/04-2014 14:33
Sted: Cyberspace

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å.
Markussen
Galois
Galois
Innlegg: 585
Registrert: 13/11-2012 14:42

Hvordan burde jeg har skrevet den istedenfor?
hallapaadeg
Ramanujan
Ramanujan
Innlegg: 297
Registrert: 24/04-2014 14:33
Sted: Cyberspace

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.
Markussen
Galois
Galois
Innlegg: 585
Registrert: 13/11-2012 14:42

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?
hallapaadeg
Ramanujan
Ramanujan
Innlegg: 297
Registrert: 24/04-2014 14:33
Sted: Cyberspace

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.
Markussen
Galois
Galois
Innlegg: 585
Registrert: 13/11-2012 14:42

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....
hallapaadeg
Ramanujan
Ramanujan
Innlegg: 297
Registrert: 24/04-2014 14:33
Sted: Cyberspace

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);

Markussen
Galois
Galois
Innlegg: 585
Registrert: 13/11-2012 14:42

Der funka det! Tusen takk for hjelpen :)
Svar