0Pricing
Java Academy · Lekcja

Projekt 2D: dziennik ocen

Miniprojekt: zbudują Państwo niewielki dziennik ocen z użyciem macierzy int 2D. Wyświetlą wyrównane tabele, obliczą średnie dla uczniów i zadań, znajdą najlepsze wyniki, skorygują oceny oraz wygenerują raport podsumowujący.

Projekt 2D: dziennik ocen to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 4 z 6. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 6 lekcji w sumie.

Przegląd projektu

Cel projektu: Przedstaw dziennik ocen jako dwuwymiarową macierz int, w której każdy wiersz reprezentuje ucznia, a każda kolumna — zadanie domowe, kartkówkę lub egzamin. Należy wypisać wyrównaną tabelę, obliczyć średnie dla poszczególnych uczniów i zadań, znaleźć najlepszego ucznia i najlepsze zadanie, skorygować wyniki oraz wygenerować raport podsumowujący.

Należy przejść przez kolejne sceny i uruchomić każdy przykład kodu w podanej kolejności. Dane wejściowe nie są wymagane.

Tworzenie i wypisywanie

Krok 1: Utwórz małą macierz dziennika ocen i wypisz ją z wyrównanymi kolumnami. Używamy metody pomocniczej do obliczania szerokości kolumn oraz metody wypisującej, która dopełnia każdą wartość.

public class Main {
				  // Join helper for one-dimensional arrays (space-separated)
				  static String join(int[] a) {
					String s = "";
					for (int i = 0; i < a.length; i = i + 1) {
					  s = s + a[i] + (i + 1 < a.length ? " " : "");
					}
					return s;
				  }

				  // Compute column widths for aligned printing (jagged-aware)
				  static int[] widths(int[][] m) {
					int maxCols = 0;
					for (int r = 0; r < m.length; r = r + 1) {
					  if (m[r].length > maxCols) maxCols = m[r].length;
					}
					int[] w = new int[maxCols];
					for (int r = 0; r < m.length; r = r + 1) {
					  for (int c = 0; c < m[r].length; c = c + 1) {
						int len = Integer.toString(m[r][c]).length();
						if (len > w[c]) w[c] = len;
					  }
					}
					for (int c = 0; c < w.length; c = c + 1) if (w[c] < 1) w[c] = 1;
					return w;
				  }

				  // Print matrix with aligned columns
				  static void printAligned(int[][] m) {
					int[] w = widths(m);
					for (int r = 0; r < m.length; r = r + 1) {
					  String line = "";
					  for (int c = 0; c < m[r].length; c = c + 1) {
						String s = Integer.toString(m[r][c]);
						while (s.length() < w[c]) s = " " + s;
						line = line + s + (c + 1 < m[r].length ? " " : "");
					  }
					  System.out.println(line);
					}
				  }

				  public static void main(String[] args) {
					// Create a 4x5 gradebook (4 students, 5 assignments)
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					System.out.println("Gradebook (rows: students, cols: assignments):");
					printAligned(g);
				  }
				}
				

Średnie wierszy i kolumn

Krok 2: Oblicz średnie dla poszczególnych uczniów (wierszy) i zadań (kolumn). Obliczanie średnich kolumn musi sprawdzać długość każdego wiersza, aby obsługiwać tablice nieregularne.

public class Main {
				  // Average of one row (student r)
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  // Average of one column (assignment c)
				  static double colAverage(int[][] g, int c) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) {
					  if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; }
					}
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					// Compute per-student averages
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  System.out.println("student " + r + " avg = " + String.format("%.2f", avg));
					}

					// Compute per-assignment averages
					int assignments = g[0].length;
					for (int c = 0; c < assignments; c = c + 1) {
					  double avg = colAverage(g, c);
					  System.out.println("assignment " + c + " avg = " + String.format("%.2f", avg));
					}
				  }
				}
				

Najlepszy uczeń i zadanie

Krok 3: Znajdź najlepszego ucznia (o najwyższej średniej wiersza) i najlepsze zadanie (o najwyższej średniej kolumny).

public class Main {
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  static double colAverage(int[][] g, int c) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) { if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; } }
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					// Find top student by average
					int bestStudent = -1;
					double bestAvg = -1.0;
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  if (avg > bestAvg) { bestAvg = avg; bestStudent = r; }
					}

					// Find top assignment by average
					int assignments = g[0].length;
					int bestAssign = -1;
					double bestCol = -1.0;
					for (int c = 0; c < assignments; c = c + 1) {
					  double avg = colAverage(g, c);
					  if (avg > bestCol) { bestCol = avg; bestAssign = c; }
					}

					System.out.println("top student = " + bestStudent + " (avg=" + String.format("%.2f", bestAvg) + ")");
					System.out.println("top assignment = " + bestAssign + " (avg=" + String.format("%.2f", bestCol) + ")");
				  }
				}
				

Korygowanie wyników

Krok 4: Zastosuj stałą korektę (np. +5 punktów do każdego wyniku, z ograniczeniem do 100) i wypisz macierze przed korektą i po niej.

public class Main {
				  // Add a flat curve of k points (capped at 100)
				  static void curve(int[][] g, int k) {
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) {
						int v = g[r][c] + k;
						if (v > 100) v = 100;
						g[r][c] = v;
					  }
					}
				  }

				  static void print(int[][] g) {
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) {
						System.out.print(g[r][c] + (c + 1 < g[r].length ? " " : ""));
					  }
					  System.out.println();
					}
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					System.out.println("before curve:");
					print(g);
					curve(g, 5); // +5 points each
					System.out.println("after curve (+5, capped at 100):");
					print(g);
				  }
				}
				

Raport podsumowujący

Krok 5: Wygeneruj prosty raport: średnie dla poszczególnych uczniów i ogólną średnią klasy. (Później można rozszerzyć go o oceny literowe).

public class Main {
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  static double overallAverage(int[][] g) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) { sum = sum + g[r][c]; count = count + 1; }
					}
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {83, 90, 95, 93, 97},  // assume already curved values
					  {100, 96, 94, 98, 92},
					  {65, 77, 75, 73, 80},
					  {93, 89, 84, 90, 95}
					};

					// Print each student average
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  System.out.println("student " + r + " avg = " + String.format("%.2f", avg));
					}

					// Print overall average
					System.out.println("overall avg = " + String.format("%.2f", overallAverage(g)));
				  }
				}
				

Sprawdzenie średniej ucznia

Szybkie sprawdzenie: Który wzór oblicza średnią ucznia r?

Podsumowanie i następny krok

Podsumowanie: Zamodelowano dziennik ocen za pomocą tablicy 2D, wyświetlono wyrównane tabele, obliczono średnie wierszy i kolumn, znaleziono najlepszych uczniów, przeskalowano wyniki i utworzono raport podsumowujący. Następnie należy opakować te narzędzia w wielokrotnego użytku klasę pomocniczą.

Często zadawane pytania

Czy lekcja „Projekt 2D: dziennik ocen” jest bezpłatna?

Tak — pełny tekst „Projekt 2D: dziennik ocen” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 6 lekcji w sumie.

Co nauczysz się w „Projekt 2D: dziennik ocen”?

Miniprojekt: zbudują Państwo niewielki dziennik ocen z użyciem macierzy int 2D. Wyświetlą wyrównane tabele, obliczą średnie dla uczniów i zadań, znajdą najlepsze wyniki, skorygują oceny oraz wygeneru… Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 6.

Ile czasu zajmuje lekcja „Projekt 2D: dziennik ocen”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy tablic 2D i zagnieżdżona iteracja
  2. Tablice postrzępione i formatowanie tabel
  3. Maksima wierszy i kolumn, transpozycja i formatowanie
  4. Projekt 2D: dziennik ocen
  5. Narzędzia 2D jako klasa pomocnicza (refaktoryzacja)
  6. Czyszczenie i walidacja danych 2D
← Powrót do Java Academy