Skrev tenta i grundläggande Java, kritik någon?
Tjenare, imorse skrev jag en tenta i grundläggande Java på distans. Programmeringsuppgiften var följande och man fick 6h på att skicka in en lösning.
Du ska skriva ett program som hjälper till med att träna multiplikationstabellen,
1:ans tabell till och med 12:ans tabell.
Tanken är att man ska kunna välja en multiplikationstabell att öva på.
Programmet slumpar fram ett tal (t.ex. 7x9) och användaren skriver in svaret och
får även veta om man svarat rätt eller fel.
Användaren ska fortsätta besvara tal tills man svarat rätt på alla tal i
multiplikationstabellen exakt 3 gånger. Alltså måste programmet kunna hålla reda
på hur många gånger ett visst tal besvarats korrekt. Har ett tal besvarats rätt tre
gånger ska detta tal inte kunna slumpas fram igen under pågående övning.
När man är klar med en multiplikationstabell så ska man få statistik på hur många
gånger man svarat fel på ett visst tal.
Tänkt scenario:
1. Användaren väljer 7:ans multiplikationstabell
2. Programmet slumpar fram 4x7
3. Användaren svarar rätt vilket innebär att 4x7 ska slumpas fram två gånger
till innan användaren är klar med tabellen
4. Programmet slumpar fram 9x7
5. Användaren svarar fel vilket innebär att 9x7 ska slumpas fram tre gånger
till innan användaren är klar med tabellen
6. När användaren svarat rätt tre gånger vardera på talen 1x7, 2x7, 3x7, 4x7,
5x7, 6x7, 7x7, 8x7, 9x7, 10x7, 11x7 och 12x7 eller om användaren
matar in en nolla (0) så är användaren klar med tabellen och kan välja att
öva på en ny tabell eller att avsluta programmet.
Använd metoder för att lösa uppgiften, i övrigt ska följande regler respekteras:
- Beskriv i klassbeskrivningen hur du tolkat uppgiften och eventuella
förenklingar/förändringar du gör i uppgiften.
- Metodbeskrivningar och kommentarer vid kluriga delar i koden är
mycket viktigt. Tänk också på att ha beskrivande namngivning på klasser,
metoder och variabler.
- Tentamen är individuell och även om du får ta hjälp av Internet för att
hämta idéer till möjliga lösningar så är det du som ska lösa uppgiften på
egen hand. Ange alltid källa om du hittar något på Internet som du
använder dig av.
- Inga globala variabler (variabler utanför metoderna) ska användas om
detta inte är väl motiverat och korrekt utfört (motiverar gör du i
kommentarer)
Så här blev min lösning
import java.util.Random;
import javax.swing.*;
public class Multiplikationstabell {
// Av ******* (*****@student.gu.se)
// Hur många gånger man får svara på samma fråga. Jag deklarerar konstanten
// här så är den lätt att hitta
static final int numberOfQuerys = 3;
public static void main(String[] args) {
// Jag brukar alltid samla alla meddelanden till användaren på ett
// ställe så man lätt kan hitta dem
String menuQuestion = "Vilken tabell vill du träna på?", menuHeader = "Multiplikationstabell", queryQuestion = "Hur mycket är ", badFormat = "Felaktigt format", messageQuestionsLeft = " frågor kvar att svara rätt på.", statisticHeader = "Statistik över dina svar", messageRight = "Rätt!", messageWrong = "Fel!", statisticTableHeader = "Fråga \t Antal felsvar";
// Lagrar vilken tabell man valt att träna på
int tableToTrainOn;
// statisticArray[] är en tabell över hur många gånger man besvarat en
// fråga fel
int[] statisticArray;
while (true) {
// Låter användaren välja tabell
tableToTrainOn = askWhichTable(menuQuestion, menuHeader);
// Låter användaren göra provet och sparar felstatistiken i en array
statisticArray = Query(tableToTrainOn, queryQuestion,
messageQuestionsLeft, badFormat, messageRight, messageWrong);
// Visar felstatistiken
showStatistics(statisticArray, statisticHeader,
statisticTableHeader, tableToTrainOn);
}
}
private static int[] Query(int tableToTrainOn, String question,
String header, String badAnswer, String messageRight,
String messageWrong) {
// answerStatistics är en tabell över hur många gånger man besvarat
// en fråga fel
int[] answerStatistics = new int[11];
Random r = new Random();
/*
* Jag antar att multiplikationstabellen går upp till 10*talet , även om
* man i det här fallet kunde tänka sig att det går upp till 12*12. När
* alreadyAnsweredCorrectly[int]=numberOfQuerys har man klarat tabellen
* för int.
*/
int[] alreadyAnsweredCorrectly = new int[11];
int answer;// Användarinmatning
int factor;
// Totalt måste man svara rätt numberOfQuerys*10 gånger innan metoden
// avbryts
int correctAnswersLeftBeforeExit = numberOfQuerys * 10;
// Denna sträng läggs till nästa fråga beroende på om man svarat rätt
// eller fel
String showRightOrWrong = "";
while (correctAnswersLeftBeforeExit > 1) {
while (true) {
factor = r.nextInt(10) + 1;
if (alreadyAnsweredCorrectly[factor] < numberOfQuerys) {
break;
}
}
// Ställer en viss fråga till användaren med en viss rubrik och
// lagrar svaret i en variabel
answer = getAnswer(showRightOrWrong + question + " " + factor
+ " * " + tableToTrainOn + "?",
correctAnswersLeftBeforeExit + header, badAnswer);
if (answer == factor * tableToTrainOn) {
// Användaren svarade rätt
alreadyAnsweredCorrectly[factor]++;
correctAnswersLeftBeforeExit--;
// Nästa fråga ska börja med "Rätt!"
showRightOrWrong = messageRight + "\n";
} else {
// Användaren svarade fel
answerStatistics[factor]++;
// Nästa fråga ska börja med "Fel!"
showRightOrWrong = messageWrong + "\n";
}
}
return answerStatistics;
}
private static int askWhichTable(String question, String header) {
// Denna metod frågar vilken tabell man vill träna på
// Skapar en meny med värden 1 till 12
Object[] menuTable = new Object[12];
for (int x = 1; x < 13; x++) {
menuTable[x - 1] = x;
}
Object s = JOptionPane.showInputDialog(null, question, header,
JOptionPane.QUESTION_MESSAGE, null, menuTable, null);
if (s == null) {
// Avslutar preogrammet om man klickar på Avbryt
finish();
}
return (Integer) s;
}
private static void finish() {
// Metod för att avsluta programmet
System.exit(0);
}
private static void showStatistics(int[] statisticArray, String header,
String tableHeader, int tableToTrainOn) {
// Visar statistik
String output = tableHeader;
for (int x = 1; x < 11; x++) {
/*
* Nedan försökte jag använda \t, men det fungerade inte hos mig
* (Eclipse Indigo, Java 1.7, Lucid Lynx). JOptionPane skrev inte ut
* det korrekt
*/
output = output + "\n" + x + " * " + tableToTrainOn
+ " " + statisticArray[x];
}
JOptionPane.showMessageDialog(null, output, header,
JOptionPane.INFORMATION_MESSAGE);
}
public static int getAnswer(String question, String header, String badFormat) {
// Denna metod är samma som jag använde för att fråga efter klockslag i
// inläningsuppgift 2, jag ändrade på den lite för att passa bättre i
// detta sammanhang
int i;
while (true) { // Loopar tills tal matats in i rätt format.
try {
// Försöker läsa in ett svar
String input = JOptionPane.showInputDialog(null, question,
header, JOptionPane.QUESTION_MESSAGE);
// Avslutar om användaren klickar på avbryt
if (input == null)
finish();
i = Integer.parseInt(input);
// Hoppar ur loopen när ett tal i rätt format matats in.
break;
}
catch (Throwable badInput) {
// Ett värde i felaktigt format har matats in
JOptionPane.showMessageDialog(null, badFormat);
}
}
return i;
}
}
Tyckte att det gick bra med tanke på att jag alltid haft svårt att hantera tidspress. Men jag är som sagt nybörjare på Java, så jag undrar vad ni som är erfarna programmerare har för kritik? Har programmerat en del i BASIC tidigare och har svårt för det här med objektorinetering, dock ingår det inte i den här kursen.