C + + writing student achievement management system

catalogue

1, Foreword

2, System introduction

3, Complete code

4, Summary

​​​​​​​

1, Foreword

        I am a freshman and a novice programmer who has just come into contact with code. After learning the structure part, the teacher arranged a comprehensive experimental assignment, which needs to make a simple student performance management system. This article is mainly to share with you the code of student achievement management system I have written, as well as my feelings and problems in the process of programming.  

2, System introduction

        The student achievement management system can input up to 100 students (the upper limit can be modified, which is set as 100 here). The information input of each student includes name, student number, gender, Chinese achievement, mathematics achievement, English achievement and the average score of three courses. System functions include:

(1) Enter information for all students (excluding GPA);

(2) Output information of all students (excluding average score);

(3) Output the relevant information of a student;

(4) Find the average score of any course;

(5) Ask for the average score of each student in 3 courses;

(6) Find out the students with the highest average score;

(7) Find out the students whose average score is failed;

(8) Query a student according to the given student number;

(9) Modify a student's information according to the given student number.

Corresponding functions of system functions:

(1) Build the Create function to realize the input of all student information;

(2) Build DisplayAll function to realize the output of all student information;

(3) Construct DisplayOne function to realize the output of a student's information;

(4) Build CourseAve function to realize the calculation and input of any course;

(5) Build the StudentAve function to calculate the average score of each student in 3 courses, and call the DisplayAll function or DisplayOne function to output relevant information;

(6) Build the TopScore function to find the student with the highest average score, and call the DisplayOne function to output the student's information (including name, student number, gender, three course scores and average score);

(7) Build the FailExam function to find the students whose average score is below 60, and call the DisplayOne function to output the information of the student (including name, student number, gender, three course scores and average score);

(8) Build IsExist function to query whether a student exists according to the given student number;

(9) Build a Search function to call IsExist function to judge whether a student with a given student number exists. If so, call DisplayOne function to output the information of the student (including name, student number, gender and three course scores). If not, output "no such person";

(10) Build the Modify function to call the IsExist function to judge whether a student with a given student number exists. If so, Modify the student's information (including name, student number, gender and three course scores). If not, output "no such person";

(11) Attach the Check function to Check the user input specification.

3, Complete code

#include <iostream>
#include <string.h>
#include <iomanip>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996) / / solve the problem of strcpy unsafe error reporting in Visual Studio
using namespace std;
int x = 0;
int* X = &x;   //Pointer counter
struct student
{
	char name[10];
	char number[100];
	char sex[10];
	float Chinese;
	float math;
	float English;
	float AverageScore;
};
//--------------------------------------------------------------------------------------------------------------
//Define structure array:
struct student stu[100];   //Limit 100 students
//--------------------------------------------------------------------------------------------------------------
//Judge whether the user's input is correct (characters and strings):
float Check(int a)
{
	if (a == 0)   //For characters and strings
	{
		float m;
		if (cin >> m)
		{
			return m;
		}
		else
		{
			cout << "Input error, please re-enter:";
			cin.clear();
			cin.get();
			while (!(cin >> m))
			{
				cout << "Input error, please re-enter:";
				cin.clear();
				cin.get();
			}
			return m;
		}
	}
	else if (a == 1)  //Numeric ranges for characters and strings and menus in the StudentAve function
	{
		float m;
		float c;
		if (cin >> m)
		{
			while (1)
			{
				if (m == 1 || m == 2 || m == 3)
				{
					return m;
					break;
				}
				else
				{
					cout << "Input error, please re-enter:";
					c = Check(1);
					return c;
					break;
				}
			}
		}
		else
		{
			cout << "Input error, please re-enter:";
			cin.clear();
			cin.get();
			while (!(cin >> m))
			{
				cout << "Input error, please re-enter:";
				cin.clear();
				cin.get();
			}
			while (1)
			{
				if (m == 1 || m == 2 || m == 3)
				{
					return m;
					break;
				}
				else
				{
					cout << "Input error, please re-enter:";
					c = Check(1);
					return c;
					break;
				}
			}
		}
	}
	else if (a == 2)   //Numeric ranges for characters and strings and re query and exit selection functions
	{
		float m;
		float c;
		if (cin >> m)
		{
			while (1)
			{
				if (m == 1 || m == 2)
				{
					return m;
					break;
				}
				else
				{
					cout << "Input error, please re-enter:";
					c = Check(2);
					return c;
					break;
				}
			}
		}
		else
		{
			cout << "Input error, please re-enter:";
			cin.clear();
			cin.get();
			while (!(cin >> m))
			{
				cout << "Input error, please re-enter:";
				cin.clear();
				cin.get();
			}
			while (1)
			{
				if (m == 1 || m == 2)
				{
					return m;
					break;
				}
				else
				{
					cout << "Input error, please re-enter:";
					a = Check(2);
					return a;
					break;
				}
			}
		}
	}
	else if (a == 3)   //Numeric ranges for characters and strings and re query and exit selection functions
	{
		float m;
		float c;
		if (cin >> m)
		{
			while (1)
			{
				if (m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 6 || m == 7)
				{
					return m;
					break;
				}
				else
				{
					cout << "Input error, please re-enter:";
					c = Check(3);
					return c;
					break;
				}
			}
		}
		else
		{
			cout << "Input error, please re-enter:";
			cin.clear();
			cin.get();
			while (!(cin >> m))
			{
				cout << "Input error, please re-enter:";
				cin.clear();
				cin.get();
			}
			while (1)
			{
				if (m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 6 || m == 7)
				{
					return m;
					break;
				}
				else
				{
					cout << "Input error, please re-enter:";
					a = Check(3);
					return a;
					break;
				}
			}
		}
	}
}
//--------------------------------------------------------------------------------------------------------------
//Enter student information
void Create(int p)
{
	if (x <= 100)   //Set the upper limit. This table can store the information of up to 100 students
	{
		int Y = x;
		cout << "Please enter: name(No more than 3 words),Student number (11 digits), gender, Chinese achievement, mathematics achievement and English achievement" << endl;
		for (int i = Y; i < Y + p; i++)
		{
			cin >> stu[i].name >> stu[i].number >> stu[i].sex >> stu[i].Chinese >> stu[i].math >> stu[i].English;
			if (i != Y + p - 1)
			{
				cout << "Please enter information for the next student:" << endl;
			}
			*X += 1;   //Number of people in the record sheet
		}
		cout << endl << endl;
		cout << "Added successfully!" << endl << endl;
	}
	else
	{
		cout << "dear~The number of people in the form is full. You can't add any more" << endl << endl << endl;
	}
	return;
}
//--------------------------------------------------------------------------------------------------------------
//Output all student information
int DisplayAll(int a)
{
	if (a == 0)   //Implementation of basic functions of this function
	{
		cout << endl << "Serial number\t" << "full name\t" << "Student number\t\t" << "Gender\t" << "language\t" << "mathematics\t" << "English\t" << endl;
		for (int i = 0; stu[i].Chinese != 0; i++)
		{
			cout << i + 1 << ":\t";
			cout << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << endl;
		}
		cout << endl << endl;
	}
	else if (a == 1)   //StudentAve calls the exclusive channel of the DisplayAll function
	{
		cout << endl << "Serial number\t" << "full name\t" << "Student number\t\t" << "Gender\t" << "Average score\t" << endl;
		for (int i = 0; stu[i].Chinese != 0; i++)
		{
			cout << i + 1 << ":\t";
			cout << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl;
		}
		cout << endl << endl;
	}
	return 0;
}
//--------------------------------------------------------------------------------------------------------------
//Query a student's information
int DisplayOne(int b, float* a)
{
	if (b == 0)   //Implementation of basic functions of this function
	{
		char A[1000];
		int c = 0;
		cout << "Please enter the name of the student you want to query:";
		cin >> A;
		cout << endl << endl;
		for (int i = 0; i < x; i++)
		{
			int a = strcmp(A, stu[i].name);
			if (a == 0)
			{
				cout << "Query results:" << endl;
				cout << "full name\t" << "Student number\t\t" << "Gender\t" << "language\t" << "mathematics\t" << "English\t" << endl;
				cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << endl << endl;
				return 1;
				break;
			}
			else
			{
				c++;
			}
		}
		if (c == x)
		{
			cout << "No one was found" << endl << endl;
			return 0;
		}
	}
	else if (b == 1)   //StudentAve calls the exclusive channel of the DisplayOne function
	{
		char C[1000];
		int d = 0;
		cout << "Please enter the name of the student you want to query:";
		cin >> C;
		cout << endl << endl;
		for (int i = 0; i < x; i++)
		{
			int a = strcmp(C, stu[i].name);
			if (a == 0)
			{
				cout << "full name\t" << "Student number\t\t" << "Gender\t" << "Average score\t" << endl;
				cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl;
				return 1;
				break;
			}
			else
			{
				d++;
			}
		}
		if (d == x)
		{
			cout << "No one was found" << endl << endl;
			return 0;
		}
	}
	else if (b == 2)   //TopScore calls the exclusive channel of the DisplayOne function
	{
		for (int i = 0; i < x; i++)
		{
			if (*a == stu[i].AverageScore)
			{
				cout << "full name\t" << "Student number\t\t" << "Gender\t" << "language\t" << "mathematics\t" << "English\t" << "Average score\t" << endl;
				cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl;
				cout << "Query succeeded!" << endl << endl << endl;
				break;
			}
		}
	}
	else if (b == 3)   //FailExam calls the DisplayOne function exclusive channel
	{
		cout << "full name\t" << "Student number\t\t" << "Gender\t" << "language\t" << "mathematics\t" << "English\t" << "Average score\t" << endl;
		for (int i = 0; i < x; i++)
		{
			if (*a == stu[i].AverageScore)
			{
				cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl;
				break;
			}
		}
	}
	return 0;
}
//--------------------------------------------------------------------------------------------------------------
//Calculate the average score of any course
void CourseAve()
{
	char B[100];
	cout << "Please enter the subject for which you want to query the average score:";
	cin >> B;
	int sum = 0, a = 0;
	for (int i = 0; i < x; i++)
	{
		if (strcmp(B, "language") == 0)
		{
			sum += stu[i].Chinese;
			a++;
		}
		else if (strcmp(B, "mathematics") == 0)
		{
			sum += stu[i].math;
			a++;
		}
		else if (strcmp(B, "English") == 0)
		{
			sum += stu[i].English;
			a++;
		}
		else
		{
			cout << "There is no such discipline, please re-enter" << endl;
			CourseAve();
			a = 0;
			break;
		}
	}
	if (a == x)
	{
		float ave = (float)sum / x;
		cout << "The average score in this subject is:" << ave << endl << endl << endl;
	}
}
//--------------------------------------------------------------------------------------------------------------
//Calculate the average score of each student in three courses
int StudentAve(int c)
{
	if (c == 0)   //Enter the average score and provide query function
	{
		for (int i = 0; i < x; i++)
		{
			stu[i].AverageScore = (float)(stu[i].Chinese + stu[i].math + stu[i].English) / 3;
		}
		cout << "Average score entered successfully!" << endl;
		cout << "1.View the average score of all students" << endl;
		cout << "2.View the average score of a student" << endl;
		cout << "3.Do not view" << endl;
		int a = Check(1);
		if (a == 1)   //View the average score of all students
		{
			DisplayAll(1);
		}
		else if (a == 2)   //View the average score of a student
		{
			float* a = NULL;
			while (1)
			{
				int k = DisplayOne(1, a);
				if (k == 1)
				{
					cout << "Query succeeded!" << endl << endl;
					break;
				}
				else
				{
					cout << "Query failed, do you want to query again?" << endl;
					cout << "1.yes" << endl;
					cout << "2.no" << endl;
					int j = Check(2);
					if (j == 1)
					{
						continue;
					}
					else if (j == 2)
					{
						cout << endl << endl;
						break;
					}
				}
			}
		}
	}
	else if (c == 1)   //Enter the average score directly without query function
	{
		for (int i = 0; i < x; i++)
		{
			stu[i].AverageScore = (float)(stu[i].Chinese + stu[i].math + stu[i].English) / 3;
		}
	}
	return 0;
}
//--------------------------------------------------------------------------------------------------------------
// Search for students with the highest average score
void TopScore()
{
	StudentAve(1);   //Enter the average score of each student
	//--------------------------------------------------------------------------------------------------------------
	//Find the highest average score
	float max = stu[0].AverageScore;
	for (int i = 1; i < x; i++)
	{
		if (max < stu[i].AverageScore)
		{
			max = stu[i].AverageScore;
		}
	}
	float* b = &max;   //Address transfer using pointer
	DisplayOne(2, b);
	return;
}
//--------------------------------------------------------------------------------------------------------------
//Find out the students who fail in the GPA 
void FailExam()
{
	StudentAve(1);   //Enter the average score of each student
	float fail;
	float* Fail = &fail;   //Address transfer using pointer
	int k = 0;   //Counter 
	for (int i = 0; i < x; i++)
	{
		if (stu[i].AverageScore < 60)
		{
			fail = stu[i].AverageScore;
			DisplayOne(3, Fail);
		}
		else
		{
			k++;
		}
	}
	if (k == x)   //k=x, that is, no student's score is lower than 60
	{
		cout << "All pass!!!" << endl << endl << endl;
	}
	return;
}
//--------------------------------------------------------------------------------------------------------------
// Query whether a student exists according to student number
int IsExist(char b[100])
{
	int k = 0;
	for (int i = 0; i < x; i++)
	{
		int a = strcmp(b, stu[i].number);
		if (a == 0)
		{
			return 1;   //query was successful
			break;
		}
		else
		{
			k++;
		}
	}
	if (k == x)
	{
		return 0;   //Query failed
	}
}
void Search()
{
	char b[100];
	cout << "Please enter the student number you want to query:";
	cin >> b;
	int back = IsExist(b);   //Call IsExist function to judge whether the student exists
	if (back == 1)
	{
		StudentAve(1);   //Enter the average score of each student
		for (int i = 0; i < x; i++)
		{
			int a = strcmp(b, stu[i].number);
			if (a == 0)
			{
				cout << endl << endl;
				cout << "full name\t" << "Student number\t\t" << "Gender\t" << "language\t" << "mathematics\t" << "English\t" << "Average score\t" << endl;
				cout << endl << stu[i].name << "\t" << stu[i].number << "\t" << stu[i].sex << "\t" << stu[i].Chinese << "\t" << stu[i].math << "\t" << stu[i].English << "\t" << fixed << setprecision(2) << stu[i].AverageScore << endl << endl;
				cout << "Query succeeded!!!" << endl << endl;
				break;
			}
		}
	}
	else if(back == 0)
	{
		cout << "No one was found" << endl << endl;
	}
	return;
}
//--------------------------------------------------------------------------------------------------------------
// Modify student information
void Modify()
{
	char c[100];
	cout << "Please enter the student number you want to query:";
	cin >> c;
	int back = IsExist(c);   //Call IsExist function to judge whether the student exists
	int f = 0;   //positioner
	if (back == 1)
	{
		StudentAve(1);   //Enter the average score of each student
		for (int i = 0; i < x; i++)   //Find the subscript of the student in the structure array
		{
			int a = strcmp(c, stu[i].number);
			if (a == 0)
			{
				f = i;
			}
		}
		while (1)   //Modify information
		{
			cout << endl << endl;
			StudentAve(1);   //Considering the revision of the grade, re-enter the average grade of each student here
			cout << "full name\t" << "Student number\t\t" << "Gender\t" << "language\t" << "mathematics\t" << "English\t" << "Average score\t" << endl;
			cout << endl << stu[f].name << "\t" << stu[f].number << "\t" << stu[f].sex << "\t" << stu[f].Chinese << "\t" << stu[f].math << "\t" << stu[f].English << "\t" << fixed << setprecision(2) << stu[f].AverageScore << endl << endl;
			cout << "+------------+" << endl;
			cout << "| 1.full name     |" << endl;
			cout << "| 2.Student number     |" << endl;
			cout << "| 3.Gender     |" << endl;
			cout << "| 4.grade scores of Chinese |" << endl;
			cout << "| 5.Mathematics achievement |" << endl;
			cout << "| 6.English achievement |" << endl;
			cout << "| 7.Exit modification |" << endl;
			cout << "+------------+" << endl;
			cout << "Please select what you want to modify (enter a number):";
			int b = Check(3);
			cout << endl << endl;
			if (b == 1)   //Change name
			{
				char name[10];
				cout << "Modify to (no more than three words):";
				cin >> name;
				strcpy(stu[f].name, name);
				cout << endl << endl;
				cout << "Modification succeeded!";
			}
			else if (b == 2)   //Change student number
			{
				char number[100];
				cout << "Change to (11 digits):";
				cin >> number;
				strcpy(stu[f].number, number);
				cout << endl << endl;
				cout << "Modification succeeded!";
			}
			else if (b == 3)   //Change gender
			{
				char sex[100];
				cout << "Amend to read:";
				cin >> sex;
				strcpy(stu[f].sex, sex);
				cout << endl << endl;
				cout << "Modification succeeded!";
			}
			else if (b == 4)   //Change Chinese achievement
			{
				cout << "Amend to read:";
				float Chinese = Check(0);
				stu[f].Chinese = Chinese;
				cout << endl << endl;
				cout << "Modification succeeded!";
			}
			else if (b == 5)   //Improve math scores
			{
				cout << "Amend to read:";
				float math = Check(0);
				stu[f].math = math;
				cout << endl << endl;
				cout << "Modification succeeded!";
			}
			else if (b == 6)   //Improve English scores
			{
				cout << "Amend to read:";
				float English = Check(0);
				stu[f].English = English;
				cout << endl << endl;
				cout << "Modification succeeded!";
			}
			else if (b == 7)   //Exit modification
			{
				cout << "Exit succeeded!" << endl << endl;
				break;
			}
		}
	}
	else if (back == 0)
	{
		cout << "No one was found" << endl << endl;
	}
	return;
}
//--------------------------------------------------------------------------------------------------------------
//Main part
int main()
{
	//--------------------------------------------------------------------------------------------------------------
	//Initialization interface
	system("color E1");   //Set the background color to light yellow and the font color to blue
	cout << "+------------------------+" << endl;
	cout << "|  Programmer: Perfect Match   |" << endl;
	cout << "|  Version: 3.7.4        |" << endl;
	cout << "+------------------------+" << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
	cout << "\t\t\t\t\t   Welcome to the student achievement management system!!!" << endl;
	Sleep(5000);   //Delay 5 seconds
	system("cls");   //Clear screen
	//--------------------------------------------------------------------------------------------------------------
	//Menu interface
	while (1)
	{
		//--------------------------------------------------------------------------------------------------------------
		//Menu options:
		cout << "+-----------------------------------------+" << endl;
		cout << "| 1.Enter student information                          |" << endl;
		cout << "| 2.View all student information                      |" << endl;
		cout << "| 3.Query a student's information                      |" << endl;
		cout << "| 4.View the average score of any course              |" << endl;
		cout << "| 5.Enter the average score of all students (with query function)|" << endl;
		cout << "| 6.View students with the highest GPA              |" << endl;
		cout << "| 7.View students with failed GPA              |" << endl;
		cout << "| 8.Query students for a given student number                      |" << endl;
		cout << "| 9.Modify student information for a given student number                  |" << endl;
		cout << "| 0.Exit program                              |" << endl;
		cout << "+-----------------------------------------+" << endl;
		cout << "Please enter a number for the function:";
		//--------------------------------------------------------------------------------------------------------------
		//Use the Check function to judge whether the user's input is correct (characters and strings):
		float n = Check(0);
		cout << endl << endl;
		//--------------------------------------------------------------------------------------------------------------
		//Realization of corresponding functions of buttons:
		if (n == 1)
		{
			cout << "Please enter the number of students you want to add:";
			int p = Check(0);
			Create(p);
			Sleep(3000);   //Delay 3 seconds
			system("cls");   //Clear screen
		}
		else if (n == 2)
		{
			DisplayAll(0);
			system("pause");   //Interface static
			system("cls");   //Clear screen
		}
		else if (n == 3)
		{
			float* a = NULL;
			while (1)
			{
				int k = DisplayOne(0, a);
				if (k == 1)
				{
					cout << "Query succeeded!" << endl << endl;
					break;
				}
				else
				{
					cout << "Query failed, do you want to query again?" << endl;
					cout << "1.yes" << endl;
					cout << "2.no" << endl;
					int j = Check(2);
					if (j == 1)
					{
						continue;
					}
					else if (j == 2)
					{
						cout << endl << endl;
						break;
					}
				}
			}
			system("pause");   //Interface static
			system("cls");   //Clear screen
		}
		else if (n == 4)
		{
			CourseAve();
			system("pause");   //Interface static
			system("cls");   //Clear screen
		}
		else if (n == 5)
		{
			StudentAve(0);
			system("pause");   //Interface static
			system("cls");   //Clear screen
		}
		else if (n == 6)
		{
			TopScore();
			system("pause");   //Interface static
			system("cls");   //Clear screen
		}
		else if (n == 7)
		{
			FailExam();
			system("pause");   //Interface static
			system("cls");   //Clear screen
		}
		else if (n == 8)
		{
			Search();
			system("pause");   //Interface static
			system("cls");   //Clear screen
		}
		else if (n == 9)
		{
			Modify();
			system("pause");   //Interface static
			system("cls");   //Clear screen
		}
		else if (n == 0)
		{
			cout << "Are you really quitting?" << endl;
			cout << "1.Bear to leave" << endl;
			cout << "2.Continue to use" << endl;
			float a = Check(2);
			cout << endl << endl;
			if (a == 1)
			{
				system("cls");   //Clear screen
				cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl << "\t\t\t\t\t\t   Look forward to your next use!" << endl << endl << endl;
				Sleep(3000);   //Delay 3 seconds
				break;
			}
			else if (a == 2)
			{
				system("cls");   //Clear screen
				continue;
			}
		}
		//--------------------------------------------------------------------------------------------------------------
		//Judge whether the user's input is correct (not an integer number in the menu):
		else
		{
			cout << "The number you entered is incorrect. Please re-enter it" << endl << endl << endl;
		}
		//--------------------------------------------------------------------------------------------------------------
	}
	return 0;
}

Note: the program code is written by visual studio 2019.

4, Summary

        For me, a novice in C + +, writing this program is actually very difficult. It involves the mutual calls between multiple functions. In the process of writing, I also encounter some problems, such as defining integer or floating-point quantity input characters, which will report errors and cause the program to crash; How to realize multiple functions of a function; In VS, strcmp insecurity, error reporting, etc... later, I also explored slowly and broke the problem one by one. After realizing the basic functions, I beautify the program to make it more object-oriented. In general, it is quite satisfactory to write a large program alone for the first time.

        The program in the above source code is version 3.7.4. I define the version information as follows: the initial version is 1.0.0, and the first number represents a major update, such as adding a new function, implementing a new function, program beautification... The first number is + 1 every time a major update is implemented; The second number represents a small update, such as adding or deleting comments and some codes, adjusting code order... The second number is + 1 every time a small update is implemented; The third number represents the number of debug s. Every time a Bug is successfully modified, the third number is + 1. At present, the program is still being updated, not the final version. If you find any problems with the code or any improvement opinions and opinions, you are welcome to point out them in the comment area. For the first time, if there are any mistakes in the above contents, you are also welcome to point out them in the comment area.

Keywords: C++

Added by akabugeyes on Mon, 06 Dec 2021 00:20:08 +0200