Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23

Как здесь заменить goto на while?

23.11.2020, 15:12. Показов 2844. Ответов 17

Студворк — интернет-сервис помощи студентам
код не запускается видимо из-за того, что goto запрещено выходить за скобки. но пытаясь заменить его на while я запутался. можете подсказать как это сделать?
PHP
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
$stats = '-1';
//отчистка
$fh = fopen('summ.txt', 'w'); 
fclose($fh);
//вытащить коды
$fh = fopen("kodi-list.txt", "r"); 
$sss = fgets($fh);
$kodi = explode(",", $sss);
fclose ($fh);
//переменые
$max = '40';
$adin = '1';
$tire = '-';
 
a:
//проверка на лимит
$stats = ($stats + $adin);
if($stats == $max)
{
exit;
}
else
{
//конкретный код
$kod = $kodi[$stats];
//поиск кода в файле
$arr = file('c000.txt');
foreach( $arr as $k=>$v )
{
    if (strpos($v, $kod,0) !==false )
    {
//ЕСЛИ НАШОЛ КОД
$nomer = $k;
$data = $v; 
    
    
b:  
//разделяем на до i после
$razd = explode("і", $data); 
$str = $razd[1];
// заменяет - на 0    
$data0 = str_replace($tire, "0", $str);
// проверяем наличие здесь цифры
preg_match("/[\d]+/", $data0, $match);
if($match[0] === NULL)
{
//если нет цифр перейти проверить следующую строку
$nomer = ($nomer + $adin); 
$data = $arr[$nomer];
 
goto b;
}
else
    {   
//если есть цифры
//убрать лишние пробелы
$str = preg_replace('/\s\s+/', ' ', $str);
//разделяем цифры по массиву
$num = explode(" ", $str); 
//сложение
$summ = $num[1]+$num[7]+$num[8]+$num[9];
//записать сумму
$fh=fopen ("summ.txt", "a+"); 
fwrite($fh,"$summ\n"); 
fclose ($fh); 
//перейти к след. коду
    
goto a; 
        }
    }
else
        {
//если код не найден 
//перейти к след. коду
    
goto a;
        }
    }
}
 
?>
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2020, 15:12
Ответы с готовыми решениями:

Как заменить goto циклом for?
Вот код: int main() { setlocale(LC_ALL, &quot;rus&quot;); srand(time(NULL)); cout &lt;&lt; &quot;Для запуска игры нажимайте a \n&quot;; start: ...

Можно ли здесь заменить while на for? Если да, то как?
Можно ли здесь заменить while на for? Если да, то как? char text; cin.getline(text,100);//ввожу строку int n; cin &gt;&gt;...

Чем заменить goto?
Привет. Пользуюсь goto уже давно, но преподу это не понравилось, чем его можно заменять? int main() { B: A: ...

17
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
23.11.2020, 15:26
Цитата Сообщение от авч Посмотреть сообщение
код не запускается видимо из-за того
Интерпретатор php способен выдать сообщение об ошибке, так что гадать не нужно.

PS. пытаться понять что делает чужой нерабочий неотформатированный код с goto не самое приятное занятие
0
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23
23.11.2020, 18:17  [ТС]
код то рабочий, если закомментировать все goto и его ссылки ( a: и b: ). они можно сказать стоят там для наглядности, чтобы указать места для повторений кода при условии (while или do-while). Не обязательно понимать работу всего кода, нужно лишь goto и их сылки обернуть в while или нечто подобное
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
23.11.2020, 18:35
авч,
PHP
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
27
28
29
30
31
32
33
34
<?php
 
$fh = fopen("kodi-list.txt", "r");
$kodi = explode(",", fgets($fh));
fclose ($fh);
 
 
$arr = file('c000.txt');
 
$sumFn = fopen('summ.txt', 'w');
 
foreach ($kodi as $kod) {
    foreach ($arr as $nomer => $data) {
 
        if (strpos($data, $kod,0) === false) {
            continue;
        }
 
        $razd = explode("і", $data);
        $str = $razd[1];
        $data0 = str_replace('-', "0", $str);
 
        if (preg_match("/[\d]+/", $data0)) {
 
            $str = preg_replace('/\s\s+/', ' ', $str);
            $num = explode(" ", $str);
            $summ = $num[1] + $num[7] + $num[8] + $num[9];
 
            fwrite($sumFn, $summ . PHP_EOL);
        }
    }
}
 
fclose($fh);
Добавлено через 4 минуты
авч, Код можно и не понимать, но при попытке рефакторинга в некоторых местах получался абсурд, поэтому на ходу додумывал, что вы пытались сделать.
0
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23
23.11.2020, 19:28  [ТС]
У меня есть тхт файл (c000.txt), в котором нужно найти строки в которых есть определенные коды. Все коды перечислены через запятую в (kodi-list.txt). После того как строка найдена необходимо её обработать: выбросить лишнее, то есть то что до буквы (i), затем заменить все тире (-) если они там есть на ноль (0). После чего можно произвести проверку на наличие чисел в строке, и если их нет то спуститься на строку ниже и повторять обработку строки до тех пор, пока не найдется строка с числами. Когда она найдется нужно оставить по одному пробелу между цифрами для удачного выделения чисел в массив, с которым уже можно работать складывая нужные числа и записывая в файл.

Также нужно выполнить поиск всех кодов по очереди, записанных в файле (kodi-list.txt) их там 40шт. Для этого я создал переменную $stats, которая с каждым новым кодом прибавляла к себе 1, для того чтобы указать когда нужно скрипту остановиться. И одновременно являясь номером кода в массиве, например $kod = $kodi[$stats]; . А также нужно было учесть, что php считает с 0, а не с 1, так что нужно было выдать изначально значение для stats минус один.

Вот так вот, если коротко
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
23.11.2020, 19:39
Цитата Сообщение от авч Посмотреть сообщение
код не запускается
Цитата Сообщение от авч Посмотреть сообщение
код то рабочий
Код Шрёдингера?
0
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23
23.11.2020, 19:41  [ТС]
Забыл добавить еще, в случае если код не найден нужно было перейти к следующему коду и вставить заглушку вместо суммы (какой-нибудь символ).
PHP/HTML
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
$stats = '-1';
//отчистка
$fh = fopen('summ.txt', 'w');
fclose($fh);
//вытащить коды
$fh = fopen("kodi-list.txt", "r");
$sss = fgets($fh);
$kodi = explode(",", $sss);
fclose($fh);
//переменые
$max = '40';
$adin = '1';
$tire = '-';
a:
    //проверка на лимит
    $stats = ($stats + $adin);
    if ($stats == $max) {
        exit;
    } else {
        //конкретный код
        $kod = $kodi[$stats];
        //поиск кода в файле
        $arr = file('c000.txt');
        foreach ($arr as $k => $v) {
            if (strpos($v, $kod, 0) !== false) {
                //ЕСЛИ НАШОЛ КОД
                $nomer = $k;
                $data = $v;
                b:
                    //разделяем на до i после
                    $razd = explode("і", $data);
                    $str = $razd[1];
                    // заменяет - на 0
                    $data0 = str_replace($tire, "0", $str);
                    // проверяем наличие здесь цифры
                    preg_match("/[\d]+/", $data0, $match);
                    if ($match[0] === NULL) {
                        //если нет цифр перейти проверить следующую строку
                        $nomer = ($nomer + $adin);
                        $data = $arr[$nomer];
                        gotob;
                    } else {
                        //если есть цифры
                        //убрать лишние пробелы
                        $str = preg_replace('/\s\s+/', ' ', $str);
                        //разделяем цифры по массиву
                        $num = explode(" ", $str);
                        //сложение
                        $summ = $num[1] + $num[7] + $num[8] + $num[9];
                        //записать сумму
                        $fh = fopen("summ.txt", "a+");
                        fwrite($fh, "$summ\n");
                        fclose($fh);
                        //перейти к след. коду
                        gotoa;
                    }
                } else {
                    //если код не найден
                    //перейти к след. коду
                    gotoa;
                }
            }
        }
?>
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
23.11.2020, 19:45
Цитата Сообщение от авч Посмотреть сообщение
Также нужно выполнить поиск всех кодов по очереди, записанных в файле (kodi-list.txt) их там 40шт.
В этих стройках вы уже получаете массив кодов

PHP
1
2
3
$fh = fopen("kodi-list.txt", "r");
$kodi = explode(",", fgets($fh));
fclose ($fh);
Поэтому достаточно сделать его обход через foreach. Переменная $stats не нужна.

Тут вы получаете массив строк из файла
PHP
1
$arr = file('c000.txt');
Получается можно просто сделать двойной цикл.

Цитата Сообщение от авч Посмотреть сообщение
затем заменить все тире (-) если они там есть на ноль (0). После чего можно произвести проверку на наличие чисел в строке
0 - это же число, получается, после замены - на ноль, в строке будет число (0). Если вы ищете кроме цифр еще и тире, то не нужно делать лишних действий - это сбивает с толку, можно просто искать на число и тире

PHP
1
2
3
4
5
6
$razd = explode("і", $data);
$str = $razd[1];
 
if (preg_match("/[\d-]+/", $str)) {
    //...
}
1
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23
23.11.2020, 20:16  [ТС]
Всё еще думаю, почему при выполнении вашего кода summ.txt пустой... даже после исправления line 34
А тире нужно заменять, потому что потом нужно складывать и записывать как числа. А в с000 просто нули так записаны
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
23.11.2020, 20:27
Цитата Сообщение от авч Посмотреть сообщение
Всё еще думаю, почему при выполнении вашего кода summ.txt пустой...
Нужно дебажить. Возможно до записи в файл дело не доходит. Если скинете файлы, то смогу протестить.
Цитата Сообщение от авч Посмотреть сообщение
А тире нужно заменять, потому что потом нужно складывать и записывать как числа. А в с000 просто нули так записаны
Я только отрефакторил код, логику не менял. У вас переменная $data0 больше нигде не используется, кроме как в условии preg_match.

Тогда уже так
PHP
1
$str = str_replace('-', "0", $str);
0
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23
23.11.2020, 21:17  [ТС]
https://www.cyberforum.ru/atta... 1606155427
Вложения
Тип файла: rar l.rar (61.4 Кб, 21 просмотров)
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
23.11.2020, 21:51
авч, Проследите, чтоб у вас был включен вывод ошибок. Потому что у меня вылетело куча warning-ов. Из-за того, что файлы называются не так, как в коде.
1
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23
24.11.2020, 12:36  [ТС]
sad67man, Благодарю за подсказки, в общем после небольших изменений скрипт начал работать. Но в случае если кода не находит он просто переходит к следующему, не вставляя заглушку и в summ.txt выходит меньше строк. Но это наверное мелочи
PHP
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
 ini_set('error_reporting', E_ALL);
 ini_set('display_errors', 1);
 ini_set('display_startup_errors', 1);
$fh = fopen("kodi-list.txt", "r");
$kodi = explode(",", fgets($fh));
fclose ($fh);
 
$adin = '1';
$arr = file('c000.txt');
 
 
 
foreach ($kodi as $kod) {
    foreach ($arr as $nomer => $data) {
        
        if (strpos($data, $kod,0) === false) 
        {
            continue;
        }
        x:
        $razd = explode("i", $data);
        $str = $razd[1];
        $str = str_replace('-', "0", $str);
 
        if (preg_match("/[\d]+/", $str)) {
 
            $str = preg_replace('/\s\s+/', ' ', $str);
            $num = explode(" ", $str);
            $summ = $num[1] + $num[7] + $num[8] + $num[9];
            $sumFn = fopen('summ.txt', 'a+');
            fwrite($sumFn, "$summ \n");
            fclose($sumFn);
        }
        else
        {
            $nomer = ($nomer + $adin);
            $data = $arr[$nomer];           
            goto x;
                        
        }
    }
}
 
?>
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
24.11.2020, 13:59
авч, goto использовать крайне не рекомендуется. Вы должны забыть про эту конструкцию - это пережитки прошлого. У вас был вопрос, как от них избавиться. Однако вы все равно ее впихнули)

Вы и так находитесь в цикле перебора массива строк файла. Зачем вы на else добавили получение следующего элемента? когда и так он будет в следующей итерации. Более того - таким образом вы пропускаете проверку на вхождение кода в строку.

Добавлено через 9 минут
Цитата Сообщение от авч Посмотреть сообщение
Но в случае если кода не находит он просто переходит к следующему, не вставляя заглушку и в summ.txt выходит меньше строк.
Значит нужно вынести запись в файл во внешний цикл.

PHP
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
foreach ($kodi as $kod) {
 
    $summ = 0;
 
    foreach ($arr as $data) {
 
        if (strpos($data, $kod,0) === false) {
            continue;
        }
 
        $razd = explode("i", $data);
        $str = $razd[1];
        $str = str_replace('-', "0", $str);
 
        if (preg_match("/[\d]+/", $str)) {
 
            $str = preg_replace('/\s\s+/', ' ', $str);
            $num = explode(" ", $str);
            $summ = $num[1] + $num[7] + $num[8] + $num[9];
        }
    }
 
    $sumFn = fopen('summ.txt', 'a+');
    fwrite($sumFn, $summ . PHP_EOL);
    fclose($sumFn);
}
0
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23
24.11.2020, 14:36  [ТС]
sad67man, Да, я специально пропускаю проверку на вхождение кода в строку, поскольку цифры не всегда в той же строке, что и код а бывают и ниже. Так что ему надо спускаться от найденного места до тех пор, пока не найдет там цифр.
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
24.11.2020, 15:25
Лучший ответ Сообщение было отмечено авч как решение

Решение

авч, Можно добавить флаг - найден ли код в предыдущих строках.
PHP
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
27
28
29
30
31
foreach ($kodi as $kod) {
 
    $summ = 0;
    $isFind = false;
 
    foreach ($arr as $data) {
 
        if (!$isFind && strpos($data, $kod) === false) {
            continue;
        }
 
        $isFind = true;
 
        $razd = explode("і", $data);
        $str = $razd[1] ?? '';
        $str = str_replace('-', "0", $str);
 
        if (preg_match("/[\d]+/", $str)) {
 
            $str = preg_replace('/\s\s+/', ' ', $str);
            $num = explode(" ", $str);
            $summ = $num[1] + $num[7] + $num[8] + $num[9];
 
            $isFind = false;
        }
    }
 
    $sumFn = fopen('summ.txt', 'a+');
    fwrite($sumFn, $summ . PHP_EOL);
    fclose($sumFn);
}
1
24.11.2020, 16:29

Не по теме:

83 строки протухшего кода(извините, в прошлом веке это считалось программой на php), вызвало целое обсуждение аж на сутки. переписать код в соответствии с элементарными PSR заняло бы минут 30. но зачем..

0
1 / 1 / 1
Регистрация: 15.10.2016
Сообщений: 23
24.11.2020, 18:53  [ТС]
sad67man, странно, но после того как вынес запись в файл за скобки и добавил заглушку $summ стало ругаться на эту строку $str = $razd[1]; . Причем здесь это, если до этого все работало прекрасно - не понятно. (выдаёт Notice: Undefined offset: 1). А ещё если сохранить в файл значения $data[4] то он будет записывать то пустые строки, то тире (-). Неужели $data это массив из одной строки? Может это и причина ругани на $razd, explode же не может наверное нормально сработать если $data это по символьный массив строки?

Добавлено через 1 час 51 минуту
А нет, это я сглупил всё работает, дело было в кодировке поэтому $razd разделять не мог
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2020, 18:53
Помогаю со студенческими работами здесь

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

Заменить goto на цикл
Помогите пожалуйста заменить goto на цикл (скорее всего это цикл while или while do) Я написал крестики нолики и меня попросили заменить...

Goto заменить на цикл
замените пожалуйста goto на цикл program dihotomia; Label 1,2; var a,b,e,d,C,x1,x2,xmin,fmin: real; function f(x:real):...

О том, почему нелюбим goto; как его правильно использовать; и чем в моем случае его можно заменить?
Вот есть такой оператор всеми программистами нелюбимый. Goto называется. Говорят, что его использование всегда можно обойти и...

Здесь есть какие нибудь ошибки ? и как здесь получается в ответе 6.25?
program r2; var b:real; begin b:=100; repeat b:=b/2; until b&lt;10; writeln (b:0:2); end. Здесь есть какие нибудь ошибки ?...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru