Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46

Трассировка печатных трасс. Метод встречной волны

03.06.2013, 13:39. Показов 3879. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня. Пишу расчётно-графическую работу на данную тему. Алгоритм распространения волны получается чересчур громоздким. Из-за этого не могу найти несколько ошибок, из-за которых уже на данном этапе программа работает не верно. Подскажите, пожалуйста, может где-то есть решение задачи? Время поджимает, хотелось бы хотя бы основную идею подсмотреть.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.06.2013, 13:39
Ответы с готовыми решениями:

метод детектированиеультразвуковой волны
Привет. Подскажите, как можно детектировать приход ультразвуковой волны из среды (на рисунках изображен сигнал)? В общем,...

Найти амплитуду напруженности магнитного поля волны и фазовую скорость волны
1)Контур из провода, который согнут в виде прямоугольника, по которому протекает ток I (1) = 3 А, размещено вблизи прямолинейного...

Найти частоту колебаний, если длина волны равна 1,5м, А скорость распространения волны 250 м/c
10) Найти частоту колебаний, если длина волны равна 1.5м. А скорость распространения волны 250 м/c.

26
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
03.06.2013, 14:47
Цитата Сообщение от Seemann92 Посмотреть сообщение
решение задачи
- для начала процитировать сюда тексты ошибок и предупреждений и участки кода, к которым они относятся
0
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
03.06.2013, 18:58  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
- для начала процитировать сюда тексты ошибок и предупреждений и участки кода, к которым они относятся
В том-то и проблема. Ошибок нет, код компилируется. В моём случае код представляет собой набор условий, выполняющихся в цикле. В данный момент всё это уже в третий раз удалено. Так сказать, новая попытка..

Добавлено через 3 часа 53 минуты
Вот очередной вариант. Всё так же зависает при запуске.

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
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
int rec, chain;//Номер текущей волны и количество пар источников для проведения трасс между ними.
char mas2[30];//Здесь хранится последовательность цепей ("AB CD" означает, что будут проведены трассы между А и В, C и D ).
bool key=False;//Условие выхода из цикла (волны встретились).
        if (LabeledEdit3->Text!=""){
                LabeledEdit3->Enabled=False;
                chain=strlen(LabeledEdit3->Text.c_str())-1;
                strcpy(mas2, LabeledEdit3->Text.c_str());
                for (int t=0; t<chain; t++){
                        if ((mas2[t]!=' ')&&(mas2[t+1]!=' ')){
                                rec=0;
                                for (int i=0; i<m; i++)
                                        for (int j=0; j<n; j++){
                                                if (wrkfld[i][j]==int(mas2[t]))
                                                        wave[i][j]=0;
                                                if (wrkfld[i][j]==int(mas2[t+1]))
                                                        wave[i][j]=0;
                                        }
                                while (key==False){
                                        for (int i=0; i<m; i++)
                                                for (int j=0; j<n; j++){
                                                        if (wave[i][j]==rec){
                                                                if (wrkfld[i][j+1]==0){
                                                                        wave[i][j+1]=rec+1;
                                                                        wrkfld[i][j+1]=2;
                                                                        clrmap[i][j+1]=2;
                                                                        StringGrid1->Cells[j+2][i+1]=IntToStr(rec+1);
                                                                }
                                                                else{
                                                                        if (((wave[i][j-1]==0)&&(rec>1))||(wave[i][j+1]==rec)||(wave[i][j+1]==rec+1))
                                                                                key=True;
                                                                        break;
                                                                }
                                                                if (wrkfld[i][j-1]==0){
                                                                        wave[i][j-1]=rec+1;
                                                                        wrkfld[i][j-1]=2;
                                                                        clrmap[i][j-1]=2;
                                                                        StringGrid1->Cells[j][i+1]=IntToStr(rec+1);
                                                                }
                                                                else{
                                                                        if (((wave[i][j-1]==0)&&(rec>1))||(wave[i][j-1]==rec)||(wave[i][j-1]==rec+1))
                                                                                key=True;
                                                                        break;
                                                                }
                                                        }
                                                }
                                        rec++;
                                }
                        }
                        else t++;
                }
        }
        else
                ShowMessage("Ïîñëåäîâàòåëüíîñòü öåïåé íå çàäàíà!");
        LabeledEdit3->Enabled=True;
Глобальные переменные в программе:
C++
1
2
3
4
5
6
int m=21, n=29; //Ðàáî÷åå ïîëå ðàçìåðîì m ñòðîê íà n ñòîëáöîâ (ïî óìîë÷àíèþ).
Ist mas[40]; //Ìàññèâ èñòî÷íèêîâ.
int count=0; //C÷¸ò÷èê èñòî÷íèêîâ.
int wrkfld[300][400];//Ðàáî÷åå ïîëå ìàêñèìàëüíîãî ðàçìåðà.
int clrmap[300][400];//Öâåòîâîå ïîëå äëÿ ðàáî÷åãî ïîëÿ ìàêñèìàëüíîãî ðàçìåðà (прорисовка всей красоты в StringGrid).
int wave[300][400];//Êàðòà ðàñïðîñòðàíåíèÿ âîëíû.
Постараюсь пояснить, что не так. Во-первых, как говорил выше, смущает громадное количество условий и итераций. Во-вторых, при запуске в данном виде программа сразу зависает. При исправлении пары условий, а именно
C++
1
if (((wave[i][j-1]==0)&&(rec>1))||(wave[i][j-1]==rec)||(wave[i][j-1]==rec+1))
на
C++
1
if ((wave[i][j-1]==0)||(wave[i][j-1]==rec)||(wave[i][j-1]==rec+1))
программа проходит только первую итерацию, т.е. проходит только первая волна от обоих источников.
Никак не могу понять, где мой прокол. Можно ли как-то упростить это всё?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
03.06.2013, 20:52
C++
1
Ist mas[40]; //Массив источников.
- это что такое?

C++
1
код с таким форматированием смотреть не хочется :(
0
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
03.06.2013, 20:58  [ТС]
Ist - структура. Имеет поле под имя источника (char) и две координаты, соответствующие координатам на рабочем поле. А о форматировании.. Покажите, как надо, учту.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
03.06.2013, 21:02
мне кажется, самая первая проблема - скобки, хотя логики программы я так и не осилил
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
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
int rec, chain; // Номер текущей волны и количество пар источников для проведения трасс между ними.
char mas2[30]; // Здесь хранится последовательность цепей ("AB CD" означает, что будут проведены трассы между А и В, C и D ).
bool key=False; // Условие выхода из цикла (волны встретились).
 
if (LabeledEdit3->Text!="") {
  LabeledEdit3->Enabled = false;
  chain=strlen(LabeledEdit3->Text.c_str())-1;
  strcpy(mas2, LabeledEdit3->Text.c_str());
  for (int t=0; t<chain; t++){
    if ((mas2[t]!=' ')&&(mas2[t+1]!=' ')) {
      rec = 0;
      for (int i=0; i<m; i++)
        for (int j=0; j<n; j++) {
          if (wrkfld[i][j]==int(mas2[t]))
            wave[i][j] = 0;
          if (wrkfld[i][j]==int(mas2[t+1]))
            wave[i][j] = 0;
        }
        while (key==False) {
          for (int i=0; i<m; i++)
            for (int j=0; j<n; j++) {
              if (wave[i][j]==rec){
                if (wrkfld[i][j+1]==0) {
                  wave[i][j+1]=rec+1;
                  wrkfld[i][j+1] = 2;
                  clrmap[i][j+1] = 2;
                  StringGrid1->Cells[j+2][i+1] = IntToStr(rec+1);
                }
                else {
                  if (((wave[i][j-1]==0)&&(rec>1))||(wave[i][j+1]==rec)||(wave[i][j+1]==rec+1))
                    key=true; // True
                  break;
                }
                if (wrkfld[i][j-1]==0) {
                  wave[i][j-1] = rec+1;
                  wrkfld[i][j-1] = 2;
                  clrmap[i][j-1] = 2;
                  StringGrid1->Cells[j][i+1] = IntToStr(rec+1);
                }
                else {
                  if (((wave[i][j-1]==0)&&(rec>1))||(wave[i][j-1]==rec)||(wave[i][j-1]==rec+1))
                    key = true;
                  break;
                }
              }
            }
            rec++;
          }
        }
         else t++;
      }
    }
    else
      ShowMessage("Последовательность цепей не задана!");
    LabeledEdit3->Enabled=True;
о форматировании - просто по ходу дела , в оригинальном коде отступы сделаны табуляцией, которую этот форум трактует по-своему, и растягивает код до невероятных размеров, я в таких случаях в любом текстовом редакторе меняю эти табы на два пробела.
1
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
03.06.2013, 21:09  [ТС]
Я потому и ищу другие решения, т.к. собственный алгоритм получился слишком замуженым и едва укладывается в голове. Спасибо за совет с форматированием - полезно.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
03.06.2013, 21:26
относительно логики и скобок:
C++
1
2
3
4
5
else {
  if (((wave[i][j-1]==0)&&(rec>1))||(wave[i][j-1]==rec)||(wave[i][j-1]==rec+1))
    key = true;
break;
}
break; здесь к чему относится?
в самом конце мне лично не хватает двух }, ну и самая последняя строчка:
C++
1
LabeledEdit3->Enabled=True;
- она имеет отношение к else, или не имеет? и таких вопросов у меня много.
ну и не True в сях, а true.

Добавлено через 4 минуты
ну и такое:
C++
1
2
3
4
if (wrkfld[i][j]==int(mas2[t]))
  wave[i][j] = 0;
if (wrkfld[i][j]==int(mas2[t+1]))
  wave[i][j] = 0;
C++
1
2
3
4
if ( (wrkfld[i][j]==int(mas2[t])) || // или && ?
     (wrkfld[i][j]==int(mas2[t+1])) ) {
  wave[i][j] = 0;
}
не конец света, конечно, но все же.
и т.д.
0
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
03.06.2013, 21:49  [ТС]
1. break; всё же относится к if, и скобки уже добавлены. Вообще break; по задумке должен прерывать цикл, если в условии хоть что-то принимает значение 1.
2.
C++
1
LabeledEdit3->Enabled=True;
сам по себе. Пока идёт трассировка, значение в нём не должно изменяться, а потому я сделал его неактивным.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
03.06.2013, 22:00
Цитата Сообщение от Seemann92 Посмотреть сообщение
я сделал его неактивным
C++
1
LabeledEdit3->Enabled = true;
как раз делает компонент "активным", или вы о чем-то о своем.
0
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
03.06.2013, 22:05  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
C++
1
LabeledEdit3->Enabled = true;
как раз делает компонент "активным", или вы о чем-то о своем.
О своём. В начале кода (шестая строка) как раз таки
C++
1
LabeledEdit3->Enabled = false;
А в самом конце обратное действие. Функция своё отработала, возвращаем, как было при запуске программы.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.06.2013, 02:28
вот именно... тогда после
C++
1
LabeledEdit3->Enabled = true;
должна быть закрывающая фигурная скобка, ее нет. думаю, еще нескольких нет. вот и логики программы нет. она, сердешная, конечно, пытается все сделать по-честному, но потом путается в ваших мыслях и со словами "как все это мне надоело" ,
Цитата Сообщение от Seemann92 Посмотреть сообщение
проходит только первую итерацию
.
1
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
04.06.2013, 18:30  [ТС]
LK, ещё раз спасибо! Похоже, проблема решена. Вывод: загаженный код - плохой код. Проблема скорее всего крылась здесь:
C++
1
if (((wave[i][j-1]==0)&&(rec>1))||(wave[i][j-1]==rec)||(wave[i][j-1]==rec+1))
По крайней мере, когда привёл это к трём отдельным условиям, проверяющимся поочерёдно, программа ожила.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.06.2013, 21:18
Так?
C++
1
2
3
4
5
6
7
8
9
else {
  if ((wave[i][j-1]==0 && rec>1) ||
      (wave[i][j-1]==rec) ||
      (wave[i][j-1]==rec+1))
  {
    key = true;
  }
  break;
}
0
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
05.06.2013, 12:31  [ТС]
LK, нет. Пришлось использовать конструкцию if () else несколько раз. Да, куча условий не труЪ, зато работает.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.06.2013, 12:44
работает, и ладно...
0
0 / 0 / 0
Регистрация: 02.04.2015
Сообщений: 3
02.04.2015, 11:59
Seemann92, доброго времени суток.
Не могли бы вы поделиться работающим кодом этого алгоритма.
0
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
02.04.2015, 13:52  [ТС]
Artemka183,
мне не жалко, но ценность программы стремится к нулю с огромными скоростями. ))) Куда кинуть?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.04.2015, 14:21
Цитата Сообщение от Seemann92 Посмотреть сообщение
Куда кинуть?
На форум само собой.
(на всякий)
0
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 46
02.04.2015, 16:19  [ТС]
SatanaXIII,
код кривой, стыдно. Человеку для каких-то целей надо - поделюсь. А прошареные будут какашками кидаться. )) Так что пардонте, но для форума придётся переписывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2015, 16:19
Помогаю со студенческими работами здесь

Определить скорость а-частицы, если ее дебройлевская длина волны совпадает с дебройлевской длиной волны протона
Привет всем! Помогите пожалуйста с задачей: Определить скорость а-частицы, если ее дебройлевская длина волны совпадает с дебройлевской...

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

Нужно найти количество нулей между первой парой единичек и до первой встречной единицы
Нужно найти количество нулей между первой парой единичек и до первой встречной единицы. Вот мной говно-код, который не работает. HELP! ...

Распознание печатных символов
Распознание печатного текста Дано изображение с текстом &quot; ...Я жил в Киеве 14 декабря 2001, но переехал в Харьков из-за ...&quot;- 14...

Перенос печатных форм с КА в УТ 11
Люди в общем вопрос такой, у нас на предприятии стоит 8.2 и КА. И в нашей КА есть несколько макетов которые надо бы забрать и прицепить их...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru