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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2021, 19:11   #1
vita79
Пользователь
 
Регистрация: 10.11.2020
Сообщений: 17
По умолчанию сортировка строк в Паскаль

Задание:
Для программы на сортировку строк напишите принципиальный алгоритм (последовательность блоков), а также опишите, что означает каждая переменная
Не могу найти ошибку, при запуске данного кода сортировка только по первой и второй строке, а нужно чтобы сортировка была по всем строкам в файле input.txt. В файле следующие данные
Петров;1997;4
Абрамов;1996;5
Иванов;1994;3
Богданов;1997;5
И что значит "напишите принципиальный алгоритм (последовательность блоков)" не понимаю

Код:
var
  temp_s, s1: string; //объявление строковых переменных
  s: array[1..255]of string; //array - объявление массива; string - строковая переменная
  ball, year: array[1..255]of integer; //integer - используется для определения целых чисел
  i, j, n, pos1, kod, k: integer; //объявление целых чисел
  input, output: text;//input, output - системные файлы для связи с внешними устройствами ввода/вывода текстовые файлы

begin// начало блока
  assign(input, 'input.txt'); //ассоциация переменной input с файлом input.txt
  reset(input); //открытие файла связанного с переменной input на чтение
  i := 1;
  while not eof(input) do //пока не конец файла input
  begin//начало блока
    readln(input, temp_s); //чтение переменной input в строке-накопителе
    pos1 := pos(';', temp_s); //позиция первого пробела
    s[i] := copy(temp_s, 1, pos1 - 1); //копирует из строки temp_s начиная с первого символа символ номер один
    delete(temp_s, 1, pos1); //удаление символов из строки temp_s начиная с первого символа символ номер один
    pos1 := pos(';', temp_s); //позиция второго пробела
    s1 := copy(temp_s, 1, pos1 - 1); //копируем подстроку до второго пробела
    val(s1, year[i], kod); //Преобразует строку в число
    delete(temp_s, 1, pos1); //удаляем все до второго пробела включительно
    s1 := temp_s;
    val(s1, ball[i], kod); //Преобразует строку в число
    writeln(s[i], ';', year[i], ';', ball[i]); //writeln - перенос на новую строку
    i := i + 1;
  end; //конец блока
  n := i - 1;
  writeln('---всего ', n, ' записей---');
  //сортировка
  for i := 1 to (n - 1) do
    for j := 1 to (n - i) do
      if s[j] > s[j + 1] then;
  begin//начало блока
    temp_s := s[j];
    s[j] := s[j + 1];
    s[j + 1] := temp_s;
    k := year[j];
    year[j] := year[j + 1];
    year[j + 1] := k;
    k := ball[j];
    ball[j] := ball[j + 1];
    ball[j + 1] := k;
  end; //конец блока
  assign(output, 'output.txt'); // ассоциация переменной output с файлом output.txt
  rewrite(output); // открытие файла, связанного с переменной output, на запись
  assign(output, 'output.txt'); //вывод в output.txt
  writeln('---После сортировки---');
  for i := 1 to n do
    writeln(s[i], ' ', year[i], ' ', ball[i]);
  assign(output, 'output.csv'); //вывод в CSV-файл
  rewrite(output); //открытие файла output на запись
  for i := 1 to n do //чтение элементов от 1 до n
    writeln(output, s[i], ';', year[i], ';', ball[i]);
  close(output); //закрытие файла output
  close(input); // закрытие файла связанного с input
end. //конец блока

Последний раз редактировалось BDA; 02.08.2021 в 19:15.
vita79 вне форума Ответить с цитированием
Старый 02.08.2021, 20:13   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

С форматированием кода жить легче. После автоматического форматирования сразу бросается в глаза лишняя точка с запятой в строке "if s[j] > s[j + 1] then;". Принципиальный алгоритм, предположу, алгоритм в общих чертах (словесное описание крупных блоков кода).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.08.2021, 20:49   #3
vita79
Пользователь
 
Регистрация: 10.11.2020
Сообщений: 17
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
С форматированием кода жить легче. После автоматического форматирования сразу бросается в глаза лишняя точка с запятой в строке "if s[j] > s[j + 1] then;".
Спасибо, помогли с кодом.

Цитата:
Сообщение от BDA Посмотреть сообщение
Принципиальный алгоритм, предположу, алгоритм в общих чертах (словесное описание крупных блоков кода).
не могли бы помочь в составлении этих блоков?

Цитата:
Сообщение от BDA Посмотреть сообщение
Принципиальный алгоритм, предположу, алгоритм в общих чертах (словесное описание крупных блоков кода).
Возможно имеется в виду:
Ввод массива строк
Сортировка массива строк
Вывод отсортированного массива строк.
Что еще должно быть в описании?

Последний раз редактировалось BDA; 05.08.2021 в 05:55.
vita79 вне форума Ответить с цитированием
Старый 05.08.2021, 05:54   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

А кроме условия задачи нет никаких примеров, лекций, пояснений? В принципе, блоки кода описаны. Но насколько подробное описание требуется - не понятно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.08.2021, 06:54   #5
vita79
Пользователь
 
Регистрация: 10.11.2020
Сообщений: 17
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А кроме условия задачи нет никаких примеров, лекций, пояснений? В принципе, блоки кода описаны. Но насколько подробное описание требуется - не понятно.
Нет, и к моему огромному сожалению, нет ни каких подробностей, кроме условия задания "Для программы на сортировку строк напишите принципиальный алгоритм (последовательность блоков), а также опишите, что означает каждая переменная." Переменные я описал, а вот с алгоритмом тупик(((.
vita79 вне форума Ответить с цитированием
Старый 05.08.2021, 09:45   #6
vita79
Пользователь
 
Регистрация: 10.11.2020
Сообщений: 17
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
С форматированием кода жить легче. После автоматического форматирования сразу бросается в глаза лишняя точка с запятой в строке "if s[j] > s[j + 1] then;". Принципиальный алгоритм, предположу, алгоритм в общих чертах (словесное описание крупных блоков кода).
Еще один вопрос. Задание по этому же коду Соедините программу подсчета количества слов в тексте и программу создания CSV-файла (т.е. нужно подсчитать количество элементов в тексте и вывести отчет в CSV-файл). То что подчеркнуто, не отображается в файле CSV. А по условию задания должно
еще раз код
var temp_s, s1:string; //объявление строковых переменных
s:array[1..255]of string; //array - объявление массива; string - строковая переменная
ball,year:array[1..255]of integer; //integer - используется для определения целых чисел
i,j,n,pos1,kod,k:integer; //объявление целых чисел
input,output:text; //input, output - системные файлы для связи с внешними устройствами ввода/вывода текстовые файлы
begin // начало блока
assign(input,'input.txt'); //ассоциация переменной input с файлом input.txt
reset(input); //открытие файла связанного с переменной input на чтение
i:=1;
while not eof (input) do //пока не конец файла input
begin //начало блока
readln(input,temp_s); //чтение переменной input в строке-накопителе
pos1:=pos(';',temp_s); //позиция первого пробела
s[i]:=copy(temp_s,1,pos1-1); //копирует из строки temp_s начиная с первого символа символ номер один
delete(temp_s,1,pos1); //удаление символов из строки temp_s начиная с первого символа символ номер один
pos1:=pos(';',temp_s); //позиция второго пробела
s1:=copy(temp_s,1,pos1-1); //копируем подстроку до второго пробела
val(s1,year[i],kod); //Преобразует строку в число
delete(temp_s,1,pos1); //удаляем все до второго пробела включительно
s1:=temp_s;
val(s1,ball[i],kod); //Преобразует строку в число
writeln(s[i],';',year[i],';',ball[i]); //writeln - перенос на новую строку
i:=i+1;
end; //конец блока
n:=i-1;
writeln('---всего ',n,' записей---');
//сортировка
for i:=1 to (n-1) do
for j:=1 to(n-i) do
if s[j] > s[j+1] then
begin //начало блока
temp_s:=s[j];
s[j]:=s[j+1];
s[j+1]:=temp_s;
k:=year[j];
year[j]:=year[j+1];
year[j+1]:=k;
k:=ball[j];
ball[j]:=ball[j+1];
ball[j+1]:=k;
end; //конец блока
writeln('---После сортировки---');
for i:=1 to n do
writeln(s[i],' ',year[i],' ',ball[i]);
assign(output,'output.csv'); //вывод в CSV-файл
rewrite(output); //открытие файла output на запись
for i:=1 to n do //чтение элементов от 1 до n
writeln(output,s[i],';',year[i],';',ball[i]);
close(output); //закрытие файла output
close(input); // закрытие файла связанного с input
end. //конец блока
vita79 вне форума Ответить с цитированием
Старый 05.08.2021, 09:58   #7
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

А это вас так учат или это вы сами пишите абсолютно бесполезные комментарии?
ForenLi вне форума Ответить с цитированием
Старый 05.08.2021, 10:01   #8
vita79
Пользователь
 
Регистрация: 10.11.2020
Сообщений: 17
По умолчанию

Цитата:
Сообщение от ForenLi Посмотреть сообщение
А это вас так учат или это вы сами пишите абсолютно бесполезные комментарии?
Сдесь стоит вопрос не в полезности коментария, а том, на сколько мы понимаем его. И правильно ли его понимаем
vita79 вне форума Ответить с цитированием
Старый 05.08.2021, 10:19   #9
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от vita79 Посмотреть сообщение
на сколько мы понимаем его. И правильно ли его понимаем
Код:
var
  temp_s, s1: string; //объявление строковых переменных
Итак видно, что это объявление переменных и тип string. И? Так что такое temp_s и s1? Что рассказал вам этот комментарий?

Код:
readln(input, temp_s); //чтение переменной input в строке-накопителе
Переменной? В строке? Может чуть наоборот и из файла?

Код:
pos1 := pos(';', temp_s); //позиция первого пробела
Точно пробела? Точно пробел обозначается ';'?

И т.д.
ForenLi вне форума Ответить с цитированием
Старый 05.08.2021, 10:40   #10
vita79
Пользователь
 
Регистрация: 10.11.2020
Сообщений: 17
По умолчанию

Цитата:
Сообщение от ForenLi Посмотреть сообщение
Код:
var
  temp_s, s1: string; //объявление строковых переменных
Итак видно, что это объявление переменных и тип string. И? Так что такое temp_s и s1? Что рассказал вам этот комментарий?
объявление строковых переменных; temp_s- строка-накопитель для "собирания" слов.
В начале программы она пустая. Далее мы "цепляем" к ней символ до тех пор, пока не встретим конец слова (пробел, запятая и др.) Когда встретим, тогда сравниваем ее значение с эли массива уникальных слов. s1 - строка для построчного чтения информации из файла
vita79 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка строк. qipist Общие вопросы C/C++ 2 02.05.2014 11:00
Задан текст, состоящий из строк произвольной длины. Обработать текст, подсчитав количество строк и отсортировав их (Паскаль) Александр_Прог Помощь студентам 3 24.03.2014 14:37
Сортировка строк матрицы методом прямых вставок с использование барьеров вставок. Паскаль myrakami Помощь студентам 0 23.12.2010 14:31
Сортировка строк oriojke Общие вопросы C/C++ 9 04.06.2010 13:03
паскаль,одномерный массив,сортировка вставка,сортировка убывания,от максимального до конца немозг Помощь студентам 11 06.02.2010 21:57