Конвертация с Pascal на C - C (СИ)
Формулировка задачи:
Нужна помощь, нужно перевести программу с Pascal на C
type Tname = (anna, boris, ekaterina, igor, marina, olga, yakov); Tdesc = text; const Titles: array[Tname] of string = ('anna', 'boris', 'ekaterina', 'igor', 'marina', 'olga', 'yakov'); children: array[Tname, Tname] of boolean = ( // anna: (false, false, false, true, false, true, false), // boris: (false, false, false, false, false, false, false), // ekaterina (false, false, false, false, true, false, false), // igor (false, true, true, false, false, false, false), // marina (false, false, false, false, false, false, false), // olga (false, false, false, false, false, false, true), // yakov (false, false, false, false, false, false, false) ); Type PTQueueItem = ^TQueueItem; TQueueItem = Record Data: Tname; next: PTQueueItem; End; TQueue = Object Head, Tail: PTQueueItem; Constructor Init; Destructor Done; Function IsEmpty: Boolean; Procedure Put(T: Tname); Procedure Get(Var T: Tname); End; Constructor TQueue.Init; Begin Head := nil End; Destructor TQueue.Done; Var T: Tname; Begin While not IsEmpty Do Get(T) End; Function TQueue.IsEmpty: Boolean; Begin IsEmpty := (Head = nil) End; Procedure TQueue.Put(T: Tname); Var nItem: PTQueueItem; Begin new(nItem); With nItem^ Do Begin Data := T; next := nil; End; If IsEmpty Then Head := nItem Else Tail^.next := nItem; Tail := nItem End; Procedure TQueue.Get(Var T: Tname); Var ToDelete: PTQueueItem; Begin ToDelete := Head; Head := ToDelete^.next; T := ToDelete^.Data; Dispose(ToDelete) end; var queue: Tqueue; i, root, next: Tname; f: Tdesc; begin assign(f, 'fout.txt'); rewrite(f); root := anna; queue.Init; queue.Put(root); while not queue.isempty do begin queue.Get(next); writeln(f, titles[next]); for i := low(Tname) to high(Tname) do if children[next, i] then queue.Put(i); end; queue.Done; close(f); end.
Решение задачи: «Конвертация с Pascal на C»
textual
Листинг программы
#include <stdio.h> #include "queue.h" enum TName { anna, boris, ekatrina, igor, marina, olga, yakov, NAMES_MAX }; const char* Titles[NAMES_MAX] = { "anna", "boris", "ekatrina", "igor", "marina", "olga", "yakov" }; const int children[NAMES_MAX][NAMES_MAX] = { {0, 0, 0, 1, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0}, {0, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0} }; int main(void) { QUEUE_HANDLE hQueue; enum TName root = anna; enum TName next, i; FILE* f = fopen("fout.txt", "w"); QueueCreate(&hQueue, sizeof(int)); QueueEnqueue(hQueue, &root); while (!IsQueueEmpty(hQueue)) { QueueDequeue(hQueue, &next); fprintf(f, "%s\n", Titles[next]); for (i = anna; i < NAMES_MAX; i++) { if (children[next][i]) QueueEnqueue(hQueue, &i); } } QueueDelete(&hQueue); fclose(f); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Объявляем перечисление
TName
с возможными именами - Объявляем массив строк
Titles
с именами из перечисления - Объявляем двумерный массив
children
размеромNAMES_MAX
наNAMES_MAX
для хранения связей - В функции
main
создаем очередь с помощью функцииQueueCreate
- Добавляем корневой элемент в очередь с помощью функции
QueueEnqueue
- В цикле пока очередь не пуста, извлекаем из неё следующий элемент с помощью функции
QueueDequeue
- Записываем имя текущего элемента в файл с помощью функции
fprintf
- В цикле проходим по всем возможным элементам для текущего элемента и если у текущего элемента есть связь с этим элементом, то добавляем его в очередь с помощью функции
QueueEnqueue
- Закрываем файл с помощью функции
fclose
- Возвращаем 0, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д