Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 253
Завершенные тесты: 3
#1

Ошибка при быстрой сортировке файла: "string subscript out of range"

02.06.2016, 09:43. Просмотров 430. Ответов 8
Метки нет (Все метки)

В файле input.txt содержатся сведения о группе студентов в формате:
номер группы;
запись о каждом студенте группы содержит следующие сведения: фамилия, имя,
отчество, год рождения, оценки по пяти предметам.

в алфавитном порядке по фамилии методом «быстрой»;

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
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <algorithm>
using namespace std;
 
ifstream in("Input.txt");
ofstream out("Output.txt");
 
 
struct Student
{
    string name, secondname, fam;
    int year;
    int mark[5];
    int key;
    void print();
};
 
void Student::print()
{
    out << setw(12) << left << fam << setw(10) << name << setw(15) << secondname << setw(5) << year;;
 
    for (int i = 0; i < 5; i++)
    {
        out << setw(3) << mark[i];
    }
    out << setw(5) << key << endl;
}
 
void sort(Student *a, int n)
{
    Student temp;
    //до этого делал задачки,ну на подсчёт суммы оценок и т.п. ,а чёт сортировать по буквам -__-
}
int main()
{
    int n = 0, m, i;
    Student stud[10];
 
    if (!in)
        cout << "Error,file Input.txt doesn't open";
 
    else
    {
        in >> m;
        while (in.peek() != EOF)
        {
            in >> stud[n].fam;
            in >> stud[n].name;
            in >> stud[n].secondname;
            in >> stud[n].year;
            stud[n].key = 0;
            for (int i = 0; i < 5; i++)
            {
                in >> stud[n].mark[i];
            }
            n++;
        }
        sort(stud, n);
        out << m << endl;
        for (int i = n - 1; i >= 0; i--)
            stud[i].print();
    }
    in.close();
    out.close();
    return 0;
}
Добавлено через 3 минуты
Опечатка вышла,не "пузырьком",а "быстрой"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2016, 09:43
Ответы с готовыми решениями:

Ошибка "String subscript out of range"
#include &lt;SFML/Graphics.hpp&gt; using namespace sf; int ground = 400; int i; ...

Не могу найти ошибку "String subscript out of range"
// Hamilton3.cpp: определяет точку входа для консольного приложения. // ...

Как исправить ошибку "string subscript out of range"?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstring&gt;...

Ошибка исполнения "vector subscript out of range / debug assertion failed"
Добрый день.. Помогите исправить ошибку.. Вот код: #include &lt;iostream&gt;...

Ошибка string subscript out of range
Здраствуйте создал библиотеку, при подключение библиотеки и запуска программи...

8
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
02.06.2016, 11:06 #2
Алгоритмы сортировок
0
Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 253
Завершенные тесты: 3
02.06.2016, 11:15  [ТС] #3
там классические примеры,а как сортировать по буквам?
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
02.06.2016, 13:37 #4
Нет никакой разницы что сортировать. Надо по фамилии - сравнивай фамилии.
0
Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 253
Завершенные тесты: 3
04.06.2016, 00:01  [ТС] #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
#include <fstream>
#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>
 
using namespace std;
 
ifstream in("Input.txt");
ofstream out("Output.txt");
 
struct student 
{
    string fam, name, secondname;
    int year, mark[5];
    void print();
 
};
void student::print()
{
    out << fam << " " << name << " " << secondname;
    for (int i = 0; i < 5; i++)
        out << " " << mark[i];
    out << endl;
}
 
void quickSortR(student* a, long N) {
    
    long i = 0, j = N;      // поставил указатели на исходные места
    student temp, p;
 
    p = a[N >> 1].fam;      // центральный элемент
 
    // процедура разделения
    do {
        while (a[i].fam < p.fam) i++;
        while (a[j].fam > p.fam) j--;
 
        if (i <= j) {
            temp = a[i]; a[i] = a[j]; a[j] = temp;
            i++; j--;
        }
    } while (i <= j);
 
    // рекурсивные вызовы, если есть, что сортировать 
    if (j > 0) quickSortR(a, j);
    if (N > i) quickSortR(a + i, N - i);
}
 
int main()
{
    student stud[5];
    int n = 0, m;
 
    if (!in)
    {
        cout << "Error,file doesn't open";
    }
    else
    {
        in >> m;
        while (in.peek()!=EOF)
        {
            in >> stud[n].fam;
            in >> stud[n].name;
            in >> stud[n].secondname;
            in >> stud[n].year;
 
            for (int i = 0; i< 5; i++)
            {
                in >> stud[n].mark[i];
 
            }
            n++;
        }
    }
    out << m << endl;
    quickSortR(stud, n);
    for (int i = 0; i < n; i++)
        stud[i].print();
 
    in.close();
    out.close();
}
не до конца доделанный,не знаю,как установить центральный элемент в "фамилии"
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
04.06.2016, 08:14 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void quickSortR(student* a, long N) {
    
    long i = 0, j = N;      // поставил указатели на исходные места
    student temp, p;
 
    p = a[N >> 1];      // центральный элемент
 
    // процедура разделения
    do {
        while (a[i].fam < p.fam) i++;
        while (a[j].fam > p.fam) j--;
 
        if (i <= j) {
            temp = a[i]; a[i] = a[j]; a[j] = temp;
            i++; j--;
        }
    } while (i <= j);
 
    // рекурсивные вызовы, если есть, что сортировать 
    if (j > 0) quickSortR(a, j);
    if (N > i) quickSortR(a + i, N - i);
}
0
Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 253
Завершенные тесты: 3
22.06.2016, 16:43  [ТС] #7
В файле input.txt содержатся сведения о группе студентов в формате:
номер группы;
запись о каждом студенте группы содержит следующие сведения: фамилия, имя,
отчество, год рождения, оценки по пяти предметам.
в алфавитном порядке по фамилии методом «быстрой»;
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
#include <fstream>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
 
ifstream in ("input.txt");
ofstream out("output.txt");
 
struct mas {
    string fam, name, secondname;
    int year, ses[5];
    void print();
};
 
void mas::print(){
    out << fam << " " << name << " " << secondname << " " << year << " ";
    for(int i = 0; i < 5; i++)
      out << ses[i] << " ";
    out << endl;
}
 
void sort(mas *a, int l, int r){
    int i = l, j = r;
    mas center = a[(l + r)/2];
    mas temp;
    do{
      while (a[i].fam[1] < center.fam[1]) i++;
      while (a[j].fam[1] > center.fam[1]) j--;
      if(i <= j){
        if(i < j){
          temp = a[i];
          a[i] = a[j];
          a[j] = temp;
        }
        i++;
        j--;
      }
    }while(i <= j);
 
    if(i < r) sort(a, i, r);
    if(j > l) sort(a, l, j);
  }
 
int main(){
    mas stud[5];
    int m = 5;
    for(int i = 0; i < m; i++){
        in >> stud[i].fam;
        in >> stud[i].name;
        in >> stud[i].secondname;
        in >> stud[i].year;
 
        for(int j = 0; j < 5; j++)
         in >> stud[i].ses[j];
    }
 
    sort(stud, 0, m);
    for (int i = 0; i < m; i++)
        stud[i].print();
 
    in.close();
    out.close();
    return 0;
}
Ошибка выходит,"string subscript out of range"

Добавлено через 1 час 20 минут
кто-нибудь
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
22.06.2016, 17:58 #8
Я тебе уже показал как должно быть. И для чего ты сравниваешь вторые буквы фамилий?
0
Bob103
8 / 8 / 9
Регистрация: 23.09.2015
Сообщений: 253
Завершенные тесты: 3
22.06.2016, 18:58  [ТС] #9
У меня выводит неправильно,а вот в этом новом переделанном,один раз верно вывел

Добавлено через 2 минуты
+ потом после 1 раза,стал выводить консоль.
0
22.06.2016, 18:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 18:58

Ошибка: String subscript out of range
Expression: String subscript out of range Консольное приложение. Программа...

Ошибка: string subscript out of range
При запуске выдает ошибку &quot;string subscript out of range&quot;. Подскажите, в чем...

Ошибка string subscript out of range
Нужно заменить символ 'w' на 'v'. #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru