Перевод программы с С++ на С(Си) - C (СИ)
Формулировка задачи:
Помогите,пожалуйста,перевести с С++ на СИ
// Lists.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> using namespace std; /*,10 По исходному списку действительных чисел построить списки позиций положительных и отрицательных элементов. Обеспечить ввод необходимых данных пользователем. При вводе списков должна быть возможность ввода пустого списка , с которым алгоритмы так же должны корректно отрабатывать. Выполнить обработку данных в соответствии с заданием, вывести результаты на экран. После вывода результатов, предоставить пользователю возможность завершить работу с программой или продолжить работу с новыми данными. Все алгоритмические подзадачи (добавление элемента списка, удаление элемента списка, вывод списка на экран, очистка списка, ввод элементов списка и т.д.) выделять в соответствующие подпрограммы.*/ struct element //Структура для хранения действительных чисел { double x; //Инфополе. значения из x будут передаваться в список element *Next; //Адресное поле }; class List //Класс Список, для работы с действительными числами { public: element *Head; //Указатель на последний активный элемент или просто голова списка element *Tail; List() { Head = NULL; } //Конструктор и инициализация указателя пустым значением ~List() //Деструктор { while (Head != NULL) //Пока по адресу не пусто { element *temp = Head->Next; //Временная переменная для хранения адреса следующего элемента delete Head; //Освобождаем адрес обозначающий начало Head = temp; //Меняем адрес на следующий } } void Add(double x) //Функция для добавления значений в список { element *temp = new element; //При каждом вызове выделяется память temp->x = x; //Записываем x в элемент структуры element (в x структуры element) temp->Next = Head; //Указываем, что след. элемент это объект по адресу Head Head = temp; //Указываем, что последний активный элемент это только что введенный } void Show() { //Функция для отображения списка на экране /* element *temp = Head; //Определяем указатель, который изначально он равен адресу начала списка while (temp != NULL) //До тех пор пока не встретит пустое значение { cout << temp->x << " "; //Выведет элемент x из списка temp = temp->Next; //Указываем, что далее нам нужен следующий элемент } } */ element *temp = Head; //Определяем указатель, который изначально он равен адресу начала списка while (temp != NULL) //До тех пор пока не встретит пустое значение { cout << temp->x << " "; //Выведет элемент x из списка temp = temp->Next; //Указываем, что далее нам нужен следующий элемент } } }; struct Index //Структура для работы со списками позиций положительных и отрицательных элементов { int x; //Инфополе. значения из x будут передаваться в список Index *Next; //Адресное поле }; class IndexList //Класс Список для работы со списками позиций положительных и отрицательных элементов { Index *Head; //Указатель на последний активный элемент или просто голова списка public: IndexList() { Head = NULL; } //Конструктор и инициализация указателя пустым значением ~IndexList() //Деструктор { while (Head != NULL) //Пока по адресу не пусто { Index *temp = Head->Next; //Временная переменная для хранения адреса следующего элемента delete Head; //Освобождаем адрес обозначающий начало Head = temp; //Меняем адрес на следующий } } void Add(int x) //Функция для добавления значений в список { Index *temp = new Index; //При каждом вызове выделяется память temp->x = x; //Записываем x в элемент структуры element (в x структуры element) temp->Next = Head; //Указываем, что след. элемент это объект по адресу Head Head = temp; //Указываем, что последний активный элемент это только что введенный } void Show() { //Функция для отображения списка на экране Index *temp = Head; //Определяем указатель, который изначально он равен адресу начала списка while (temp != NULL) //До тех пор пока не встретит пустое значение { cout << temp->x + 1<< " "; //Выведет элемент x из списка temp = temp->Next; //Указываем, что далее нам нужен следующий элемент } } }; void getNegativAndPositiveIndexLists(List* list, IndexList* positiv, IndexList* negativ) { element *temp = list->Head; //Определяем указатель, который изначально он равен адресу начала списка int currentIndex = 0; while (temp != NULL) //До тех пор пока не встретит пустое значение { if ( (temp->x) > 0) {//если число положительное, то сохраняем его индекс в положительном списке positiv->Add(currentIndex); } else if ((temp->x) < 0) { //если отрицательное число, то в отрицательном. Ноль не принадлежит ни положительному ни отрицательному списку negativ->Add(currentIndex); } temp = temp->Next; currentIndex++; } } int main() { setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы int N; //Число элементов в список double x; //Элементы вводимые в список List lst; //Переменная, тип которой список IndexList positiv ; IndexList negativ; char flag = 'y'; while (flag == 'y') { cout << "Введите количество элементов списка: "; cin >> N; //Указали сколько элементов вводить в список cout << "\n"; for (int i = 0; i < N; i++) { cout <<"Введите "<< N-i << " элемент списка: "; cin >> x; //Ввод x с клавиатуры lst.Add(x); //Добавление элемента в список } getNegativAndPositiveIndexLists(&lst, &positiv, &negativ); cout << "\nИсходный список: "; lst.Show(); //Вывод списка на экран cout << "\nСписок индексов положительных чисел: "; positiv.Show(); cout << "\nСписок индексов отрицательных чисел: "; negativ.Show(); positiv.~IndexList(); negativ.~IndexList(); lst.~List(); cout << "\nВы хотите ещё раз выполнить программу?(y/n)"; cin >> flag; } system("pause"); return 0; }
Решение задачи: «Перевод программы с С++ на С(Си)»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <locale.h> /*,10 По исходному списку действительных чисел построить списки позиций положительных и отрицательных элементов. Обеспечить ввод необходимых данных пользователем. При вводе списков должна быть возможность ввода пустого списка , с которым алгоритмы так же должны корректно отрабатывать. Выполнить обработку данных в соответствии с заданием, вывести результаты на экран. После вывода результатов, предоставить пользователю возможность завершить работу с программой или продолжить работу с новыми данными. Все алгоритмические подзадачи (добавление элемента списка, удаление элемента списка, вывод списка на экран, очистка списка, ввод элементов списка и т.д.) выделять в соответствующие подпрограммы.*/ typedef struct element /*Структура для хранения действительных чисел*/ { double x; /*Инфополе. значения из x будут передаваться в список*/ struct element *Next; /*Адресное поле*/ } element; typedef struct /*Список, для работы с действительными числами*/ { element *Head; /*Указатель на последний активный элемент или просто голова списка*/ element *Tail; } List; void FreeList(List *l); void AddInList(List *l, double x); void ShowList(List *l); typedef struct Index /*Структура для работы со списками позиций положительных и отрицательных элементов*/ { int x; /*Инфополе. значения из x будут передаваться в список*/ struct Index *Next; /*Адресное поле*/ } Index; typedef struct /*Список для работы со списками позиций положительных и отрицательных элементов*/ { Index *Head; /*Указатель на последний активный элемент или просто голова списка*/ } IndexList; void FreeIndexList(IndexList *il); void AddInIndexList(IndexList *il, int x); void ShowIndexList(IndexList *il); void getNegativAndPositiveIndexLists(List* list, IndexList* positiv, IndexList* negativ); int main(void) { int N, i; /*Число элементов в список*/ double x; /*Элементы вводимые в список*/ List lst; /*Переменная, тип которой список*/ IndexList positiv ; IndexList negativ; char flag = 'y'; lst.Head = NULL; positiv.Head = NULL; negativ.Head = NULL; setlocale(LC_ALL, "rus"); /* корректное отображение Кириллицы*/ while (flag == 'y') { printf("Введите количество элементов списка: "); scanf("%d", &N); /*Указали сколько элементов вводить в список*/ printf("\n"); for (i = 0; i < N; i++) { printf("Введите %d элемент списка: ", N-i); scanf("%lf", &x); /*Ввод x с клавиатуры*/ AddInList(&lst, x); /*Добавление элемента в список*/ } getNegativAndPositiveIndexLists(&lst, &positiv, &negativ); printf("\nИсходный список: "); ShowList(&lst); /*Вывод списка на экран*/ printf("\nСписок индексов положительных чисел: "); ShowIndexList(&positiv); printf("\nСписок индексов отрицательных чисел: "); ShowIndexList(&negativ); FreeIndexList(&positiv); FreeIndexList(&negativ); FreeList(&lst); printf("\nВы хотите ещё раз выполнить программу?(y/n)"); scanf("%c", &flag); } system("pause"); return 0; } void FreeList(List *l) /*освобождение памяти под List*/ { element *temp; /*Временная переменная для хранения адреса следующего элемента*/ while (l->Head != NULL) /*Пока по адресу не пусто*/ { temp = l->Head->Next; free(l->Head); /*Освобождаем адрес обозначающий начало*/ l->Head = temp; /*Меняем адрес на следующий*/ } } void AddInList(List *l, double x) /*Функция для добавления значений в список*/ { element *temp = malloc(sizeof(element)); /*При каждом вызове выделяется память*/ temp->x = x; /*Записываем x в элемент структуры element (в x структуры element)*/ temp->Next = l->Head; /*Указываем, что след. элемент это объект по адресу Head*/ l->Head = temp; /*Указываем, что последний активный элемент это только что введенный*/ } /*Функция для отображения списка на экране*/ void ShowList(List *l) { element *temp = l->Head; /*Определяем указатель, который изначально он равен адресу начала списка*/ while (temp != NULL) /*До тех пор пока не встретит пустое значение*/ { printf("%f ", temp->x); /*Выведет элемент x из списка*/ temp = temp->Next; /*Указываем, что далее нам нужен следующий элемент*/ } } void FreeIndexList(IndexList *il) { Index *temp; /*Временная переменная для хранения адреса следующего элемента*/ while (il->Head != NULL) /*Пока по адресу не пусто*/ { temp = il->Head->Next; free(il->Head); /*Освобождаем адрес обозначающий начало*/ il->Head = temp; /*Меняем адрес на следующий*/ } } void AddInIndexList(IndexList *il, int x) /*Функция для добавления значений в список*/ { Index *temp = malloc(sizeof(Index)); /*При каждом вызове выделяется память*/ temp->x = x; /*Записываем x в элемент структуры element (в x структуры element)*/ temp->Next = il->Head; /*Указываем, что след. элемент это объект по адресу Head*/ il->Head = temp; /*Указываем, что последний активный элемент это только что введенный*/ } /*Функция для отображения списка на экране*/ void ShowIndexList(IndexList *il) { Index *temp = il->Head; /*Определяем указатель, который изначально он равен адресу начала списка*/ while (temp != NULL) /*До тех пор пока не встретит пустое значение*/ { printf("%d ", temp->x + 1); /*Выведет элемент x из списка*/ temp = temp->Next; /*Указываем, что далее нам нужен следующий элемент*/ } } void getNegativAndPositiveIndexLists(List* list, IndexList* positiv, IndexList* negativ) { element *temp = list->Head; /*Определяем указатель, который изначально он равен адресу начала списка*/ int currentIndex = 0; while (temp != NULL) /*До тех пор пока не встретит пустое значение*/ { if ( (temp->x) > 0) {/*если число положительное, то сохраняем его индекс в положительном списке*/ AddInIndexList(positiv, currentIndex); } else if ((temp->x) < 0) { /*если отрицательное число, то в отрицательном. Ноль не принадлежит ни положительному ни отрицательному списку*/ AddInIndexList(negativ, currentIndex); } temp = temp->Next; currentIndex++; } }
Объяснение кода листинга программы
- Объединение кода в функции для повышения читаемости и упрощения работы с кодом.
- Выделение общих структур данных и функций для работы со списками и индексными списками.
- Ввод данных пользователем с помощью функций scanf и malloc для динамического выделения памяти.
- Вывод результатов работы программы на экран с помощью функции printf.
- Освобождение памяти после использования списков и индексных списков с помощью функций free.
- Проверка на ноль перед добавлением элемента в индексные списки, чтобы избежать ошибок.
- Ввод пустого списка возможен, и алгоритмы корректно обрабатывают этот случай.
- Возможность завершить работу с программой в любой момент, используя команду 'y' или 'n'.
- Число элементов в списке не ограничено, что позволяет работать с любым количеством элементов.
- Числовые значения элементов списка хранятся в структуре
element
. - Списки хранятся в структурах
List
иIndexList
. - Функции
AddInList
,ShowList
,FreeList
работают с общими структурами данныхList
. - Функции
AddInIndexList
,ShowIndexList
работают с общими структурами данныхIndexList
. - Функция
getNegativAndPositiveIndexLists
обрабатывает данные в соответствии с заданием, разделяя числа на положительные и отрицательные.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д