Я викачав цей код з архівом точно не пам'ятаю де, напевно в цій темі або не в цій і тримаю його в нотепаде. Розглядаю іноді котрй день.
Тут принаймні коментарі не крокозябрами.
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>
struct student{
int number;
char name[15];
char surname[15];
};
struct student group = { { 0 } }; //Тут описується змінна group типу цієї структури, і їй усі її поля забиваються нулями (іниціалізація).
struct marks{
int number;
int marks[5];
};
int main()
{ int i=0;
char login1[]="skyfer",true_password[6]="1927s",login2[32],passw[6];
setlocale(LC_ALL,"Rus");
printf ("Введiть логiн: ");
scanf ("%31s", login2); //- ввод строки, ограниченной 31 символом.
printf("Введiть пароль: ");
passw[i]=getch();//Зверніть увагу getch () повертає один символ, прочитаний з клавіатури,
// не чекаючи введення <Enter>. При натисненні <Enter> (як на основній, так і на додаткової клавіатурі) видає 1 символ '\r' десятковий 13 (hex 0x0d). Клавіша "Забій" і стрілки теж не працюють, як завжди, Ви отримуєте їх коди.
printf("*");
while(passw[i]!=13)
{
i++;
passw[i]=getch();
printf("*");
}
passw[5]=0; //Круто
if (strcmp(login1,login2) != 0)
{
printf ("\nНе правильно введено логiн чи пароль\n");
return 0;
}
// Функція повертає декілька значень, які вказують на відношення рядків :
//Нульове значення говорить про те, що обидва рядки рівні.
//Значення більше нуля вказує на те, що рядок string1 більше рядка string2, значення менше нуля свідчить про зворотне.
//Функція strcmp починає порівнювати по одному символу і як тільки будуть знайдені перші неоднакові символи, функція проаналізує числові коди цих символів. Чий код виявиться більше, той рядок і вважатиметься більшим.
if (strcmp(true_password,passw) != 0)
{
printf ("\nНе правильно введено логiн чи пароль\n");
return 0;
}
else
{
printf("\nВхiд в систему...\n");
system("cls");
menu();
}
return 0;
}
int menu(){
int choice;
printf("1.Групи\n");
printf("2.Оцiнки\n");
printf("4.Статистика\n");
printf("0.Вихiд з програми\n");
scanf ("%d", &choice);
if(choice==1){
groups();
}
if (choice==2){
marks();
}
if (choice==3){
statistic();
}
if (choice==0){
exit (1);
}
}
/* Ввод двух чисел, вычисление суммы и печать результата
#include <stdio.h>
{
int a,b,c;
scanf(" %d %d",&a,&b);
c=a+b;
printf("Cумма = %d \n",c)
}
*/
int groups(){
int choice;
system("cls");
printf ("1.Додати нову групу\n");
printf ("2.Редагувати групу\n");
printf ("3.Видалити групу\n");
printf ("4.Переглянути список груп\n");
printf ("5.Повернутися в головне меню\n");
printf ("0.Вихiд з програми\n");
scanf ("%d", &choice);
if (choice==1){
system("cls");
add_group();
}
if (choice==2){
system("cls");
edit_group();
}
if (choice==3){
system("cls");
delete_group();
}
if (choice==4){
system("cls");
print_list_groups();
}
if (choice==5){
system("cls");
menu();
}
if (choice==0){
exit (1);
}
}
//Она очищает экран консоли, для того и нужна. Например, cout<<"Я пишу в консоли! "//на консоли красуется эта дурацкай надпись system("cls");//надписи больше нет
int add_group()
{
int numbers=0,i;
char name_groups[6], dat[5]=".dat", name_group[10];
struct student group={0,"",""};
FILE *fPtrG;
FILE *fPtrN;
printf ("Введiть назву групи: ");
scanf ("%s",name_groups);
fflush(stdin); //Если поток stream связан с файлом, открытым для записи, то при обращении к функции fflush() в этот файл будет физически записано содержимое выходного буфера. При этом файл остается открытым.
if ((fPtrG=fopen("groups.dat", "ab")) == NULL)//<идентификатор файла> = fopen(<имя файла>,<режим работы>);
printf ("File could not be opened.\n"); // "ab" Дописывает в двоичный файл
else // stdin сбрасывается буфер стандартного потока вывода
{
fwrite (&name_groups,sizeof(name_groups),1,fPtrG); //fwrite(&d, sizeof(double), 1, fp);
}
fclose (fPtrG);
strncpy(name_group,name_groups,6); //копиюем з name_groups до name_group
strcat (name_group,dat); // конкатенация рядків- додаємо dat до name_group
printf ("Введiть кiлькiсть студентiв в групi: ");
scanf("%d", &numbers); //- ввод строки не ограниченной 31 символом.
if(numbers>0)
{
struct student group[numbers];// Що це таке? Що це взагалі таке? group[i].number це зрозуміло а це що таке?
if ((fPtrN=fopen(name_group, "ab")) == NULL) // "ab" Дописывает в двоичный файл
printf ("File could not be opened.\n");
}
else
{
for (i=1;i<=numbers;i++)
{
group[i].number=i;
printf ("Прiзвище та Iмя студентaа №%d: \n", i);
fscanf (stdin,"%s%s",group[i].name,group[i].surname); //читает fscanf(fp, "%s%f", str, &f);
fseek( fPtrN ,sizeof(struct student) , SEEK_SET ); //Функция fseek перемещает указатель позиции в потоке. Устанавливает внутренний указатель положения в файле, в новую позицию, которая определяются путем добавления смещения к исходному положению.
//изменить позицию на student байт относительно начала файла
fwrite(&group[i], sizeof(struct student),1,fPtrN);
//size_t fwrite(const void *буфер, size_t колич_байт, size_t счетчик, FILE *уф);
}
}
fclose (fPtrN);
}
groups();
//}
/*Функция fflush
#include <stdio.h>
int fflush(FILE *stream);
Если поток stream связан с файлом, открытым для записи, то при обращении к функции fflush() в этот файл будет физически записано содержимое выходного буфера. При этом файл остается открытым.
Нулевое значение, возвращаемое функцией, свидетельствует о ее успешном выполнении, а значение EOF — о возникновении ошибки при записи.
При нормальном завершении программы или при заполнении буферов все их coдержимое автоматически дозаписывается в файл. Кроме того, буфер дозаписывается в файл при закрытии файла.
Пример
Приведенный фрагмент программы дозаписывает в файл содержимое буфера после каждой операции записи.
Предполагается, что fp связан с выходным файлом.
for(i=0; i<MAX; i++) {
fwrite(buf, sizeof(some_type), 1, fp);
fflush(fp);
}
Зависимые функции
fclose() fopen() fread() fwrite() getc() putc() */
int edit_group(struct student *group)
{
int choice=0;
FILE *fPtrN;
char name_group[10],dat[5]=".dat";
print_list_groups();
printf ("\nОберiть необхiдну групу: \n");
scanf ("%s",name_group);
strcat (name_group,dat); // // конкатенация рядків- додаємо dat до name_group
if((fPtrN=fopen(name_group, "rb+")) == NULL){
printf ("File could not be opened.\n");
}
else{
printf("%-2s%-15s%-15s", "Number", "Name", "Surname"); // Я ничого не зрозумів
}
fclose (fPtrN);
printf ("1.Змiнити iм'я студента\n");
printf ("2.Змiнити прiзвище студента\n");
printf ("3.Повернутися в меню групи\n");
printf("0.Вихiд з програми\n");
scanf ("%d", &choice);
if (choice==3)
{
system("cls");
groups();
}
if (choice==0){
exit (1);
}
}
int delete_group()
{
int choice=0;
char name_group[10],dat[5]=".dat";
printf ("Введiть назву групи, яку бажаєте видалити: ");
scanf ("%s",name_group);
strcat (name_group,dat);
if(remove(name_group)) {
printf("Error delete group!");
return 0;
}
else{
printf("Successfully delete group!\n");
}
printf("\n1.Видалити ще одну групу\n2.Повернутися в меню групи\n");
scanf ("%d", &choice);
if (choice==1){
system("cls");
delete_group();
}
if (choice==2){
system("cls");
groups();
}
}
int print_list_groups(){
int choice;
{
FILE * ptrFile = fopen( "groups.dat" , "rb" );
if (ptrFile == NULL)
{
fputs("Ошибка файла", stderr); // fputs запиати у файл stderr рядок "Ошибка файла" тобто помилка
exit(1);
}
fseek(ptrFile , 0 , SEEK_END);
long lSize = ftell(ptrFile);
while(!feof(ptrFile))
{
char * buffer = (char*) malloc(sizeof(char) * lSize);
if (buffer == NULL)
{
fputs("Ошибка памяти", stderr);
exit(2);
}
size_t result = fread(buffer, 1, lSize, ptrFile);
if (result != lSize)
{
fputs("Ошибка чтения", stderr);
exit (3);
}
puts(buffer);
free (buffer);
}
fclose (ptrFile);
}
printf("\n1.Переглянути конкретну групу\n2.Повернутися до меню груп\n3.Повернутися до головного меню\n");
scanf ("%d", &choice);
if (choice==1)
{
specific_group();//функція за алгоритмом впринципі аналогічна до list_group, но так як і list_group не робоча)
}
if (choice==2)
{
system("cls");
groups();
}
if (choice==3)
{
system("cls");
menu();
}
}
int specific_group(struct student *group){
int choice=0;
printf("\n1.Повернутися до меню груп\n2.Повернутися до головного меню\n");
scanf("%s", &choice);
if (choice==1){
system("cls");
groups();
}
if (choice==2){
system("cls");
menu();
}
}
int marks()
{
int choice=0;
system("cls");
printf ("1.Внести оцiнки\n");
printf ("2.Редагувати оцiнки\n");
printf ("4.Повернутися в головне меню\n");
printf("0.Вихiд з програми\n");
scanf ("%d", &choice);
if (choice==4)
{
system("cls");
menu();
}
if (choice==0)
{
exit (1);
}
}
int statistic()
{
int choice;
system("cls");
printf ("1.Абсолютний i якiсний показники\n");
printf ("2.Рейтинг студентiв\n");
printf ("3.Рейтинг груп\n");
printf ("4.Повернутися в головне меню\n");
printf("0.Вихiд з програми\n");
scanf ("%d", &choice);
if (choice==4)
{
system("cls");
menu();
}
if (choice==0)
{
exit (1);
}
}
165. struct student group[numbers];// Що це таке? Що це взагалі таке? groupi.number це зрозуміло а це що таке?
Ах ти ж .. задерла!