Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Exec11
0 / 0 / 1
Регистрация: 25.12.2012
Сообщений: 32
1

Как избежать использование оператора goto

05.02.2015, 14:55. Просмотров 1083. Ответов 11
Метки нет (Все метки)

во всех книжках по си пишут, что лучше метки и goto не использовать. типа плохой тон. и так все прекрасно пишется без переходов.
и вот как назло подвернулся пример:


____while ( читаю файл пока он не закончится)
|
| if ( ищу строку) { если нашел goto m1;}
|
|
|___
записываю в файл не найденную строку

m1: продолжается выполнение программы



вопрос, как тут избежать использование оператора goto ?

спасибо!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2015, 14:55
Ответы с готовыми решениями:

Как избежать использования оператора goto?
typedef struct BOOK { char *name; } book; int main() { FILE...

Верно ли утверждение: « действие оператора continue; в приведенных ниже примерах эквивалентно действию оператора goto next; ».
Помогите пожалуйста ответить на вопрос,если можно с примером;Верно ли...

Необходимо избавиться от оператора goto
#include <CONIO.H> #include <STDIO.H> #include <CTYPE.H> #define STARTX ...

Перезапуск программы без оператора GOTO
Пусть имеется данный код: #include <stdio.h> int main(){ a: ; int...

Использование вложенного тернарного оператора для вычисления выражения
Задание на C: Используя тернарную операцию выражение1 ? выражение2 : выражение3...

11
ValeryS
Модератор
7444 / 5636 / 716
Регистрация: 14.02.2011
Сообщений: 19,189
Завершенные тесты: 1
05.02.2015, 15:03 2
а куда файл читается?
потом как ты читаешь файл и одновременно ищешь строку?
но твой код пишется так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
while(/*читаем файл*/)
{
 
if(/* какое то условие*/)
 { 
  //выставляем какой нибудь флаг
 break; /*если условие истинно выходим из цикла*/
 }
}
if(если флаг не выставлен)
  // код если кончился цикл и условие не сработало
 
// вот сюда попадем если сработает условие
0
HighPredator
5692 / 2011 / 723
Регистрация: 10.12.2010
Сообщений: 5,778
Записей в блоге: 3
05.02.2015, 15:05 3
Цитата Сообщение от Exec11 Посмотреть сообщение
как тут избежать использование оператора goto ?
Вообще надо изменить архитектуру всей функции. В качестве хотфикса можно скорее всего сделать так:

____while ( читаю файл пока он не закончится)
|
| if ( ищу строку) { флаг присвоить истина; прервать цикл}
|
|
|___
если флаг не истина ->записываю в файл не найденную строку

продолжается выполнение программы
0
Exec11
0 / 0 / 1
Регистрация: 25.12.2012
Сообщений: 32
05.02.2015, 15:24  [ТС] 4
то есть добавлять флаг?
хм..
инициализировать, сбрасывать, устанавливать, проверять, сбрасывать.
мда... не самый простой вариант, против пару меток и гоуто....

а куда файл читается? потом как ты читаешь файл и одновременно ищешь строку?
в память, есть некая структура, по ней читается, и с отдельным элементом сравнивает, ну то есть поиск. если не находим, то дописываем структуру.
0
ValeryS
Модератор
7444 / 5636 / 716
Регистрация: 14.02.2011
Сообщений: 19,189
Завершенные тесты: 1
05.02.2015, 15:35 5
Цитата Сообщение от Exec11 Посмотреть сообщение
да... не самый простой вариант, против пару меток и гоуто....
можешь использовать что угодно и как угодно
только потом ни обижайся что программу будет трудно сопровождать, что при малейшем изменении ТЗ придется переписывать все, и падать будет неизвестно почему
зря что ли
Цитата Сообщение от Exec11 Посмотреть сообщение
что лучше метки и goto не использовать.
думаешь невзлюбили и все
Гото нарушает принцип модульности "один вход один выход"
Гото это программирование типа "спагетти", где все перекручено так что сам черт не разберется
и префразируюя знаменитую поговорку "Что дозволено ассемблеру, не дозволено языкам высокого уровня"
Цитата Сообщение от Exec11 Посмотреть сообщение
в память, есть некая структура, по ней читается, и с отдельным элементом сравнивает, ну то есть поиск.
И что
нормальное ТЗ можешь представить, а на такие вопросы и будешь получать абстрактные ответы как убрать гото
может тебе вообще отдельную функцию поиска нужно?
0
Exec11
0 / 0 / 1
Регистрация: 25.12.2012
Сообщений: 32
05.02.2015, 16:25  [ТС] 6
"нормальное ТЗ можешь представить"
так вроде все написал.... если что не понятно спрашивайте уточнения. вопрос был по логике. мясо то я и сам навешать могу.
ответ вроде я тоже получил:
Что дозволено ассемблеру, не дозволено языкам высокого уровня
попробую еще раз словами по подробней:
функция получает массив и длину массива на вход.
в массиве строка, которую пробуем найти в файле, если не находим то дописываем.
чтение и запись в файл ведутся форматировано, через структуру данных, одним из элементов этой структуры является строка которая представлена в виде массива. ну как то так.

что ожидал услышать:
вот человек, типы зачем изобретать велосипед, уже все есть, туда брейк, туда контине, и забудь ты про этот гоуто! смотри как красиво!

Добавлено через 10 минут
могу логику свою рассказать:
надо читать файл до конца. логично использовать while при достижении конца выходить из цикла.
for не удобен, незнаем сколько строк. goto - забыли. по сути и все.
так же while удобен тем что дает два состояния, само чтение файла, и выход из цикла если файл прочитан до конца.
если дочитали до конца и вышли, значит не нашли, тогда надо записать. все логично.

непонятно что делать с выходом если нашли. если нашли то надо перепрыгнуть через запись и все. идем дальше.
вот в этом загвоздка, как красиво перепрыгнуть через запись, без нагромождения с флагами?
0
Байт
Эксперт C
20034 / 12656 / 2662
Регистрация: 24.12.2010
Сообщений: 26,341
05.02.2015, 16:54 7
____while ( читаю файл пока он не закончится) {
|
| if ( ищу строку) break;
|___
записываю в файл не найденную строку
}
продолжается выполнение программы

Добавлено через 2 минуты
Извиняюсь, чушь написал. Не до конца вник в условие

Добавлено через 1 минуту
Вот так кажись, получше будет
____while ( читаю файл пока он не закончится)
|
| if ( ищу строку) break;
|___
if (файл кончился) записываю в файл не найденную строку
продолжается выполнение программы

Добавлено через 1 минуту
Цитата Сообщение от Exec11 Посмотреть сообщение
инициализировать, сбрасывать, устанавливать, проверять, сбрасывать.
ТОже флагов не люблю...
1
Exec11
0 / 0 / 1
Регистрация: 25.12.2012
Сообщений: 32
05.02.2015, 17:02  [ТС] 8
Код
while(fread(&struct0, sizeof(struct str_name), 1, fp))
как то так у меня читается

if (файл кончился)
как определить, что файл кончился в условии if ?
0
zer0mail
2458 / 2094 / 217
Регистрация: 03.07.2012
Сообщений: 7,588
Записей в блоге: 1
05.02.2015, 17:10 9
Не надо путать запрет и рекомендации . Засорять программу goto не стоит, а для выхода из глубоковложенного цикла он вполне подходит (но такая потребность возникает не часто).
Хотя даже для этого случая некоторые ярые противники используют флажки и проверки.
0
ValeryS
Модератор
7444 / 5636 / 716
Регистрация: 14.02.2011
Сообщений: 19,189
Завершенные тесты: 1
05.02.2015, 17:10 10
Цитата Сообщение от Exec11 Посмотреть сообщение
могу логику свою рассказать:
надо читать файл до конца. логично использовать while при достижении конца выходить из цикла.
вот вот
одна сущность
а запись при определенных условиях это совершенно другая
значит проще и идеологически правильней создать две функции, потом засунуть в третью
например так
пишу на псевдокоде
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
BOOL FindOfFile(FILE Fl // хандлер файла
,data dat // данные которые нужно сравнить
)
{
data tmp; // временное хранилище для считанных данных 
while(ReadFile(Fl,tmp)// читаем
{
 if(tmp==dat) // если данные совпадают
  return TRUE; // значит нашлись больше ловить нечего, выходим
 
}
return FALSE; // нет выходим
} 
BOOL SaveFile(FILE *Fl, // это функция записи данных в файл
,data dat)
{
.................................
}
 
void Func(data dat)// функция которая будет делать нужный функционал
{
  FIILE fl=OpenFile();// открыли файл
 if(!FindOfFile(fl,dat))// если нужных данных нет
  SaveFile(fl,dat);  // то записываем в файл
CloseFile(fl); // закрыли файл
}
По моему, так гораздо понятней и красивше
0
Байт
Эксперт C
20034 / 12656 / 2662
Регистрация: 24.12.2010
Сообщений: 26,341
05.02.2015, 17:12 11
Лучший ответ Сообщение было отмечено Exec11 как решение

Решение

Цитата Сообщение от Exec11 Посмотреть сообщение
как определить, что файл кончился в условии if ?
C
1
if (feof(fp))...
1
Exec11
0 / 0 / 1
Регистрация: 25.12.2012
Сообщений: 32
05.02.2015, 17:20  [ТС] 12
if (feof(fp))...
вот оно!
шпенкс!
художник!
0
05.02.2015, 17:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2015, 17:20

Как избежать зацикливания программы?
Подскажите пожалуйста, как избежать зацикливания программы про вводе буквы вот...

Как избежать ввода недопустимых символов?
Написал тут функцию. При вводе целых чисел все нормально работает. Если...

Нужно убрать "goto", как это сделать?
#include <graphics.h> #include <stdlib.h> #include <time.h> int main() {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru