Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 10.10.2023
Сообщений: 118

Не сортирует фамилии которые начинаются с буквы А и которые сдали на 8 или 9

07.05.2024, 19:35. Показов 882. Ответов 5

Студворк — интернет-сервис помощи студентам
Почему то не хочет сортировать фамилии,оценки а также средний бал, и если можно то как сделать красивый вывод на экран
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <vcl.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <io.h>
 
 
using namespace std;
 
FILE *Fz, *Ft;
struct TZap{
char FIO[30];
char birthd[15];
int num_gr;
int mas[4];
double s_b;
} Zap;
void Out(TZap z)
{
printf("\n %1s , \t%10s, \t%x, \t%x, \t%x,\t %x,\t %x,\t %x", z.FIO,z.birthd,z.num_gr,z.mas[0],z.mas[1],z.mas[2],z.mas[3],z.s_b);
fprintf(Ft,"\n %1s ,\t %10s, \t%x, \t%x,\t %x, \t%x,\t %x,\t %x", z.FIO,z.birthd,z.num_gr,z.mas[0],z.mas[1],z.mas[2],z.mas[3],z.s_b);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
int size = sizeof(TZap);
char File_Zap[] = "zapisi.txt";
char File_Rez[] = "rezult.txt";
void Out(TZap);
 
int kod, D_f, i=0, j, kol;
long len;
double *srb,srr;
TZap st, *mas_Z;
Ft = fopen(File_Rez, "w");
while(true) {
puts("\n Создать – 1\n Добавить – 2\n Посмотреть – 3\n Сортировка студентов – 4\n Выход – 0");
scanf("%d", &kod);
switch(kod) {
case 1:
if ((Fz=fopen(File_Zap,"w"))==NULL) {
puts("\n Create ERROR!");
 
}
fclose(Fz);
printf("\n Create New File %s !\n",File_Zap);
break;
case 2:
Fz = fopen(File_Zap,"a");
printf("\n Ф.И.О – ");
fflush(stdin);
gets(Zap.FIO);
printf(" Год рождения – ");
fflush(stdin);
gets(Zap.birthd);
printf(" Группа – ");
scanf("%x" , &Zap.num_gr);
printf(" Физика – ");
fflush(stdin);
scanf("%x", &Zap.mas[0]);
printf(" Математика – ");
fflush(stdin);
scanf("%x", &Zap.mas[1]);
printf(" Информатика – ");
fflush(stdin);
scanf("%x", &Zap.mas[2]);
printf(" Химия – ");
fflush(stdin);
scanf("%x", &Zap.mas[3]);
//srr=(double(Zap.mas[0]+Zap.mas[1]+Zap.mas[2]+Zap.mas[3])/double(4));
printf(" Sr ball – ");
fflush(stdin);
scanf("%x", &Zap.s_b);
 
fwrite(&Zap, size, 1, Fz);
fclose(Fz);
break;
case 3:
if ((Fz=fopen(File_Zap,"r"))==NULL) {
puts("\n Open ERROR!");
 
}
// Вывод на экран
printf("\n\-------Ф.И.О------Год рождения--------Группа--Физика--Математика--Информатика--Химия--Средний бал");
// Запись такой же информации в текстовый файл Ft
fprintf(Ft,"\n\------Ф.И.О------Год рождения--------Группа--Физика--Математика--Информатика--Химия--Средний бал");
while(1) {
if(!fread(&Zap,size,1,Fz)) break;
Out(Zap);
}
fclose(Fz);
break;
case 4:
Fz = fopen(File_Zap,"r");
D_f = fileno(Fz);
char fl[1];
len = filelength(D_f);
kol = len/size;
mas_Z = new TZap[kol];
// --------
for (i=0; i < kol; i++)
fread((mas_Z+i), size, 1, Fz);
fclose(Fz);
printf(" Введите первую букву фамилии – ");
fflush(stdin);
gets(fl);
for (i=0; i<kol; i++)
{if (mas_Z[i].FIO[0]==fl[0] && ((mas_Z[i].mas[0]+mas_Z[i].mas[1]+mas_Z[i].mas[2]+mas_Z[i].mas[3])/4)==5)Out(mas_Z[i]);}
delete []mas_Z;
break;
case 0:
fclose(Ft);
return 0;
break;
}
}
 
return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2024, 19:35
Ответы с готовыми решениями:

Найти количество человек, которые не сдали экзамен, и которые сдали его на 4 и 5
Известны результаты экзаменов 20 человек. Нужно найти количество человек, которые не сдали, и которые сдали на 4 и 5. Оценки можно ставить...

Используя данные из этого файла, напечатать фамилии тех студентов, которые начинаются с гласной буквы
Используя данные из этого файла, напечатать фамилии тех студентов, которые начинаются с гласной буквы.

Вывести фамилии сотрудников, номера телефонов, которые начинаются с цифр 361,362 или 273
Сведения состоят из фамилий сотрудников и их телефонов. Вывести фамилии сотрудников, номера телефонов, которые начинаются с цифр 361,362...

5
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,092
07.05.2024, 19:45
Nikita_Soprano, давненько я не видел такой жести

и как в этой каше найти сортировку ?

Наверное, просто перепиши на C++, и всё заработает
1
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
08.05.2024, 05:18
В целом да, было бы неплохо С++ использовать, а то от него тут всего 4 строки, но конкретно по этому коду...
Цитата Сообщение от Nikita_Soprano Посмотреть сообщение
Почему то не хочет сортировать фамилии,оценки а также средний бал
Потому что у вас нет сортировки, case 4, вопреки своему описанию Сортировка студентов – 4, просто выводит всех студентов со средним баллом по 4 введённым предметам равным 5 и с фамилией начинающейся на введённую пользователем букву в порядке записи в файл. Ну а какую сортировку вы хотите я не очень понимаю из вашего описания.
Цитата Сообщение от Nikita_Soprano Посмотреть сообщение
как сделать красивый вывод на экран
ФИО - до 29 символов, дата (подписана как год???) рождения - до 14 (почему не 10???) символов, заголовки последующих полей - 49 символов, отступы между заголовками - от 7 символов, итого минимум 99 символов на строку если выводить в виде таблицы.
Стандартный размер консоли Windows - 80х25, поэтому желательно или сократить заголовки, или растянуть консоль.
Вот пример требующий ширину консоли в 99 символов:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void Out(TZap z) {
    printf(
            "%-29s|%14s|%6d|%6d|%10d|%11d|%5d|%11f\n",
        z.FIO, z.birthday, z.num_gr, z.mas[0], z.mas[1], z.mas[2], z.mas[3], z.s_b
    );
    fprintf(
        Ft, "%-29s|%14s|%6d|%6d|%10d|%11d|%5d|%11f\n",
        z.FIO, z.birthday, z.num_gr, z.mas[0], z.mas[1], z.mas[2], z.mas[3], z.s_b
    );
}
// ...
printf(     "Ф.И.О.                       | Дата рождения|Группа|Физика|Математика|Информатика|Химия|Средний бал\n");
fprintf(Ft, "Ф.И.О.                       | Дата рождения|Группа|Физика|Математика|Информатика|Химия|Средний бал\n");
Также из того что заметил:
  1. При вводе/выводе чисел вы используете %x, это спецификатор unsigned в шестнадцатиричной системе. Для int в десятичной нужен %d, для double - %lf в scanf и %f в printf (%lf в printf также поддерживается начиная с С99/С++11).
  2. Вы открываете Fz в текстовом режиме, из-за чего при записи каждый байт равный 10 (аля '\n') на Windows будет сохраняться как "\r\n", ломая ваш kol = len/size;. Поэтому fopen(Fz, /*...*/) должен содержать "ab"/"wb"/"rb".
  3. gets - крайне небезопасно, а также не существует с С11/С++14. Вариант работающий в С/С++ любой версии:
    C
    1
    2
    3
    4
    5
    
    fgets(Zap.FIO, sizeof(Zap.FIO), stdin);
    len = strlen(Zap.FIO);
    if (Zap.FIO[len - 1] == '\n') {
        Zap.FIO[len - 1] = '\0';
    }
  4. gets/fgets дописывает ноль-символ в конец буфера, так что fl должен быть размером минимум 2 символа.
  5. void Out(TZap); - зачем это объявление внутри main'а?
  6. printf("\n\- - что за \-?
  7. while (1) { if (!fread(&Zap,size,1,Fz)) break; Out(Zap); } вполне заменяется на while(fread(&Zap,size,1,Fz)) { Out(Zap); }.
  8. fileno, filelength и io.h платформо-зависмые. Портативным вариантом будет:
    C
    1
    2
    3
    
    fseek(Fz, 0, SEEK_END);
    len = ftell(Fz);
    fseek(Fz, 0, SEEK_SET);
  9. Ну и наконец int _tmain(int argc, _TCHAR* argv[]) существует только в Windows, и учитывая, что больше вы нигде не используете _TCHAR/wchar_t, я бы заменил это на простой int main().
1
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,405
Записей в блоге: 3
08.05.2024, 06:06
Цитата Сообщение от Nikita_Soprano Посмотреть сообщение
#include <vcl.h>
ну, дык, еще и в Билдере это делать такими методами Почему обязательно надо скрещивать ужа и ежа?

Добавлено через 38 секунд
Цитата Сообщение от Алексей1153 Посмотреть сообщение
просто перепиши на C++, и всё заработает
Именно
0
0 / 0 / 0
Регистрация: 10.10.2023
Сообщений: 118
11.05.2024, 00:33  [ТС]
Актуально или нет но я посидел подумал и теперь выводит средний бал, но с сортировкой туго она зараза не хочет сортировать фамилии которые начинаются с буквы А, вот код сортировка спрятана в case 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//---------------------------------------------------------------------------
#include <vcl.h>
 
 
#include <math.h>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <io.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
 
using namespace std;
 
FILE *Fz, *Ft;
struct TZap{
char FIO[30];
char birthday[15];
int mat;
int num_gr;
int mas[4];
double s_b;
} Zap;
void Out(TZap z)
{
 printf(
            "%-29s|%14s|%6d|%6d|%10d|%11d|%5d|%11f\n",
        z.FIO, z.birthday, z.num_gr, z.mas[0], z.mas[1], z.mas[2], z.mas[3], z.s_b
    );
    fprintf(
        Ft, "%-29s|%14s|%6d|%6d|%10d|%11d|%5d|%11f\n",
        z.FIO, z.birthday, z.num_gr, z.mas[0], z.mas[1], z.mas[2], z.mas[3], z.s_b
    );
}
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleOutputCP(1251); 
    SetConsoleCP(1251);
 
int size = sizeof(TZap);
char File_Zap[] = "zapisi.txt";
char File_Rez[] = "rezult.txt";
void Out(TZap);
 
int kod, D_f, i=0, j, kol;
long len;
double *srb,srr;
TZap st, *mas_Z;
Ft = fopen(File_Rez, "w");
while(true) {
puts("\n Ñîçäàòü – 1\n Äîáàâèòü – 2\n Ïîñìîòðåòü – 3\n Ñîðòèðîâêà ñòóäåíòîâ – 4\n Âûõîä – 0");
scanf("%d", &kod);
switch(kod) {
case 1:
if ((Fz=fopen(File_Zap,"w"))==NULL) {
puts("\n Create ERROR!");
 
}
fclose(Fz);
printf("\n Create New File %s !\n",File_Zap);
break;
case 2:
Fz = fopen(File_Zap,"ab");
printf("\n Ф.И.О – ");
fflush(stdin);
gets(Zap.FIO);
printf(" Год рождения – ");
fflush(stdin);
gets(Zap.birthday);
printf(" Группа – ");
scanf("%x" , &Zap.num_gr);
printf(" Физика – ");
fflush(stdin);
scanf("%x", &Zap.mas[0]);
printf(" Математика – ");
fflush(stdin);
scanf("%x", &Zap.mas[1]);
printf(" Информатика – ");
fflush(stdin);
scanf("%x", &Zap.mas[2]);
printf(" Химия – ");
fflush(stdin);
scanf("%x", &Zap.mas[3]);
//srr=(double(Zap.mas[0]+Zap.mas[1]+Zap.mas[2]+Zap.mas[3])/double(4));
 
Zap.s_b = (Zap.mas[0] + Zap.mas[1] + Zap.mas[2] + Zap.mas[3])/4;
 
fwrite(&Zap, size, 1, Fz);
fclose(Fz);
break;
case 3:
if ((Fz=fopen(File_Zap,"r"))==NULL) {
puts("\n Open ERROR!");
 
}
// Âûâîä íà ýêðàí
// ...
printf(     "Ô.È.Î.                       | Äàòà ðîæäåíèÿ|Ãðóïïà|Ôèçèêà|Ìàòåìàòèêà|Èíôîðìàòèêà|Õèìèÿ|Ñðåäíèé áàë\n");
fprintf(Ft, "Ô.È.Î.                       | Äàòà ðîæäåíèÿ|Ãðóïïà|Ôèçèêà|Ìàòåìàòèêà|Èíôîðìàòèêà|Õèìèÿ|Ñðåäíèé áàë\n");
while(fread(&Zap,size,1,Fz)) { Out(Zap); }
fclose(Fz);
break;
case 4:
Fz = fopen(File_Zap,"rb");
D_f = fileno(Fz);
char fl[1];
len = filelength(D_f);
kol = len/size;
mas_Z = new TZap[kol];
 
 
// Ñ÷èòûâàåì çàïèñè èç ôàéëà â äèíàìè÷åñêèé ìàññèâ
for (i=0; i < kol; i++)
fread((mas_Z+i), size, 1, Fz);
fclose(Fz);
 
 for (i=0; i<kol; i++)
// {if (mas_Z[i].FIO[0]==fl[0] && ((mas_Z[i].mas[0]+mas_Z[i].mas[1]+mas_Z[i].mas[2]+mas_Z[i].mas[3])/4)==5)Out(mas_Z[i]);}
if ((mas_Z[i].FIO[0]=='A') && ((mas_Z[i].mat==8)||(mas_Z[i].mat==9))){
 Out(mas_Z[i]);}
delete []mas_Z;
break;
 
case 0:
fclose(Ft);
return 0;
}
}
 
 
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
11.05.2024, 00:57
Цитата Сообщение от Nikita_Soprano Посмотреть сообщение
но я посидел подумал
Это неважно. Пока не исправлены грубейшие ошибки, перечисленные в посте #3, говорить не о чем.

В дополнение к ним:

1. Функции gets не существует. Ее необходимо убрать из кода.
2. fflush(stdin); - функция fflush неприменима к stdin.

Отдельное недоумение вызывает вот такой код

Цитата Сообщение от Nikita_Soprano Посмотреть сообщение
C++
1
2
for (i=0; i < kol; i++)
fread((mas_Z+i), size, 1, Fz);
Какой смысл вызывать fread в цикле для последователных элементов массива, если можно было вызывать fread один раз сразу для всего массива?

Цитата Сообщение от Nikita_Soprano Посмотреть сообщение
вот код сортировка спрятана в case 4
Я в упор не увидел никакой сортировки "в case 4". Видать она очень хорошо спрятана.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2024, 00:57
Помогаю со студенческими работами здесь

Вывести в консоль фамилии, которые начинаются с буквы "С" из документа Student.txt
C# вывести в консоль фамилии, которые начинаются с буквы &quot;С&quot; из документа Student.txt написать только прог-му....

Напечатать фамилии студентов, которые сдали математику на «95», и определить их количество
Напечатать фамилии студентов, которые сдали математику на «95», и определить их количество. Фамилия Группа Год рождения оценка...

Найти и вывести фамилии тех студентов, которые все экзамены сдали на 9
Даны оценки группы студентов на экзаменах по 4 предметам: алгебре, геометрии, философии, информатике. Найти и вывести фамилии тех...

Найти и вывести фамилии тех студентов, которые все экзамены сдали на 9
Даны оценки группы студентов на экзаменах по 4 предметам: алгебре, геометрии, философии, информатике. Найти и вывести фамилии тех...

Вывести слова из строки, которые имеют длину больше 5 и начинаются с буквы 'А' или 'а'
Привет! Помогите решить задачу со строками по программированию!! 1.ВВЕСТИ строку. На печать выдать слова, которые имеют длину больше 5 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru