Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Паскаль, текстовый файл  (Прочитано 16614 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Viwwna
Интересующийся

ru
Offline Offline

« : 26-11-2011 06:11 » 

 Здравствуйте, и вновь я обращаюсь К Вам за помощью... составила какую то жуть я.. а до ума довести не могу....
Задача
Необходимо в начале программы создать файл (элементы файла вводим с клавиатуры), а в конце программы сначала вывести на экран содержимое созданного файла, а затем отразить полученные результаты.
Описать логическую функцию check(s) для текстового файла s, проверяющую, содержит ли файл s латинские буквы.
Указание: введите файл s (последний элемент в файле '.') и вычислите значение функции check(s).
 
Код:
Program Latin_letters;
{  Программа,проверяющая, содержит ли файл s латинские буквы}
 var
    f: text;
    x: string;
    ch: char;

function check(var s: text) : boolean;
         begin
             assign (f,'C:\SOFT\TUSUR\bin\s.txt');
             reset(f);
               repeat
                  readln(f,x);
                  writeln(x);
             until eof(f);
             close (f);

            end;

                       begin

                assign (f,'C:\SOFT\TUSUR\bin\s.txt');
                reset(f);
               ch := upcase(ch); ch := #0;
               while (ch <> '.') do begin
               read(f, ch);
               writeln(ch);

  if ( (ch >= 'A') and (ch <= 'Z') ) then
                              write ('Файл s содержит латинские буквы')

     else write ('Файл s не содержит латинские буквы');
     end;
     close(f);
end

Спасибо, за то, что всегда оперативно отзываетесь и помогаете.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 26-11-2011 06:38 » 

А в чем именно проблема? Этот кусок кода будет на каждую заглавную букву латиници выводить сообшение "Файл s содержит латинские буквы", а на все остальные знаки "Файл s не содержит латинские буквы".

Несколько замечаний по шероховатостям.
1) Зачем нужно var s: text? В дальнейшем коде переменная все равно не применяется.
2) assign (f,'C:\SOFT\TUSUR\bin\s.txt'); Зачем нужна такая жесткая привязка? Тем более несколько раз в тексте программы?
3) ch := upcase(ch); ch := #0; Логический смысл этой записи?
4)  while (ch <> '.')  А если у тебя не встретится точка. Программа зависнет скорее всего.
5) Избегай применения глобальных переменных. Применяй концепцию "Каждая функция и процедура это закрытый черный яшик."

Опиши словами, все действия по проверке, как должна работать функция.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 26-11-2011 09:11 » 

1. А в каком месте ты вызываешь функцию check?
2. А почему ты читаешь из файла, внимание - это важно, ПОСТРОЧНО?
3.
Код:
               while (ch <> '.') do begin
               read(f, ch);

В какой-то неожиданный момент наступит EOF (конец файла, а точка не пришла.

И... то что сказал Finch


Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Viwwna
Интересующийся

ru
Offline Offline

« Ответ #3 : 26-11-2011 13:45 » 

Приветики ВСЕМ моим помощникам!!!!
Цитата
1. А в каком месте ты вызываешь функцию check?
Sla, Вот сама думаю, по условию задачи ЭТУ ФУНКЦИЮ НЕОБХОДИМО ОПИСАТЬ? А как это сделать не могу понять.... ,без нее проще, подскажите, как ее связать ... и в текст программы засунуть???
Цитата
2. А почему ты читаешь из файла, внимание - это важно, ПОСТРОЧНО?
Вообще то читаю посимвольно, потому, что по условию задачи каждый символ  проверяю на условия принадлежности  к латинским буквам.

Цитата
В какой-то неожиданный момент наступит EOF (конец файла, а точка не пришла.

 А у меня по условию задачи сказано "Указание: введите файл s (последний элемент в файле '.') и вычислите значение функции check(s)."
Поэтому я вручную создала текстовый файл исключила из него  все точки, кроме последнего предложения.

Добавлено через 10 минут и 20 секунд:
Finch,  Учла все твои замечания....
Цитата
2) assign (f,'C:\SOFT\TUSUR\bin\s.txt'); Зачем нужна такая жесткая привязка? Тем более несколько раз в тексте программы?
3) ch := upcase(ch); ch := #0; Логический смысл этой записи?
  У меня это первая моя работа... мне нужно создать  текстовый файл сохранить его в конкретной папке, поэтому и привязка ЖЕСТКАЯ.
ch := upcase(ch); ch := #0; - Я так полагала, что бы два раза не вводить if ((ch >= 'a') and (ch <= 'z')) or ((ch >= 'A') and (ch <= 'Z')), А ВСЕГО ЛИШЬ if ( (ch >= 'A') and (ch <= 'Z') )
 upcase() -- _встроенная_ системная функа и пренебрегать ей... плохо... -   Я ТАК ЧИТАЛА... ВОТ И ПОДУМАЛА НАПИШУ ЕЕ И  ТОЛЬКО ЗАГЛАВНЫЕ БУКВЫ ПЕРЕЧИСЛЮ, А ТО ЧТО ПРОПИСНЫЕ, ОН ПРЕОБРАЗУЕТ В ЗАГЛАВНЫЕ. ch := #0 _ ЭТО ЧТО БЫ ПРОБЕЛ ТОЖЕ СИМВОЛОМ СЧИТАТЬ.

Добавлено через 4 минуты и 52 секунды:
МОЙ КОД В РЕЗУЛЬТАТЕ ВСЕХ МУЧЕНИЙ:
Код:
Program Latin_letters;
{  Программа,проверяющая, содержит ли файл s латинские буквы}
 var
    f: text;
    x: string;
 ch: char;

                       begin

                assign (f,'C:\SOFT\TUSUR\bin\s.txt');
                reset(f);
               while (ch <> '.') do
               begin
               read(f, ch);
               write(ch);
               if ((ch >= 'a') and (ch <= 'z')) or ((ch >= 'A') and (ch <= 'Z')) then
                              x :=' Вывод: файл s содержит латинские буквы '
                              else x :=' Вывод: файл s   не содержит латинские буквы '
                              end;
                              writeLn(x);

        close(f);

end.

НО ВОТ КАК  "вычислите значение функции check(s)"- НЕ МОГУ ЧЕРЕЗ НЕЕ ВЫРАЗИТЬ СВЯЗЬ ПЕРЕМЕННЫХ. помогите. спс.
« Последнее редактирование: 26-11-2011 14:00 от viwwna » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 26-11-2011 14:23 » 

Я не знаю в чем ты пишешь текст программы, но, пожалуйста, форматируй его
Вот смотри как красивенько и наглядно все получается. И... самое главное... сразу все недочеты лезут в глаза Улыбаюсь
Код: (Pascal)
Program Latin_letters;
{  Программа,проверяющая, содержит ли файл s латинские буквы}
 var
    f: text;
    x: string;
        ch: char;
begin
        assign (f,'C:\SOFT\TUSUR\bin\s.txt');
        reset(f);
        while (ch <> '.') do    begin
                read(f, ch);
                write(ch);
                if ((ch >= 'a') and (ch <= 'z')) or ((ch >= 'A') and (ch <= 'Z'))
                        then x :=' Вывод: файл s содержит латинские буквы '
                        else x :=' Вывод: файл s   не содержит латинские буквы '
        end;
        writeLn(x);
    close(f);

end.
А именно!
1.
   while (ch <> '.') do    begin

А чему у тебя равно ch при входе в цикл?

2. Нужно ли продолжать поиск в файле если уже известно, что файл содержит лат буквы

3. (спорный, но вытекающий из п.2 ) Нужно ли каждый раз сохранять текстовую константу может можно обойтись другим типом переменной идеально подходящей для данного случая

4. Все же настаиваю... Что файл может кончиться раньше, чем была обнаружена точка.


Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Viwwna
Интересующийся

ru
Offline Offline

« Ответ #5 : 26-11-2011 14:45 » 

             
Цитата

while (ch <> '.') do    begin

А чему у тебя равно ch при входе в цикл?

    У меня ch := #0 . Но если это не обозначать. Разве возникает ошибка?

Цитата
2. Нужно ли продолжать поиск в файле если уже известно, что файл содержит лат буквы
  Я ПОЛАГАЮ, ЧТО ИЗ УСЛОВИЙ ЗАДАЧИ, СЛЕДУЕТ, ЧТО  НЕ НАДО, НО ИСПОЛЬЗОВАТЬ ДОСРОЧНОЕ ПРЕРЫВАНИЕ ЦИКЛА "BREAK"  У НАС  СЧИТАЕТСЯ "ПЛОХИМ СТИЛЕМ"

Добавлено через 6 минут и 24 секунды:

Цитата
Нужно ли каждый раз сохранять текстовую константу может можно обойтись другим типом переменной идеально подходящей для данного случая
КАКИМ??? БУЛЕВСКИМ? )))))

Добавлено через 11 минут и 32 секунды:
 У Меня через функцию, как -то коряво получается......



Код: (Pascal)
           Var
  f:Text;
  St:String;
Function Check(S:string):Boolean;
Var
  i:Byte;
Begin
  Check:=False;
  For i:=1 to Length(S) do
  Begin
  If (S[i] in ['a'..'z']) or (S[i] in ['A'..'Z']) then
  Begin
    Check:=True;
    Break
  End;
  End;
End;
Begin
  Assign(f,'C:\SOFT\TUSUR\bin\s.txt');
  Reset(f);
  While Not EOF(F) do
  Begin
    Readln(f,St);
    Writeln(St);
    If Check(St) then  St := ' Файл s содержит латинские буквы. '
                     else St := '  Файл s  не содержит латинских букв. '

  End;
WriteLn(St);

  Close(f);
  Readln
End.
« Последнее редактирование: 26-11-2011 15:03 от viwwna » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 26-11-2011 15:06 » 

Цитата
  У меня ch := #0 . Но если это не обозначать. Разве возникает ошибка?
Если бы видел в коде, то не задавал бы вопросов.

Цитата
  Я ПОЛАГАЮ, ЧТО ИЗ УСЛОВИЙ ЗАДАЧИ, СЛЕДУЕТ, ЧТО  НЕ НАДО, НО ИСПОЛЬЗОВАТЬ ДОСРОЧНОЕ ПРЕРЫВАНИЕ ЦИКЛА "BREAK"  У НАС  СЧИТАЕТСЯ "ПЛОХИМ СТИЛЕМ"
Во-первых не надо на меня кричать. Улыбаюсь Это я  сам умею. Улыбаюсь Улыбаюсь

Я не предлагал применение оператора break.

Вот если бы Вы обратили свое внимание на мною заданный вопрос и не игнорировали бы его.. то, возможно, бы Вы и нашли бы верный ответ выхода из цикла.

А попробуйте совместить в условиях цикла while и анализ на точку и анализ на eof, и... закончить предложение самостоятельно.

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Viwwna
Интересующийся

ru
Offline Offline

« Ответ #7 : 26-11-2011 15:09 » 

Ни в коем случае не кричу))))) вообще тихий голос пожизни))) Caps Lock  включила нечаянно...

Добавлено через 4 минуты и 1 секунду:
While Not EOF(F) do

Я в последнем коде так и написала.
« Последнее редактирование: 26-11-2011 15:13 от viwwna » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 26-11-2011 15:21 » 

Вы, боюсь, меня не поняли...

Я предлагаю выйти иц цикла по ТРЕМ условиям.
У нас это должно получиться.

1. EOF
2. ch ='.'
3. Каким должно быть третье условие?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Viwwna
Интересующийся

ru
Offline Offline

« Ответ #9 : 26-11-2011 15:28 » 

  Здесь была моя ладья... Меня одолевают смутные сомнения

Добавлено через 1 минуту и 1 секунду:
Ладно, буду писать Как знаю. Спасибо за помощь.
« Последнее редактирование: 26-11-2011 15:29 от viwwna » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 26-11-2011 15:33 » 

Э... не уходи...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 26-11-2011 15:37 » 

Прошу прощения.
viwwna, в "неотложке" вы здорово написали код со множеством, это просто готовая функция check();
И один вопрос; а где у вас в текущей программе переменная типа "file of ..."?
Записан

С уважением, Oldy.
Viwwna
Интересующийся

ru
Offline Offline

« Ответ #12 : 26-11-2011 15:38 » 

Я туточки..... ))) буду следующие задачки решать, а то долго сижу на этой.... А ЧТО ТАКОЕ СЛУЧИЛОСЬ?

Добавлено через 6 минут и 54 секунды:
Oldy,  Сказал ПРЕПОДАВАТЕЛЬ  множество не ИСПОЛЬЗОВАТЬ....  А зачем ее описывать, если я ее связываю с переменной f   и даю прямой путь к файлу... Не понял?
« Последнее редактирование: 26-11-2011 15:45 от viwwna » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 26-11-2011 16:03 » 

Цитата
а то долго сижу на этой.
Ну и что?
Наша задача написать правильный код, а не просто сдать.
я верно говорю?

Кроме того. Я стараюсь не привязываться к Паскалю конкретно, а задаю вопросу по по алгоритму Вашей задачи.

Мы сейчас не трогаем функцию, мы сейчас пытаемся ПРАВИЛЬНО выйти из цикла, не используя "запрещенные" операторы.

зы. Вот же блин... Это ж надо так объяснить, что человек сразу сказал - break - плохой стиль. А показать хороший стиль не в досуг..
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Viwwna
Интересующийся

ru
Offline Offline

« Ответ #14 : 26-11-2011 16:38 » 

while и until Не понял

Добавлено через 7 минут и 19 секунд:
Continue ДА И ВСЕ)))) ЛАДНО. У НАС УЖЕ НОЧЬ..... ПОЙДУ я....
« Последнее редактирование: 26-11-2011 16:45 от viwwna » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #15 : 26-11-2011 17:18 » 

Паскаль давно безнадежно забыл Улыбаюсь Поэтому пример кода на С++. Но в принципе идею можно увидеть.
Код: (C++)
void check(const std::string& filename) {
        std::fstream ifs;
        bool flag = false;
        char ch = 0;
        ifs.open(filename, std::fstream::in);
        while(!ifs.eof() && !flag) {
           ifs.get(ch);
           if (((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'))) flag = true;
        }
        if (flag) {
                std::cout << "Файл " << filename << " содержит латинские буквы." << std::endl;
        } else {
                std::cout << "Файл " << filename << "  не содержит латинские буквы." << std::endl;
        }
        ifs.close();
}

Если бы делал бы для себя, то конечно бы сделал бы чуть по другому, но не стал загружать спецификой С++.
ЗЫ. А еше лучше наверно вот так.
Код: (C++)
bool check(const std::string& filename) {
        std::fstream ifs;
        bool flag = false;
        char ch = 0;
        ifs.open(filename, std::fstream::in);
        while(!ifs.eof() && !flag) {
           ifs.get(ch);
           if (((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'))) flag = true;
        }
        ifs.close();
        return flag;
}
« Последнее редактирование: 26-11-2011 17:40 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 26-11-2011 17:29 » 

Finch, еще одно условие выхода из цикла

ch = '.'
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #17 : 26-11-2011 17:38 » 

Забыл Улыбаюсь
Код: (C++)
bool check(const std::string& filename) {
        std::fstream ifs;
        bool flag = false;
        char ch = 0;
        ifs.open(filename, std::fstream::in);
        while(!ifs.eof() && !flag && ch != '.') {
           ifs.get(ch);
           if (((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'))) flag = true;
        }
        ifs.close();
        return flag;
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines