Перевод программы с С++ на С(Си) - 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++;
    }
}

Объяснение кода листинга программы

  1. Объединение кода в функции для повышения читаемости и упрощения работы с кодом.
  2. Выделение общих структур данных и функций для работы со списками и индексными списками.
  3. Ввод данных пользователем с помощью функций scanf и malloc для динамического выделения памяти.
  4. Вывод результатов работы программы на экран с помощью функции printf.
  5. Освобождение памяти после использования списков и индексных списков с помощью функций free.
  6. Проверка на ноль перед добавлением элемента в индексные списки, чтобы избежать ошибок.
  7. Ввод пустого списка возможен, и алгоритмы корректно обрабатывают этот случай.
  8. Возможность завершить работу с программой в любой момент, используя команду 'y' или 'n'.
  9. Число элементов в списке не ограничено, что позволяет работать с любым количеством элементов.
  10. Числовые значения элементов списка хранятся в структуре element.
  11. Списки хранятся в структурах List и IndexList.
  12. Функции AddInList, ShowList, FreeList работают с общими структурами данных List.
  13. Функции AddInIndexList, ShowIndexList работают с общими структурами данных IndexList.
  14. Функция getNegativAndPositiveIndexLists обрабатывает данные в соответствии с заданием, разделяя числа на положительные и отрицательные.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.444 из 5
Похожие ответы