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.
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.