Как можно изменить этот код чтобы был вывод finished

Contribute to NineStems/junior-backend-developer-topics-and-questions development by creating an account on GitHub.

Вопросы по языку Golang

Больше вопросов

Что из себя представляет тип данных string в языке Golang?
последовательность(массив байт) из одного или нескольких символов (буквы, числа, символы), которая может представлять собой константу или переменную. В зависимости от кодировки символ может занимать один или более байт.

Можно ли изменить определенный символ в строке?
Строки составляются из символов Unicode и являются неизменяемыми последовательностями, т. е. порядок этой последовательности нельзя изменить. В зависимости от кодировки.

Что происходит при склеивании строк?
Выделение памяти на новую переменную, т.е. создание новой строки.

Вытекающий вопрос — как эффективно склеивать множество строк?
С помощью нескольких вариантов strings.builder / bytes.buffer / fmt.fprintf / strconv.appendint

Как хранятся переменные в Golang?
Переменная представляет именованный участок в памяти, который может хранить некоторое значение

Как устроен пустой интерфейс?
Пустой интерфейс может содержать значения любого типа. (Каждый тип реализует как минимум нулевые методы.)
Пустые интерфейсы используются кодом, обрабатывающим значения неизвестного типа. Например, fmt.Print принимает любое количество аргументов типа interface{}.
Есть как плюсы, так и минусы использования.

todo Как устроен слайс и чем он отличается от массива?
Слайс — гибкое отображение элементов массива с возможностью динамического изменения размера.
Слайс в отличии от массима — динамическая структура.

Нужно ли передавать slice по ссылке в фукнцию?
Слайс — ссылочная структура, если не изменяется cap слайса, то любые изменения будут отражены вне области изменения, иначе новые добавленные элементы, свыше изначального cap не будут видны вне области их добавления. Это происходит потому что при расширении cap меняется ссылка на область памяти, куда смотрит слайс.

todo Расскажите про планировщик golang
Планировщик эффективно использует потоки системы. На каждый поток есть N горутин, активация которых происходит из пула очередей. Контекст, связанный с потоком выбирает горутину, которую сделать активной. В случае если в пуле нет горутин, выполняется механизм «кражи», который забирает горутину у соседнего потока или из «неотсортированного» пула, куда попали горутины, что ранее вышли из зоны ответственности гошного планировщика, но позже вернулись обратно.

В чем различия goroutine от потока системы?
это легкий поток, управляемый средой выполнения Go. В каждом потоке системы может быть N горутин. Изначально стек горутина занимает 2kb и может как увеличиваться, так и уменьшаться.

Как огранить число потоков на системы при запуске Golang программы и возможно ли огранить их до 1 потока?
С помощью установки значения переменной gomaxproc

todo Что такое каналы и каких видов они бывают?
Это типизированные области памяти, по которым вы можете посылать и получать значения. Они бывают двух видов — буферизованные(блокировка не происходит пока не забьётся буфер) и небуферизованные(отправление и получение блокируются до тех пор, пока другая сторона не готова).

todo Что будет если писать в закрытый канал?
Программа пробросит панику

todo Что будет если писать в неинициализированный канал?
Произойдёт взаимная блокировка (deadlock)

Как в golang освобождается память и можно ли отключить это поведение и зачем это делать?
Есть GC, автоматическую очистку можно отключить и вызывать очистку вручную. Для более точного управления ресурсами приложения.

Что будет происходить при конкурентной записи в map?
Ситуация гонки/паника

Как можно решить эту проблему?
Конкурентность/параллелизм
С помощью синхронизации доступа к объекту

Нужно ли блокировать структуру мьютексом, если идет конкурентная запись в разные поля структуры?
Если есть гарантия, что в одно поле структуры одновременно записывает данные не более одного процесса

Что такое lock-free структуры
Если есть гарантия, что в одно поле структуры одновременно записывает данные не более одного процесса

Что выведет код?

func main() {
  runtime.GOMAXPROCS(1)  
  done := false  
  go func() {  
     done = true  
  }()  
  for !done {  
  }  
  fmt.Println("finished")  
}  

Как можно изменить этот код, чтобы был вывод “finished”?
Можно, например, усыпить главную рутину, чтобы активировалась та, что должна была сменить значение параметра done и тем самым отобразит в консоли finished

Какая есть проблема в коде?
Как её можно решить?

var counter int
for i := 0; i < 1000; i++ {
   go func() {
      counter++
   }()
}

С помощью пакета sync (mutex/waitgroup)
А как её можно бы было решить, если бы в языке не было пакета sync? С помощью каналов или атомарного счётчика (который сейчас содержится в пакете sync)

Можно ли реализовать sync.Mutex и sync.WaitGroup на каналах? Как?
Да, можно, с помощью пакета sync (mutex/waitgroup)

package main
import (
	"fmt"
	"time"
)

func main() {
	c := make(chan bool)
	m := make(map[int]int)
	for i := 0; i < 10; i++ {
		go changeMap(c, i, m)
	}
	c <- true
	time.Sleep(2* time.Second)
	fmt.Println("map value", m)
}

func changeMap(n chan bool, i int, m map[int]int) {
	_ = <-n
	fmt.Printf("inside changeMap where i=%d n", i)
	m[i] = i
	n <- true
}

todo Что ты использовал из пакета sync(кроме Mutex и WaitGroup)?
Атомарный счётчик
todo — Добавить, что там еще есть

Что выведет код?

func main() {
v := 5
p := &v
println(*p)
changePointer(p)
println(*p)
}
func changePointer(p *int) {
v := 3
p = &v
}  

Почему? Как нужно изменить функцию changePointer, чтобы вывело 5 и 3 (в оригинальной версии выводится 5 и 5)?

Потому что мы в другой области видимости создаём переменную и подменяем не значение, а ссылку, что хранится в p, когда же функция отрабатывает в основной области видимости переменная хранит старую ссылку

За сколько примерно выполнится приложение — за 3 секунды или за 6?

func worker() chan int {
ch := make(chan int)
go func() {
time.Sleep(3 * time.Second)
ch <- 42
}()
return ch
}
func main() {
timeStart := time.Now()
_, _ = <-worker(), <-worker()
println(int(time.Since(timeStart).Seconds())) // что выведет - 3 или 6?
}

Что нужно изменить, чтобы код работал за 3 секунды? Добавить инициализацию воркеров, а потом ждать ответов из них

Расскажите о ООП в Golang
todo

Как работает сборщик мусора в Golang?
Очистка областей памяти, на которые ссылались переменные, что больше не используются

Что произойдёт при выполнении данного кода?

package main

import (
	"fmt"
)

type Test struct {
	Name string
}

func main() { 
	mapCampaigns := make(map[string]*Test)
	name := mapCampaigns[""].Name
	fmt.Println(name)
}

Что нужно сделать, чтобы избежать паники? Получать два параметра при получении значении из мапы и явно обрабатывать ключ существования элемента

todo У вас есть метод square объявленный у структуры по указателю, он берет поле структуры i и возвращает его квадрат.
Имеет ли смысл объявить этот метод от значения?
В каких случаях у нас будет работать только один метод?

todo

Какая из записей будет требовать дополнительных действий по инициализации и почему

var a []int64  
var b map[int64]string  
c := []int64{}  
d := make(map[int64]string)

Для переменной b необходимо провести инициализацию, потому что значением не инициализированной карты — nil, но в отличии от функции append для слайса, в которой под капотом происходит инициализация, для мапы такого механизма нет

Что вы можете сказать о данном коде? Что произойдет при вызове данных методов? Поясните свою точку зрения

package a
func A1() int {return b.B() + 3}  
func A2() int {return 2}  

package b
func B() int {return a.A2() * 2}  

Код не будет скомпилирован, так как тут есть цикличная зависимость

komunisten

0 / 0 / 0

Регистрация: 10.09.2010

Сообщений: 10

1

Изменить код, чтобы он выводил результаты через потоковый вводвывод

29.09.2010, 13:58. Показов 2305. Ответов 25

Метки нет (Все метки)


C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <ctype.h>
 
void main()
{ 
    char ch = 0;
    while((ch = getc(stdin)) != EOF) {
        printf("%c | %.4x | %.4on", toupper(ch), (char)ch, (char)ch);
        fflush(stdin);
    }
}

программа печатает все вводимые символы в верхнем регистре, в строку выводится символ шестнадцатиричный и восьмеричный код
как можно изменить чтобы он выводил результаты через потоковый вводвывод cin cout, используя hex dec

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

29.09.2010, 13:58

Ответы с готовыми решениями:

Изменить код так, чтобы осуществлять ввод/вывод данных с использованием текстовых файлов
Program Pr_1_4_2;
Var
x:arrayof real;
i,n,k:integer;
sum,sr:real;
Begin
k:=0;
sum:=0;…

Матрицы: переделать код, чтобы он работал через три функции — ввод, вычисление и вывод
Здравствуйте, прошу помочь с изменением кода на языке си. Нужно переделать код, так, чтобы он…

потоковый ввод — вывод
всем доброго времени суток. мне вот недавно задали написать программу которая реализует несколько…

Потоковый ввод/вывод
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;

using namespace std;

int main(int argc, char* argv)…

25

PointsEqual

ниначмуроФ

851 / 535 / 110

Регистрация: 12.10.2009

Сообщений: 1,913

29.09.2010, 14:19

2

примерно так

C++
1
 cout.setf(ios::hex | ios::uppercase);



0



komunisten

0 / 0 / 0

Регистрация: 10.09.2010

Сообщений: 10

29.09.2010, 14:24

 [ТС]

3

Цитата
Сообщение от PointsEqual
Посмотреть сообщение

примерно так

C++
1
 cout.setf(ios::hex | ios::uppercase);

я просто тока на 2 курсе мы еще такое не проходили
а можно ее переделать в что то вроде этого:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream.h>
#include <iomanip>
void main()
{
    int j=1;
        for (int i='A';i<='Z';i++)
        {
          cout << dec << j <<'t' << (char)i << 't';
          cout << hex << i << 't';
          cout << oct << i << 'n';
          j++;
        }
}

на текст проги не обращай внимания это другая задача



0



gooseim

Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

29.09.2010, 17:23

4

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <iomanip>
void main()
{
        using namespace std;
        int j=1;
        for (int i='A';i<='Z';i++)
                {
          cout << dec << j <<'t' << (char)i << 't';
          cout << hex << i << 't';
          cout << oct << i << 'n';
                  j++;
        }
}



0



Gerrard

13 / 13 / 0

Регистрация: 15.01.2010

Сообщений: 144

29.09.2010, 17:27

5

gooseim,

C++
1
using namespace std;

не должно быть после подколюченых библиотек, типа

C++
1
2
3
#include <iostream>
#include <iomanip>
using namespace std;



0



gooseim

Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

29.09.2010, 17:29

6

Для твоей задачи:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <iomanip>
 
void main()
{ 
    using namespace std;
    char ch = 0;
    while(!cin.eof()) {
        ch=cin.get();
        cout<<toupper(ch)<<" | "<<hex<<ch<<" | "<<oct<<ch;
    }
}

Добавлено через 1 минуту

Цитата
Сообщение от Gerrard
Посмотреть сообщение

gooseim,

C++
1
using namespace std;

не должно быть после подколюченых библиотек, типа

C++
1
2
3
#include <iostream>
#include <iomanip>
using namespace std;

Это как? Нельзя поподробнее на этом месте.



0



Freelance

Эксперт С++

2887 / 1822 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

29.09.2010, 17:54

7

using namespace std; должно быть в глобальном виде.



0



Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

29.09.2010, 18:22

8

Товарищи!
using namesape std в глобальном виде вообще не рекомендуется использовать. А внутри функции как раз его использование оправдано. Почитайте литературу, прежде чем утверждать такие вещи.



0



Freelance

Эксперт С++

2887 / 1822 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

29.09.2010, 18:25

9

Цитата
Сообщение от gooseim
Посмотреть сообщение

Товарищи!
using namesape std в глобальном виде вообще не рекомендуется использовать. А внутри функции как раз его использование оправдано. Почитайте литературу, прежде чем утверждать такие вещи.

Какой именно функции ?И в какой литературе ето написано ?



0



Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

29.09.2010, 18:26

10

Любой.

в какой литературе ето написано

Гугл поможет.



0



Freelance

Эксперт С++

2887 / 1822 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

29.09.2010, 18:29

11

Цитата
Сообщение от gooseim
Посмотреть сообщение

Любой.

Ето не ответ!

Цитата
Сообщение от gooseim
Посмотреть сообщение

Гугл поможет.

Так раз вы читали ету книгу почему не поделетесь ?



0



Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

29.09.2010, 18:45

12

Asics^, я эту тему почерпнул не в книге, а на, сколько я помню, при работе с другими программистами, которые эту фичу использовали. Если интересует именно литература, то посмотрите стандарт c++. У меня сейчас его нет под рукой.
На счет функции — то это может быть любая функция, которая определена до того, как подключены header’ы (на счет анонимных (лямбда) не знаю).



0



Freelance

Эксперт С++

2887 / 1822 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

29.09.2010, 18:54

13

gooseim, Тогда почему у всех книгах которые я читал стандартное пространство имён подключалось голобально ?



0



Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

29.09.2010, 18:55

14

Asics^, потому что книги были для начинающих.



0



Freelance

Эксперт С++

2887 / 1822 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

29.09.2010, 18:57

15

gooseim, И ?



0



Эксперт С++

5038 / 2617 / 241

Регистрация: 07.10.2009

Сообщений: 4,310

Записей в блоге: 1

29.09.2010, 18:58

16

Asics^, в книигах глобально потому что:
во-первых, для уменьшения объема текста;
во-вторых, для увеличения читаемости.

на практике и правда не рекомендуется. иначе смысл от такого пространства имен, которое включено на глобальном уровне?



0



asics

Freelance

Эксперт С++

2887 / 1822 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

29.09.2010, 19:06

17

значит надо так писать?

C++
1
2
3
4
5
6
//...
int main
{
   using namespace std;
   //...
}

а не так

C++
1
2
3
4
5
6
//...
using namespace std;
int main
{
   //...
}



0



Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

29.09.2010, 19:08

18

Asics^, не надо, а рекомендуется. Можно писать как хочешь.



0



asics

29.09.2010, 19:13

Не по теме:

Ето что на подобе вопроса в С++:писать в мейн ретурн 0 или не писать :)



0



Эксперт С++

516 / 420 / 92

Регистрация: 23.09.2010

Сообщений: 1,165

29.09.2010, 19:16

20

Все зависит от программы, которую ты пишешь. Если она состоит из одной функции main, то на самом деле не важно, где писать using namespace std. Другое дело, что программа может расшириться, и тогда придется переписывать.
Еще зависит от фирмы, где ты работаешь. Бывают жесткие компании, которые вообще запрещают использовать using namespace в любом виде.

Добавлено через 1 минуту

Цитата
Сообщение от Asics^
Посмотреть сообщение

Не по теме:

Ето что на подобе вопроса в С++:писать в мейн ретурн 0 или не писать :)

Не совсем. На счет return 0 — это вопрос совместимости, а using namespace — это вопрос взаимодействия с разными модулями.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

29.09.2010, 19:16

Помогаю со студенческими работами здесь

Потоковый ввод и вывод.
Доброго всем времени суток!

Столкнулся с тем фактом, что данный код работает только с методом…

Потоковый ввод-вывод
Написать программу, которая будет добавлять в текстовый файл введенную с клавиатуры информацию…

Потоковый ввод и вывод
Я создаю файл с названием &quot;1.txt&quot;, но он не показывается в Source files, только в папке проекта….

Потоковый ввод/вывод
Напишите программу, к-я по желанию пользователя вычисляет сумму ряда:
А) N членов заданного ряда…

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

Или воспользуйтесь поиском по форуму:

20

Is there a way to modify JavaScript code while debugging? Visual Studio has «Edit and Continue», and similar hot swapping of code can be done in Java and other languages. Can this be done with JavaScript, and if so, how?

Paul Sweatte's user avatar

Paul Sweatte

23.9k7 gold badges124 silver badges260 bronze badges

asked Sep 8, 2011 at 4:55

theninjagreg's user avatar

theninjagregtheninjagreg

1,6062 gold badges12 silver badges17 bronze badges

2

Chrome, Safari, and some other WebKit-based browsers contain a feature in the Web Inspector known as Live Edit. If you go to the Scripts panel and are stopped on a breakpoint (or maybe even if not stopped on a breakpoint — I’m not sure), you can double click on a line and start editing that line. The changes you make will take effect on the script.

answered Sep 8, 2011 at 5:06

icktoofay's user avatar

icktoofayicktoofay

125k21 gold badges246 silver badges230 bronze badges

2

If you’re talking about while debugging, it’s very easy to modify the running code. In your debugging console, you can enter in Javascript expressions and it will run in the context of the window, which contains all the objects and functions of your code, so you can swap them out by redefining them.

answered Sep 8, 2011 at 5:00

Chetan's user avatar

ChetanChetan

45.9k31 gold badges106 silver badges145 bronze badges

Because JavaScript can modify the DOM the you essentially have to change the JavaScript file, save it and reload. For me, I like IE so I run the webpage in a browser NOT IN DEBUG mode. Then you can change the script files, SAVE them. switch back to the browser and reload (F5) to see your changes. Supposedly IE 11 has this ability (probably like Chrome which is essentially what I am doing, changing saving reloading from what I can tell) but I can’t get it to find, let alone open a js file. Super poor UI. I’m guessing the browser to open the file icon is enter image description here but it is always grayed out.

answered Nov 4, 2015 at 17:22

MtnManChris's user avatar

MtnManChrisMtnManChris

5085 silver badges16 bronze badges

Is there a way to modify JavaScript code while debugging? Visual Studio has «Edit and Continue», and similar hot swapping of code can be done in Java and other languages. Can this be done with JavaScript, and if so, how?

Paul Sweatte's user avatar

Paul Sweatte

23.9k7 gold badges124 silver badges260 bronze badges

asked Sep 8, 2011 at 4:55

theninjagreg's user avatar

theninjagregtheninjagreg

1,6062 gold badges12 silver badges17 bronze badges

2

Chrome, Safari, and some other WebKit-based browsers contain a feature in the Web Inspector known as Live Edit. If you go to the Scripts panel and are stopped on a breakpoint (or maybe even if not stopped on a breakpoint — I’m not sure), you can double click on a line and start editing that line. The changes you make will take effect on the script.

answered Sep 8, 2011 at 5:06

icktoofay's user avatar

icktoofayicktoofay

125k21 gold badges246 silver badges230 bronze badges

2

If you’re talking about while debugging, it’s very easy to modify the running code. In your debugging console, you can enter in Javascript expressions and it will run in the context of the window, which contains all the objects and functions of your code, so you can swap them out by redefining them.

answered Sep 8, 2011 at 5:00

Chetan's user avatar

ChetanChetan

45.9k31 gold badges106 silver badges145 bronze badges

Because JavaScript can modify the DOM the you essentially have to change the JavaScript file, save it and reload. For me, I like IE so I run the webpage in a browser NOT IN DEBUG mode. Then you can change the script files, SAVE them. switch back to the browser and reload (F5) to see your changes. Supposedly IE 11 has this ability (probably like Chrome which is essentially what I am doing, changing saving reloading from what I can tell) but I can’t get it to find, let alone open a js file. Super poor UI. I’m guessing the browser to open the file icon is enter image description here but it is always grayed out.

answered Nov 4, 2015 at 17:22

MtnManChris's user avatar

MtnManChrisMtnManChris

5085 silver badges16 bronze badges

Программа должна взять введенное пользователем слово и распечатать все слова в файле с разницей только в одну букву. Например: если ввод: «путь» вывод должен быть [скажем, май, день, война, вав, воск, был…] Мой код находит слова только с точным введенным словом. Например, если ввод «start», вывод [перезагрузка, запуск, запуск…] Как я могу изменить его, чтобы получить вывод, как в приведенном выше примере? Вот код:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

void fileRead(vector<string>& v, ifstream& fin) {
    string line;
    while (getline(fin, line)) {
        v.push_back(line);
    }
}
void search(vector<string>& v, string word) {
    for (int i = 0; i < v.size(); i++) {
        int index = v[i].find(word);
        if (index != -1)
            cout << v[i] << endl;
    }
}
int main() {
    vector<string> wordVector;
    ifstream fin("text.txt");
    if (!fin) {
        cout << "text.txt can't opened" << endl;
        return 0;
    }
    fileRead(wordVector, fin);
    fin.close();
    cout << "reading text.txt." << endl;
    while (true) {
        cout << "Input a word: >>";
        string word;
        getline(cin, word);
        if (word == "exit")
            break;
        search(wordVector, word);
    }
    cout << "Terminated" << endl;
}

2 ответа

Я написал эту функцию find_all_alternate, чтобы найти все возможные варианты данного слова.

Я взял список слов отсюда

  • https://www.mit.edu/~ecprice/wordlist.10000
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <fstream>
#include <iterator>
#include <set>

// type alias
using word_list_t = std::vector<std::string>;
using word_t = std::string;

// find all alternative occurrence of a word in the given list
void find_all_alternate(word_list_t &list, word_t word)
{
    word_list_t search_list;

    // Filter out bigger words
    std::copy_if(list.begin(), list.end(),
                std::back_inserter(search_list),
                [=](auto s){
                    return s.size() == word.size();
    });

    auto len = word.size();
    std::set<std::string> results;

    while(len--) {
        std::string alt = word.substr(1, word.size()-1);
        for(const auto& w : search_list) {
            auto found = w.find(alt);
            if(found != std::string::npos) {
                results.insert(w);
            }
        }
        std::rotate(word.begin(), word.begin()+1, word.end());
    }

    std::cout << "All possible alternatives of word '" << word << "' are: " << std::endl;
    for(const auto &s : results) std::cout << s << std::endl;
    std::cout << std::endl;
}

int main(int argc, char *argv[])
{
    if(argc != 2) {
        std::cerr << "ERROR: Run the program as followsn";
        std::cerr << "./word_search <word>n";
        return -1;
    }

    std::string word_to_search = argv[1];
    std::ifstream in_file("words.txt", std::ios::in);
    if(!in_file.is_open()) {
        std::cerr << "Unable to open words.txt filen";
        return -1;
    }

    std::string word;
    word_list_t word_list;

    while(in_file >> word) {
        word_list.push_back(word);
    }
    in_file.close();

    find_all_alternate(word_list, word_to_search);
}

Компиляция и запуск

g++ -Wall -Wextra -Wpedantic -std=c++17 word_search.cpp -o word_search
./word_search  say

Выход

All possible alternatives of word 'say' are:
aye
bay
day
gay
hay
isa
jay
kay
lay
may
pay
ray
sad
sam
san
sao
sap
sas
sat
saw
say
sys


0

Aamir
17 Июн 2022 в 17:41

Ваша программа показывает этот результат, потому что std::string найти функция будет искать только точное совпадение подстроки.

Что вы хотите, так это вычислить расстояние между двумя строками, а затем показать те, у которых расстояние равно 1.

Для расчета расстояния обычно используется хорошо известный алгоритм Левенштейна.

Я уже показывал реализацию в своих ответах здесь и здесь.

При этом ваше решение может быть изменено на

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <numeric>

using namespace std;


// Distance between 2 strings
size_t levensthein(const std::string& string1, const std::string& string2)
{
    // First get the string lengths
    const size_t lengthString1{ string1.size() };
    const size_t lengthString2{ string2.size() };

    // If one of the string length is 0, then return the length of the other
    // This results in 0, if both lengths are 0
    if (lengthString1 == 0) return lengthString2;
    if (lengthString2 == 0) return lengthString1;

    // Initialize substitition cost vector
    std::vector<size_t> substitutionCost(lengthString2 + 1);
    std::iota(substitutionCost.begin(), substitutionCost.end(), 0);

    // Calculate substitution cost
    for (size_t indexString1{}; indexString1 < lengthString1; ++indexString1) {
        substitutionCost[0] = indexString1 + 1;
        size_t corner{ indexString1 };

        for (size_t indexString2{}; indexString2 < lengthString2; ++indexString2) {
            size_t upper{ substitutionCost[indexString2 + 1] };
            if (string1[indexString1] == string2[indexString2]) {
                substitutionCost[indexString2 + 1] = corner;
            }
            else {
                const size_t temp = std::min(upper, corner);
                substitutionCost[indexString2 + 1] = std::min(substitutionCost[indexString2], temp) + 1;
            }
            corner = upper;
        }
    }
    return substitutionCost[lengthString2];
}


void fileRead(vector<string>& v, ifstream& fin) {
    string line;
    while (getline(fin, line)) {
        v.push_back(line);
    }
}
void search(vector<string>& v, string word) {
    for (int i = 0; i < v.size(); i++) {
        int distance = levensthein(word,v[i]);
        if (distance == 1)
            cout << v[i] << endl;
    }
}
int main() {
    vector<string> wordVector;
    ifstream fin("text.txt");
    if (!fin) {
        cout << "text.txt can't opened" << endl;
        return 0;
    }
    fileRead(wordVector, fin);
    fin.close();
    cout << "reading text.txt." << endl;
    while (true) {
        cout << "Input a word: >>";
        string word;
        getline(cin, word);
        if (word == "exit")
            break;
        search(wordVector, word);
    }
    cout << "Terminated" << endl;
}

И если вы хотите преобразовать это в более современный С++, вы также можете использовать:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <numeric>
#include <algorithm>

// Distance between 2 strings
size_t levensthein(const std::string& string1, const std::string& string2)
{
    // First get the string lengths
    const size_t lengthString1{ string1.size() };
    const size_t lengthString2{ string2.size() };

    // If one of the string length is 0, then return the length of the other
    // This results in 0, if both lengths are 0
    if (lengthString1 == 0) return lengthString2;
    if (lengthString2 == 0) return lengthString1;

    // Initialize substitition cost vector
    std::vector<size_t> substitutionCost(lengthString2 + 1);
    std::iota(substitutionCost.begin(), substitutionCost.end(), 0);

    // Calculate substitution cost
    for (size_t indexString1{}; indexString1 < lengthString1; ++indexString1) {
        substitutionCost[0] = indexString1 + 1;
        size_t corner{ indexString1 };

        for (size_t indexString2{}; indexString2 < lengthString2; ++indexString2) {
            size_t upper{ substitutionCost[indexString2 + 1] };
            if (string1[indexString1] == string2[indexString2]) {
                substitutionCost[indexString2 + 1] = corner;
            }
            else {
                const size_t temp = std::min(upper, corner);
                substitutionCost[indexString2 + 1] = std::min(substitutionCost[indexString2], temp) + 1;
            }
            corner = upper;
        }
    }
    return substitutionCost[lengthString2];
}


int main() {
    // Open file and check, if it could be opened
    if (std::ifstream fin("text.txt"); fin) {

        // Read all words from the file
        std::vector words(std::istream_iterator<std::string>(fin), {});

        // Read words to search for, until user enters exit
        std::string word{};
        while (word != "exit") {

            // Tell user, what to do
            std::cout << "nnInput a word: >> ";

            // Show result
            if (std::getline(std::cin, word) and word != "exit")
                std::copy_if(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, "n"), [&](const std::string& s) { return 1u == levensthein(s, word); });
        }
    }
    else std::cerr << "nError. Could not open source filenn";
}

А если есть ограничение, что должны отображаться только слова одинаковой длины, то вы можете сами написать простую функцию сравнения.

Это будет выглядеть так:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <numeric>
#include <algorithm>

bool oneLetterDifferent(const std::string& string1, const std::string& string2) {
    bool equalLength{ string1.length() == string2.length() };

    unsigned int unequalCounter{};
    if (equalLength) for (size_t i{}; i < string1.length(); ++i) {
        if (string1[i] != string2[i])
            ++unequalCounter;
    }
    return equalLength and (unequalCounter < 2);
}

int main() {
    // Open file and check, if it could be opened
    if (std::ifstream fin("text.txt"); fin) {

        // Read all words from the file
        std::vector words(std::istream_iterator<std::string>(fin), {});

        // Read words to search for, until user enters exit
        std::string word{};
        while (word != "exit") {

            // Tell user, what to do
            std::cout << "nnInput a word: >> ";

            // Show result
            if (std::getline(std::cin, word) and word != "exit")
                std::copy_if(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, "n"), [&](const std::string& s) { return oneLetterDifferent(s, word); });
        }
    }
    else std::cerr << "nError. Could not open source filenn";
}


0

Armin Montigny
18 Июн 2022 в 11:37

По умолчанию, в Linux после установки Sublime Text 3, результат программы на Python выводился в консоле самого редактора. На Windows, к сожалению, без колдовства ничего не работало. В Windows по умолчанию, после установки Sublime Text 3 выдавало ошибку.

[Ошибка Sublime Text 3 output not utf-8]
[Decode error — output not utf-8]
[Finished in 0.0s with exit code 1]
[shell_cmd: python -u «»]
[dir: C:Sublime Text 3]

Можно конечно было запустить отдельно консоль (cmd), в ней прописать путь к интерпретатору Python и путь к Вашей программе, чтобы она выполнилась. Каждый раз это делать не удобно. Сделаем так, чтобы код программы Python можно было выводить в самом редакторе Sublime Text 3.

1. Запускаем Sublime Text 3 и заходим в меню.

Sublime cmd

2. Удаляем содержимое и заменяем на:

{
«cmd»: [«C:\python33\python.exe», «-u», «$file»],
«file_regex»: «^[ ]*File «(…*?)», line ([0-9]*)»,
«selector»: «source.python»
}

Табуляция

Обратите внимание, на форматирование кода табуляцией!

3. Сохраняем файл Как, не изменяя дериктории. Имя можно задать любое. Рекомендуемое название файла «PythonCMD». Закрываем только что редактируемый файл (вкладку) PythonCMD. Чтобы у нас был пустой редактор без вкладок.

4. Выбираем в настройках только что созданный конфигурационный файл Tools -> Build Systems -> PythonCMD.
Если вы используете редактор Sublime Text 3 только для написания Python кода, тогда Вам в дальнейшем нет необходимости менять настройки. Если вы используете редактор для написания кода на других языках, тогда для запуска кода, Вам необходимо будет менять систему запуска в Tools.

5. Пользуемся. :)

После этих нехитрых действий, запускаем Вашу программу на Python (ctrl+b или F7). Результат будет выводится в окне редактора.
Python Sublime cmd

В сети есть множество решений про кодировку, вывод результатов в консоле (cmd), использование плагинов (SublimeREPL) итд. Как именно вывести результат именно в самой консоле редактора Sublime Text, а не в консоле Windows cmd, решений не было. Во всяком случаи, я их не нашел. Поэтому, предлагаю вам свое решение.

Как установить SublimeREPL и другие плагины, опишу отдельно. Для первого старта работы с Sublime Text 3 и Python выше описанных настроек достаточно.

[Рекоммендация.]
Если вы хотите научиться программировать, стать/быть программистом, рекомендую установить Ubuntu (Linux).
Возможно не стоит сразу сносить Windows и ставить только Ubuntu. Ubuntu можно установить как дополнительную ОС. И запускать только тогда, когда требуется программировать. Когда привыкните к Linux, узнаете преимущества, можно будет смело переходить на Linux.

!!! Не забудьте сохранить все важные файлы на отдельном флэш носителе.

Для тех, кто любит играть в игры. Под Ubuntu есть Steam и много других интересных игрушек.
В ближайшее время Valve выпускает свою Steam OS основанную на Linux.

Для Python под Linux есть интересная библиотека PyGame, можно разрабатывать свои 2D игры. Для 3D есть другие библиотеки.

На Ubuntu/Linux по умолчанию установлен Python и другие языки программирования.

Если Вы хотите работать программистом, то посмотрите вакансии. Все крупные компании ищут программистов и айтишников со знанием Linux в первую очередь. Или знание Linux будет являться весомым преимуществом.

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

Поскольку вы можете запускать произвольный код в консоли и/или оценщик выражения, во многих случаях вы можете выполнять изменения кода без перезапуска приложения. Это не совсем так, как edit-and-continue (это функция, которая мне действительно нравится в Visual Studio и должна быть частью Pycharm), но это долгий путь к тому, чтобы не перезапускать программу с нуля после изменения, чтобы увидеть, новый код работает так, как ожидалось.

Позвольте мне проиллюстрировать пару методов, которые я использую:

Скажем, у вас есть следующий код (с несколькими опечатками/ошибками для иллюстрации техник)

test_value = [10,9,8,7,6,55,4,3,2,1]

for i in range(0,10):
    if test_value[i] == i:
        print "found the value: " + i

Если вы запустите этот код, сначала он ошибется, потому что вы не можете печатать строку плюс целое число, но также я хотел совпадение на 5, а не 55 в массиве. Итак, идем.

Установите точку останова в инструкции for, как это, и запустите код в отладчике.

Изображение 123756

Когда он разбивается на отладчик, вы понимаете, что это должно быть не 5, а не 55. Вместо перезапуска вы можете изменить строку 1 на test_value = [10,9,8,7,6,5,4, 3,2,1], затем выберите строку, щелкните правой кнопкой мыши и выберите Execute Line in Console…, которая изменит значение test_value на массив с параметром 5. Теперь оператор if в строке 4 станет true на значении 5. Затем будет инициирована синтаксическая ошибка в строке 5.

Теперь, если вы хотите убедиться, что у вас правильный синтаксис, вы можете изменить строку 5 на print «найденное значение:» + str (i), выберите строку и выберите «Выделить выражение». из контекстного меню правой кнопки. Когда вы нажмете «Вычислить», результат появится либо в диалоговом окне (или в этом случае, так как это команда печати, на консоли).

Изображение 123757

Теперь, когда я исправил эти две проблемы, я могу успешно запустить код на втором проходе, а не, возможно, несколько проходов, которые он мог бы сделать, если бы я не использовал эти методы. Эти методы действительно окупаются, если вы обнаружите ошибку в коде, где требуется некоторое время, чтобы настроить.

Очевидно, что это очень надуманный пример, но, надеюсь, это показывает, как вы можете использовать как Evaluate Expression…, так и Execute Line in Console… в ваших интересах при отладке без перезапуска приложения каждый раз, когда вы находите ошибка в коде.

Кроме того, если вы используете Django, PyCharm (профессиональный) перезапустит сервер, если вы внесете изменения в код. Поэтому, если вы смотрите на свою веб-страницу и замечаете проблему, вы можете внести изменения в код и вернуться на веб-страницу, и, как вы это делаете, перезапустимое запущенное приложение или отлаживаемое приложение перезагрузится, а новый код будет запущен при обновлении страницы. Опять же, на самом деле не редактируйте и не продолжайте, но довольно быстрый способ внести изменения и протестировать.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как можно изменить энергию системы тел
  • Как можно изменить энергию активации реакции
  • Как можно изменить электронную почту на телефоне андроид
  • Как можно изменить электроемкость конденсатора
  • Как можно изменить экран блокировки на айфоне

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии