Форум программистов, компьютерный форум CyberForum.ru

Работа со строками - C++

Восстановить пароль Регистрация
 
gudzon10
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 22
29.06.2013, 18:57     Работа со строками #1
Всем доброго времени суток.
Я собрался поступать (в свои-то 22, года, балбес), и сдаю ЕГЭ по информатике. Все решаю более-менее в принципе, но вот беда с C4 - уже и не знаю где искать информацию, посему обращаюсь к знатокам. Просьба помидорами не кидаться=)

Само задание во вложении.

Я даже не берусь за саму суть отбора, так как не могу входящую строку раскидать по трём массивам. Перепробовал по-всякому (gets(),fgets(),getline(), использовал как символьный массив так и string, даже пытался по одному символу вводить. В каком-то подобном примере видел решение с использованием map - глянул, испугался кода, закрыл вкладку.) - ни к чему не приводит.

Вот последняя моя вариация. Тапками не лупите, если абсолютная глупость=(
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    const int n = 100;
    string names[n];
    string schools[n];
    string points[n];
    int N;
    
    cin >> N;   
    
    
    for (int i = 0; i < N; i++)
    {
        string str;
        getline(cin, str);
        cout << str << endl;
        
        int j = 0;
        int k = 0;
        
        while (str[k++] != ' ')
        {
            names[i++] = str[k];
        }
        
        names[i++] = ' ';
        
        while (str[k++] != ' ')
        {
            names[i++] = str[k];
        }        
        
        names[i] = '\0';
        
       
        j = 0;
        
        while (str[k++] != ' ')
        {
            schools[j++] = str[k];
        }
        
        schools[j] = '\0';
        
        j = 0;     
        
        while (str[k++] != ' ')
        {
            points[j++] = str[k];
        }
        points[j] = '\0';
    }
    
    for (int i = 0; i < N; i++)
    {
        if(schools[i] == 5)
        {
            cout << names[i] << endl;
        }
    }
    return 0;
}


Дело в том, что это очень распространенный тип заданий на ЕГЭ, а я даже с вводом-выводом не могу справится. Подскажите, как решать? Может есть доступные способы, что-то подучить надо?

Еще раз извините, если с тупыми вопросами, но заранее спасибо за терпение!=)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2013, 18:57     Работа со строками
Посмотрите здесь:

работа со строками C++
работа со строками C++
Работа со строками C++
Работа со строками C++
C++ Работа со строками
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gudzon10
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 22
29.06.2013, 20:50  [ТС]     Работа со строками #2
Задание следующее:
Кликните здесь для просмотра всего текста
После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько набрал баллов. Эта информация в том же виде была разослана в школы.
Завуч школы номер 50 решила наградить двух учащихся, которые лучше всех сдали информатику в школе.
Программа должна вывести на экран фамилии и имена этих учеников.
Если наибольший балл набрало больше двух человек - вывести количество таких учеников.
Если наибольший балл набрал один человек, а следующий балл набрало несколько человек - нужно вывести только фамилию и имя лучшего.
Напишите эффективную, в том числе и по используемой памяти, программа (укажите используемую версию языка программирования), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников школы номер 50.
На вход программе сначала подается число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия><Имя><Номер школы><Количество баллов>
где <Фамилия> - строка, состоящая не более чем из 30 символов без пробелов, <Имя> - строка, состоящая не более чем из 20 символов без пробелов, <Номер школы> - целое число в диапазоне от 1 до 99, <Количество баллов> - целое число в диапазоне от 1 до 100. Эти данные записаны через пробел, причем ровно один между каждой парой (то есть всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
Круглов Василий
Тарасова Дарья
Другой вариант выходных данных:
7
Третий вариант выходных данных:
Гусарский Илья
Selot
155 / 91 / 23
Регистрация: 19.01.2010
Сообщений: 364
Завершенные тесты: 1
29.06.2013, 20:51     Работа со строками #3
Цитата Сообщение от gudzon10 Посмотреть сообщение
так как не могу входящую строку раскидать по трём массивам
На 2 массива строку делю тут:
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
int main(int argc, char *argv[])
{
    char str[50];
    char name1[50]={' '};
    char name2[50]={' '};
    
    int i = 0;
    cin.getline(str, sizeof(str));
    int len = strlen(str);
    
    while(str[i] != ' ') {
       name1[i] = str[i];
       i++;
    }
 
    cout << name1 << endl;
 //------------------------   
    
    int j = 0;
    i++;
    while(i < len) {
        name2[j] = str[i];
        j++;
        i++;
    }
    
    cout << name2 << endl;
    
//-------------------------
      getch();
    return 0;
}
gudzon10
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 22
30.06.2013, 04:19  [ТС]     Работа со строками #4
А как получившуюся строку проверить на наличие числа 50? Не догоняю(
Selot
155 / 91 / 23
Регистрация: 19.01.2010
Сообщений: 364
Завершенные тесты: 1
30.06.2013, 09:29     Работа со строками #5
Цитата Сообщение от gudzon10 Посмотреть сообщение
А как получившуюся строку проверить на наличие числа 50? Не догоняю(
C++
1
2
3
4
5
6
7
8
9
10
    
char str[50];
cin.getline(str, sizeof(str));
char school[2];
char *cut = strstr(str, "50");
if(!cut) cout << "not found '50'" << endl;
else {
        for(i = 0; i < 2; i++)  school[i] = cut[i];
        cout << school << endl;
       }
gudzon10
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 22
02.07.2013, 15:16  [ТС]     Работа со строками #6
Нет, все же не понимаю как сделать задание=( Вроде тут даже и не надо разбивать на массивы, ибо потом как найти соответствие имя-баллы, ведь длина-то разная.
Пытаюсь вкурить про map - не получается. Может кто-нибудь объяснить? Или есть ли другие идеи?
zer0mail
2188 / 1871 / 187
Регистрация: 03.07.2012
Сообщений: 6,661
Записей в блоге: 1
02.07.2013, 15:28     Работа со строками #7
Создай структуру-список:
C++
1
2
3
4
5
6
struct test {
test *p; // указатель на следующий элемент списка
char *name;
char *fam;
int ball;
}
gudzon10
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 22
03.07.2013, 14:56  [ТС]     Работа со строками #8
А подскажите, а можно ли строку string запихать в массив, то есть сделать элементом массива?
1richard
15 / 5 / 2
Регистрация: 22.06.2013
Сообщений: 25
03.07.2013, 17:02     Работа со строками #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Первое, что пришло на ум, так это вот этот код:
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
#include <iostream>
#include <conio>
#include <string>
#include <stdio>
 
int CharToInt(char *&a)
{
 int n = 0;
 int mass[9];
 while(*a != ' ' && *a != '\0')
 {
  mass[n] = (int)*a-48;
  a++;
  n++;
 }
 int Result = 0;
 for(int i = 0, k = 1; i < n; i++)
 {
  Result += mass[n-i-1]*k;
  k*=10;
 }
 return Result;
}
 
void SearchAndCopy(char *&a, string &b)
{
 while(*a!=' ')
 {
  b+=*a;
  a++;
 }
}
 
int FindMaxMark50(int *mark, int *SchoolNumber, int number)
{
 int MaxMark = 0;
 int MaxIndex = 0;
 for(int i = 0; i < number; i++)
 {
  if(SchoolNumber[i] == 50)
   if(mark[i] > MaxMark)
   {
    MaxMark = mark[i];
    MaxIndex = i;
   }
 }
 return MaxIndex;
}
 
void OutResult(int MaxIndex, string *surname, string *name, int *mark, int *SchoolNumber, int n)
{
 int NumberOfMaxMarks = 0;
 int SecondMaxIndex;
 for(int i = 0; i < n; i++)
 {
  if(mark[i] == mark[MaxIndex] && SchoolNumber[i] == 50)
  {
   NumberOfMaxMarks++;
   if(MaxIndex != i)
    SecondMaxIndex = i;
  }
 }
 if(NumberOfMaxMarks == 1)
  cout<<surname[MaxIndex]<<" "<<name[MaxIndex]<<endl;;
 if(NumberOfMaxMarks == 2)
 {
  cout<<surname[MaxIndex]<<" "<<name[MaxIndex]<<endl;
  cout<<surname[SecondMaxIndex]<<" "<<name[SecondMaxIndex]<<endl;
 }
 if(NumberOfMaxMarks > 2)
  cout<<NumberOfMaxMarks;
}
 
void main()
{
 int n;
 cin >> n;
 string *surname = new string [n];
 string *name = new string [n];
 int *SchoolNumber = new int [n];
 int *mark = new int [n];
 char buffer[255];
 char *point;
 for(int i = 0; i < n; i ++)
 {
  gets(buffer);
  point = buffer;
  SearchAndCopy(point, surname[i]);
  point++;
  SearchAndCopy(point, name[i]);
  point++;
  SchoolNumber[i] = CharToInt(point);
  point++;
  mark[i] = CharToInt(point);
 }
 int MaxIndex;
 MaxIndex = FindMaxMark50(mark, SchoolNumber,n);
 OutResult(MaxIndex, surname, name, mark,SchoolNumber,n);
 getch();
}
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
03.07.2013, 21:33     Работа со строками #10
Цитата Сообщение от gudzon10 Посмотреть сообщение
А как получившуюся строку проверить на наличие числа 50? Не догоняю(
если вы используете string можете так
C++
1
2
3
4
5
string s = "qwew 50 ret r";
if (s.find("50") != std::npos)
{
    cout << "строка найдена";
}
Добавлено через 2 минуты
Цитата Сообщение от gudzon10 Посмотреть сообщение
Напишите эффективную, в том числе и по используемой памяти,
для 50 участников)
gudzon10
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 22
03.07.2013, 23:32  [ТС]     Работа со строками #11
Цитата Сообщение от 1richard Посмотреть сообщение
Первое, что пришло на ум, так это вот этот код:
Нихрена себе. На с4 в егэ у меня будет только листок с ручкой и до часу времени.
Цитата Сообщение от Van111 Посмотреть сообщение
для 50 участников)
Ну вот.... ЕГЭ=)


Так подкопался, прояснил что все же различаются типы. Где-то надо просто двумерный массив создать, где-то два одномерных, а где-то хорошо использовать ассоциативный. То есть в данном случае делать привязку строка (имя-фамилия) - баллы, уже для строк со школой 50.
Пытаюсь раскурить синтаксис, я наверное тупой, не понимаю как работать с map(
1richard
15 / 5 / 2
Регистрация: 22.06.2013
Сообщений: 25
04.07.2013, 01:19     Работа со строками #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
если немного подумать, то можно сделать ввод попроще, что-то типо:
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
#include <iostream>
#include <conio>
#include <string>
#include <stdio>
 
struct Data
{
 string surname;
 string name;
 int SchoolNumber;
 int mark;
};
 
istream& operator >> (istream& mystream, Data &data)
{
 mystream>>data.surname;
 mystream>>data.name;
 mystream>>data.SchoolNumber;
 mystream>>data.mark;
 return mystream;
}
 
void main()
{
 int n;
 cin >> n;
 Data *data = new Data[n];
 for(int i = 0; i < n; i ++)
 {
  cin >> data[i];
 }
 for(int i = 0; i < n; i ++)
 {
  cout <<data[i].surname<<" "<<data[i].name<<" "<<data[i].SchoolNumber<<" "<<data[i].mark<<endl;
 }
 getch();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 14:20     Работа со строками
Еще ссылки по теме:

C++ Работа со строками в c++
Работа со строками C++
Работа со строками C++

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

Или воспользуйтесь поиском по форуму:
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
04.07.2013, 14:20     Работа со строками #13
Цитата Сообщение от gudzon10 Посмотреть сообщение
не понимаю как работать с map
кстати зря, std очень упрощает и сокращает код в ущерб производительности

Добавлено через 39 минут
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
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm> 
using namespace std;
 
const int max_first_name =  30 ;
const int max_last_name =  20 ;
const char name_file[] = "c:\\data.txt";
const int nuber_school = 50;
 
struct participant
{
    char first_name[max_first_name];  // фамилия 
    char last_name[max_last_name]; // имя
    int number;
    int ball;
    void print() // вывод данных
    {
        cout << first_name << " " << last_name << " " << number << " " << ball << endl;
    }
};
 
bool sort_participant(participant i, participant j)
{
    return (i.ball > j.ball);  // сортировка в порядке убывания
}
 
 
int main()
{ 
    int size_participant;   // количество участников
    fstream file(name_file, ios::in);
    file >> size_participant;
 
 
    vector  <participant> Vparticipant;
 
    for(int i = 0; i < size_participant ; i++)
    {
        participant tmp_participant; // временная структура для помещения в вектор
        file >> tmp_participant.first_name >> tmp_participant.last_name >> tmp_participant.number >> tmp_participant.ball;
        if (tmp_participant.number == nuber_school ) // если это 50 школа
            Vparticipant.push_back(tmp_participant);
    }
 
    sort(Vparticipant.begin(), Vparticipant.end(), sort_participant); // сортировка (начало, конец, функция сравнения)
    
    if(Vparticipant[1].ball == Vparticipant[2].ball) // если 2 и 3 имеют одинаковое количество баллов
        Vparticipant[0].print();
    else
    {
        Vparticipant[0].print();
        Vparticipant[1].print();
    }
 
    
    system("pause");
    return 0;
}
Добавлено через 5 минут
Цитата Сообщение от gudzon10 Посмотреть сообщение
На с4 в егэ у меня будет только листок с ручкой и до часу времени.
я сделал за 35 минут без комментариев не зная stl . Из за му***ов которые делают такие условия, я допустим не смогу сдать этот с4.
Yandex
Объявления
04.07.2013, 14:20     Работа со строками
Ответ Создать тему
Опции темы

Текущее время: 09:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru