Перевод программы с С++ на С(Си) - 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обрабатывает данные в соответствии с заданием, разделяя числа на положительные и отрицательные.