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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2013, 23:14   #1
afdotya
 
Регистрация: 16.10.2013
Сообщений: 4
По умолчанию Массив строк

Создать массив из 10 строк, Упорядочит строки по длине .Вывести на экран. Определить , в каких строках содержаться десятичные дроби. Выделить их и перевести в число (процедурой Val).
Написать программу корректности ввода десятичных чисел. При ошибочном вводе недопустимых символов менять цвeт ошибочного символа и возвращать курсор назад.
afdotya вне форума Ответить с цитированием
Старый 22.10.2013, 08:46   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

И что? Наработки где?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 22.10.2013, 08:57   #3
afdotya
 
Регистрация: 16.10.2013
Сообщений: 4
По умолчанию

Код:
uses crt;
const n=10;
var
s,dr : array[1..10] of string;
i,j : integer;
t,buf : string;
ch, drobi: set of char;


begin
ch:=['0','1','2','3','4','5','6','7','8','9',','];

clrscr;
for i:=1 to n do
 readln(s[i]);

 for i:=n-1 downto 1 do
  for j:=1 to i do
   if length(s[j])>length(s[j+1]) then
    begin
    t:=s[j];
    s[j]:=s[j+1];
    s[j+1]:=t;
    end;

    clrscr;
for i:=1 to n do begin
t:=s[i];
for j:=1 to length(s[i]) do begin
if (t[j] in ch) or ((t[j]=',') and (t[j+1]<>' ')) then begin
textcolor(12);
buf[j]:=t[j];
end
else textcolor(0);
write(t[j]);
end;
writeln;
dr[i]:=buf;
end;
readln;
writeln('==============');
for i:=1 to n do
writeln(dr[i]);



end.

Последний раз редактировалось Stilet; 22.10.2013 в 09:52.
afdotya вне форума Ответить с цитированием
Старый 22.10.2013, 09:53   #4
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Ага, хорошо. По сортировке вроде зачет. А вот по определению чисел с десятичной дробью в строке - неуд.

Алгоритм будет следующий:
1) Для всех строк делай
1.1) Сбросить флаги "идет число", "найден разделитель", "ошибка"
1.2) Для всех символов начиная с конца делай
1.2.2) Если символ не пробел и флаг "идет число" не установлен - установить флаг "идет число"
1.2.3) Если символ пробел и установлен флаг "идет число" - установить флаг "ошибка", прервать процедуру, это строка
1.2.4) Если символ не число и не разделитель - установить флаг "ошибка", прервать процедуру, это строка
1.2.5) Если символ разделитель и не установлен флаг "найден разделитель" - установить флаг "найден разделитель"
1.2.6) Если символ - разделитель и установлен флаг "найден разделитель" - установить флаг "ошибка", прервать процедуру, это строка
1.2.7) Если это символ с номером 1, и установлен флаг "найден разделитель" - преобразовать строку в число, вывести другим цветом
1.3) Если установлен флаг "ошибка" - вывести строку стандартным цветом
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 31.10.2013, 20:23   #5
afdotya
 
Регистрация: 16.10.2013
Сообщений: 4
По умолчанию вот что получлось только ничего не работает

Код:
uses crt;
const n=10;
 var s,dr : array[1..10] of string;
 i,j,err : integer;
 X:real;
 t,buf : string;
  ch, drobi, Razdel: set of char;
  Number, Razd, Error: boolean;
begin
     ch:=['0','1','2','3','4','5','6','7','8','9'];
     Razdel:=[','];
     clrscr;
     for i:=1 to n do readln(s[i]);
   
     for i:=n-1 downto 1 do             //сортировка строк по длине
                for j:=1 to i do
                if length(s[j])>length(s[j+1]) then
                                                   begin
                                                   t:=s[j];
                                                   s[j]:=s[j+1];
                                                   s[j+1]:=t;
                                                   end;
   
   
For i:=1 to n do  //для всех строк делай
    begin
         t:=s[i]; //копируем строку из массива в переменную для дальнейшей работы
         Number:=false;    //сбросить флаги "идёт число", "найден разделитель", "Ошибка"
         Razd:=false;
         Error:=false;
         for j:=length(s[i]) downto 1 do   //для всех символов начиная с конца делай
             begin
                  if (t[j]<>' ') and (not Number) then Number:=true; //Если символ не пробел и флаг "идёт число" не установлен, то установить флаг "идёт число"
                  if (t[j]=' ') and Number then    //Если символ пробел и установлен флаг "Идёт число" - устанвоить флаг "ошибка", прервать процедуру
                                               begin
                                               Error:=true;
                                               break;
                                               end;
                  if (not (t[j] in ch)) and (not (t[j] in Razdel)) then               //если символ не число и не разделитель - установить флаг "ошибка", прервать процедуру
                                                                     begin
                                                                     Error:=true;
                                                                     break;
                                                                     end;
                  if (t[j] in Razdel) and (not Razd) then Razd:=true; //Если символ - разделитель и не устарновлен флаг "найден разделитель" - установить флаг "найден разделитель"
                  if (t[j] in Razdel) and (Razd) then     //Если символ разделитель и установлен флаг "найден разделитель" - устаовить флаг "ошибка" и прервать процедуру
                                                   begin
                                                   Error:=true;
                                                   break;
                                                   end;
                  if (j=1) and (Razd) then          //Если символ с номером 1 и установлен флаг "найден разделитель",
                                      begin
                                      Val(t, X, err);    //преобразовать строку в число
                                      textcolor(3);     //сменить цвет
                                      writeln(t);       //вывести строку
                                      end;
                  if Error then           //Если установлен флаг "ошибка"
                               begin
                               textcolor(0); //Установить черный цвет
                               writeln(t);  //вывести строку
                               end;
             end;
         end;
end.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 31.10.2013 в 20:36.
afdotya вне форума Ответить с цитированием
Старый 01.11.2013, 06:54   #6
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Работает? Не работает? Работает не правильно?

Алгоритм вроде прописан верно.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 01.11.2013, 11:57   #7
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Код:
 if (t[j] in Razdel) and (not Razd) then Razd:=true; //Если символ - разделитель и не устарновлен флаг "найден разделитель" - установить флаг "найден разделитель"
                  if (t[j] in Razdel) and (Razd) then     //Если символ разделитель и установлен флаг "найден разделитель" - устаовить флаг "ошибка" и прервать процедуру
                                                   begin
                                                   Error:=true;
                                                   break;
                                                   end;
эм...
пришел разделитель
проверили. поставили флаг.
далее проверяем если это разделитель и установлен флаг "найден разделитель" - установить флаг "ошибка" и прервать процедуру. а как быть тогда?
мне кажется это лишнее...
и разделитель это же , между целой и десятичной частью?
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 01.11.2013 в 12:06.
SaLoKiN вне форума Ответить с цитированием
Старый 01.11.2013, 12:05   #8
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Ммммда, об этом я не подумал.
Костыльным решением данной ситуации будет поменять местами проверки.

По идее после установки любого флага нужно переходить на следующий символ, не выполняя остальных проверок. Через goto - кривое решение. Через continue разве что?

Предлагаю вывод строки перенести из цикла перебора символов в цикл перебора строк. Таким образом, если в строке есть ошибка - цикл будет brake`нут, по флагу будет выведена строка. Если цикл выполнился с нужными флагами - выводится число.

И еще такой момент пришел на ум. А как обрабатываются строки вида " 0.123 "? Т.е. когда перед числом есть пробелы?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)

Последний раз редактировалось Vanta11a; 01.11.2013 в 12:09.
Vanta11a вне форума Ответить с цитированием
Старый 01.11.2013, 12:12   #9
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

давайте определимся что будет являться дробью?
число цифр не ограничено
Код:
,123  
123,12
123,
1 - первый символ разделитель- предлагаю ДА
2 - разделитель не 1ый и не n-ый символ
3- разделитель n-ый символ. вот тут стоит ли?

плюс проверка
если разделитель=1 и нашли разделитель это ошибка

Цитата:
Костыльным решением данной ситуации будет поменять местами проверки.
думаю поможет.

и получается что строки типа пробел123,12пробел мы тоже отбрасываем?
и нам интересны только те которые начинаются с цифры/разделителя содержат только цифры(разделитель,если не первый) и заканчиваются только цифрой?
тогда зачем все так усложнять?

проверка на десятичное число:
Код:
разделитель=0
цикл по символам строки:
пока не конец строки или разделитель <=1
делай
Если символ = разделитель и номерсимвол != n
разделитель++
иначе 
если символ  !=  цифра
стоп.выход

Если разделитель =0 число не имеет дробной части
Цитата:
При ошибочном вводе недопустимых символов менять цвeт ошибочного символа и возвращать курсор назад.
фу какая кака =(
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 01.11.2013 в 12:51.
SaLoKiN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать массив строк в массив чисел на C#? orfos Помощь студентам 4 03.10.2014 15:56
Написать алгоритм, который реализует jagged массив (рваный массив с различной длиной строк), используя список списков (Pascal ABC) бабуся Помощь студентам 0 29.04.2013 00:07
Массив строк. Смородинка Общие вопросы C/C++ 11 21.11.2010 17:21
Массив строк L_Killer Помощь студентам 2 30.05.2010 01:58