Viwwna
Интересующийся
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
Спокойный
Администратор
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
|
|
« Ответ #2 : 26-11-2011 09:11 » |
|
1. А в каком месте ты вызываешь функцию check? 2. А почему ты читаешь из файла, внимание - это важно, ПОСТРОЧНО? 3. while (ch <> '.') do begin read(f, ch);
В какой-то неожиданный момент наступит EOF (конец файла, а точка не пришла. И... то что сказал Finch
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Viwwna
Интересующийся
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
|
|
« Ответ #4 : 26-11-2011 14:23 » |
|
Я не знаю в чем ты пишешь текст программы, но, пожалуйста, форматируй его Вот смотри как красивенько и наглядно все получается. И... самое главное... сразу все недочеты лезут в глаза 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
Интересующийся
Offline
|
|
« Ответ #5 : 26-11-2011 14:45 » |
|
while (ch <> '.') do begin
А чему у тебя равно ch при входе в цикл?
У меня ch := #0 . Но если это не обозначать. Разве возникает ошибка? 2. Нужно ли продолжать поиск в файле если уже известно, что файл содержит лат буквы Я ПОЛАГАЮ, ЧТО ИЗ УСЛОВИЙ ЗАДАЧИ, СЛЕДУЕТ, ЧТО НЕ НАДО, НО ИСПОЛЬЗОВАТЬ ДОСРОЧНОЕ ПРЕРЫВАНИЕ ЦИКЛА "BREAK" У НАС СЧИТАЕТСЯ "ПЛОХИМ СТИЛЕМ" Добавлено через 6 минут и 24 секунды:Нужно ли каждый раз сохранять текстовую константу может можно обойтись другим типом переменной идеально подходящей для данного случая
КАКИМ??? БУЛЕВСКИМ? ))))) Добавлено через 11 минут и 32 секунды: У Меня через функцию, как -то коряво получается...... 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
|
|
« Ответ #6 : 26-11-2011 15:06 » |
|
У меня ch := #0 . Но если это не обозначать. Разве возникает ошибка?
Если бы видел в коде, то не задавал бы вопросов. Я ПОЛАГАЮ, ЧТО ИЗ УСЛОВИЙ ЗАДАЧИ, СЛЕДУЕТ, ЧТО НЕ НАДО, НО ИСПОЛЬЗОВАТЬ ДОСРОЧНОЕ ПРЕРЫВАНИЕ ЦИКЛА "BREAK" У НАС СЧИТАЕТСЯ "ПЛОХИМ СТИЛЕМ"
Во-первых не надо на меня кричать. Это я сам умею. Я не предлагал применение оператора break. Вот если бы Вы обратили свое внимание на мною заданный вопрос и не игнорировали бы его.. то, возможно, бы Вы и нашли бы верный ответ выхода из цикла. А попробуйте совместить в условиях цикла while и анализ на точку и анализ на eof, и... закончить предложение самостоятельно.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Viwwna
Интересующийся
Offline
|
|
« Ответ #7 : 26-11-2011 15:09 » |
|
Ни в коем случае не кричу))))) вообще тихий голос пожизни))) Caps Lock включила нечаянно...
Добавлено через 4 минуты и 1 секунду: While Not EOF(F) do
Я в последнем коде так и написала.
|
|
« Последнее редактирование: 26-11-2011 15:13 от viwwna »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #8 : 26-11-2011 15:21 » |
|
Вы, боюсь, меня не поняли...
Я предлагаю выйти иц цикла по ТРЕМ условиям. У нас это должно получиться.
1. EOF 2. ch ='.' 3. Каким должно быть третье условие?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|
Sla
|
|
« Ответ #10 : 26-11-2011 15:33 » |
|
Э... не уходи...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Oldy
|
|
« Ответ #11 : 26-11-2011 15:37 » |
|
Прошу прощения. viwwna, в "неотложке" вы здорово написали код со множеством, это просто готовая функция check(); И один вопрос; а где у вас в текущей программе переменная типа "file of ..."?
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
Viwwna
Интересующийся
Offline
|
|
« Ответ #12 : 26-11-2011 15:38 » |
|
Я туточки..... ))) буду следующие задачки решать, а то долго сижу на этой.... А ЧТО ТАКОЕ СЛУЧИЛОСЬ? Добавлено через 6 минут и 54 секунды:Oldy, Сказал ПРЕПОДАВАТЕЛЬ множество не ИСПОЛЬЗОВАТЬ.... А зачем ее описывать, если я ее связываю с переменной f и даю прямой путь к файлу... ?
|
|
« Последнее редактирование: 26-11-2011 15:45 от viwwna »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #13 : 26-11-2011 16:03 » |
|
а то долго сижу на этой. Ну и что? Наша задача написать правильный код, а не просто сдать. я верно говорю? Кроме того. Я стараюсь не привязываться к Паскалю конкретно, а задаю вопросу по по алгоритму Вашей задачи. Мы сейчас не трогаем функцию, мы сейчас пытаемся ПРАВИЛЬНО выйти из цикла, не используя "запрещенные" операторы. зы. Вот же блин... Это ж надо так объяснить, что человек сразу сказал - break - плохой стиль. А показать хороший стиль не в досуг..
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Viwwna
Интересующийся
Offline
|
|
« Ответ #14 : 26-11-2011 16:38 » |
|
while и until Добавлено через 7 минут и 19 секунд:Continue ДА И ВСЕ)))) ЛАДНО. У НАС УЖЕ НОЧЬ..... ПОЙДУ я....
|
|
« Последнее редактирование: 26-11-2011 16:45 от viwwna »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #15 : 26-11-2011 17:18 » |
|
Паскаль давно безнадежно забыл Поэтому пример кода на С++. Но в принципе идею можно увидеть. 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(); } Если бы делал бы для себя, то конечно бы сделал бы чуть по другому, но не стал загружать спецификой С++. ЗЫ. А еше лучше наверно вот так. 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
|
|
« Ответ #16 : 26-11-2011 17:29 » |
|
Finch, еще одно условие выхода из цикла
ch = '.'
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #17 : 26-11-2011 17:38 » |
|
Забыл 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; }
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
|