Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2012, 12:24   #1
weech
Пользователь
 
Аватар для weech
 
Регистрация: 16.11.2011
Сообщений: 91
По умолчанию Работа со строками

Здравствуйте.
Имеется следующая задача:


На вход программы подаются сведения о результатах соревнований по школьному многоборью. Многоборье состоит из соревнований по четырем видам спорта, участие в каждом из которых оценивается баллами от 0 до 10 (0 баллов получает ученик, не принимавший участия в соревнованиях по данному виду спорта). Победители определяются по наибольшей сумме набранных баллов. Известно, что общее количество участников соревнований не превосходит 100.
В первой строке вводится количество учеников, принимавших участие в соревнованиях, N. Далее следуют N строк, имеющих следующий формат:
<Фамилия> <Имя> <Баллы>
Здесь <Фамилия> – строка, состоящая не более чем из 20 символов; <Имя> – строка, состоящая не более чем из 15 символов; <Баллы> - строка, содержащая четыре целых числа, разделенных пробелом, соответствующих баллам, полученным на соревнованиях по каждому из четырех видов спорта. При этом <Фамилия> и <Имя>, <Имя> и <Баллы> разделены одним пробелом. Примеры входных строк:
Иванова Мария 5 8 6 3
Петров Сергей 9 9 5 7
Напишите программу, которая будет выводить на экран фамилии и имена трех лучших участников многоборья. Если среди остальных участников есть ученики, набравшие то же количество баллов, что и один из трех лучших, то их фамилии и имена также следует вывести. При этом имена и фамилии можно выводить в произвольном порядке.

...и мои наработки:

Код:
program q;
uses crt;
const
m=100;
type
DB = record
name:string;
count:integer;
end;
var
mas:array [1..m] of DB;
i,j,max,max2,max3,n:integer;
s:string;
begin
max:=-1;
max2:=-1;
max3:=-1;
clrscr;
write('Ââåäèòå N: ');
readln(n);
for i:=1 to n do
    begin
    readln(s);
              for j:=1 to length(s) do
              if ord(s[j]) in [48..57] then
              break
              else
              mas[i].name:=mas[i].name+s[j];
              Delete(s,1,length(mas[i].name));
    for j:=1 to length(s)-1 do
        if (ord(s[j]) in [48..57]) and (not ord(s[j-1]) in [48..57]) then
           if ord(s[j+1]) in [48..57] then
              mas[i].count:=mas[i].count+StrToInt(Copy(s,j,2))
           else
              mas[i].count:=mas[i].count+StrToInt(s[j]);
    if mas[i].count>max then
       begin
       max3:=max2;
       max2:=max;
       max:=mas[i].count;
       end
    else
        if mas[i].count>max2 then
           begin
           max3:=max2;
           max2:=mas[i].count;
           end
        else
            if mas[i].count>max3 then
               max3:=mas[i].count;
end;
for i:=1 to n do
    if (mas[i].count=max) or (mas[i].count=max2) or (mas[i].count=max3)
     then writeln(mas[i].name);
end.
Мне кажется ошибка находится где-то во вложенном цикле, так как в переменной mas[i].count всегда оказывается 0; никак не пойму в чем дело, подскажите, пожалуйста.
weech вне форума Ответить с цитированием
Старый 11.03.2012, 14:40   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ошибка в том, как Вы разбираете строчку с баллами..

я бы предложил поступить по другому - парсить строчку по пробелам.

например, так (серым отметил Ваш код, он остаётся....):
Код:
    readln(s);
    for j := 1 to length(s) do
      if ord(s[j]) in [48..57] then
        break
      else
        mas[i].name := mas[i].name + s[j];
    Delete(s, 1, length(mas[i].name));

    {уберём ведущие пробелы}
    while (Length(s)>0) and (s[1]=' ') do Delete(s,1,1);

    {добавим в конец строки пробел для удобства обработки}
    s := s + ' ';

    mas[i].count := 0;
    while Pos(' ',s)>1 do begin
      mas[i].count := mas[i].count + StrToInt( Copy(s, 1, Pos(' ',s)-1));
      Delete(s, 1, Pos(' ',s));
      {уберём ведущие пробелы}
      while (Length(s)>0) and (s[1]=' ') do Delete(s,1,1);
    end;

    if mas[i].count > max then
отмечу, кстати, что так же, как и вашем коде не проверяется количество баллов в одной строке. можно написать не только 4-ре числа, а хоть 10 чисел, разделяя их пробелами. Впрочем, легко в данный цикл добавить счётчик и выходить из суммирования после 4-й оценки.. Если это нужно контролировать, конечно...


p.s. кстати, забавно. а что, Вы под TurboPascal написали функцию StrToInt ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.03.2012, 15:07   #3
weech
Пользователь
 
Аватар для weech
 
Регистрация: 16.11.2011
Сообщений: 91
По умолчанию

Спасибо, разобрался.

p.s. ээээ нет...) это ABC паскаль


...Раз уж начал, то вот еще одна задача, на которой я притормозил:

4) На вход программы подаются фамилии и имена учеников. Известно, что общее количество учеников не превосходит 100. В первой строке вводится количество учеников, принимавших участие в соревнованиях, N. Далее следуют N строк, имеющих следующий формат:
<Фамилия> <Имя>
Здесь <Фамилия> – строка, состоящая не более чем из 20 символов; <Имя> – строка, состоящая не более чем из 15 символов. При этом <Фамилия> и <Имя> разделены одним пробелом. Примеры входных строк:
Иванова Мария
Петров Сергей
Требуется написать программу, которая формирует и печатает уникальный логин для каждого ученика по следующему правилу: если фамилия встречается первый раз, то логин – это данная фамилия, если фамилия встречается второй раз, то логин – это фамилия, в конец которой приписывается число 2 и т.д. Например, для входной последовательности
Иванова Мария
Петров Сергей
Бойцова Екатерина
Петров Иван
Иванова Наташа
будут сформированы следующие логины:
Иванова
Петров
Бойцова
Петров2
Иванова2

Код:
program q;
uses crt;
type
DB = record
name:string[20];
count:integer;
check:boolean;
end;
var
i,n,j:integer;
s:string;
a:array [1..100] of DB;
begin
clrscr;
writeln('Введите N: ');
readln(n);
for i:=1 to n do
    begin
    readln(s);
    Delete(s,Pos(' ',s),16);
    a[i].name:=s;

        for j:=1 to i-1 do
            if (a[i].name=a[j].name) and (not a[j].check) then
               begin
               a[i].count:=a[j].count+1;
               a[j].check:=true;
               end;
    end;
for i:=1 to n do
    begin
    if a[i].count>2 then inc(a[i].count);
    if a[i].count>1 then
    writeln(a[i].name + IntToStr(a[i].count))
    else writeln(a[i].name);
end;
end.
Тут совершенно запутался с увеличением счетчиков элементов массива, соответственно выводит какую-то байду.

Последний раз редактировалось weech; 11.03.2012 в 15:15.
weech вне форума Ответить с цитированием
Старый 11.03.2012, 15:30   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) 100% такая задача уже обсуждалась здесь на форуме. воспользуйтесь поиском.

2) очень не рекомендую несколько задач решать последовательно в одной и той же теме.
На форуме действует правило - одна тема <-> одна задача.
Хотя, формально, название вашей темы подходит и под вторую задачу, но всё таки это нарушение правил...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.03.2012, 15:45   #5
weech
Пользователь
 
Аватар для weech
 
Регистрация: 16.11.2011
Сообщений: 91
По умолчанию

Прошу прощения, просто не хотел плодить темы однотипные, впредь учту.
weech вне форума Ответить с цитированием
Старый 11.03.2012, 16:05   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Прошу прощения, просто не хотел плодить темы однотипные, впредь учту.
форум для того и нужен, чтобы тут темы "плодить"!


вот только не забывайте про правильное оформление создаваемой темы (Название темы должно адекватно отражать суть решаемой задачи/проблемы. И чём это название будет информативней, тем лучше!)

p.s. если не разберётесь с решением второй задачи (после поиска), создавайте новую тему - разберёмся.

p.p.s. кстати, если нашли старую тему, где в точности такая же задача, как у Вас (вплоть до совпадения языка программирования) и эта тема ещё не закрыта, тогда можно смело писать там свой вопрос (ну, если он есть, конечно!).
Успехов в учёбе.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками vadiprog Помощь студентам 1 05.12.2011 20:39
Работа со строками в C++ telogrejka Помощь студентам 6 27.02.2011 20:32
Работа со строками в С++ Aleksandr22 Помощь студентам 15 26.02.2011 06:15
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
Работа со строками gani84 Помощь студентам 1 30.03.2010 17:39