Консультация № 146208
06.10.2008, 16:53
0.00 руб.
07.10.2008, 18:10
0 2 2
Здравствуйте глубоко уважаемые эксперты.

Я бы хотел узнать правильно ли работает данное задание.

Изначально задание было следующим:

Создать динамическую однонаправленную списочную структуру на языке Си.
Элементы структуры предназначены для хранения вещественных чисел.

Программа должна реализовывать следующие функции по работе со списком:
• добавление элемента в начало списка;
• удаление элемента из начала списка;
• добавление элемента в список на указанную позицию K;
• удаление элемента из списка, находящегося на позиции K;
• добавление элемента в конец списка;
• удаление элемента на конце списка;
• отобразить элементы списка на экране
• удаление из списка всех вхождений заданного числа


При запуске программы список пуст, пользователю предлагается меню, в котором отображается список допустимых операций по работе со списком. Пользователь может многократно вызывать предлагаемые функции, до тех пор пока не выберет в меню выход из программы.

При попытке создания списка из вещественных чисел на экран выводятся только целые числа, а вещественная часть дробного числа отбрасывается или округляется.

Каким образом это можно исправить. Чтобы на экран выводились вещественные числа вместе с тем знаяением, которое идёт сразу же после плавающей точки.

Заранее благодарю.


Приложение:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

struct ilist // Создание списочной структуры
{
int num; // Объявление переменной
ilist *next; // Указатель на следующей список
};

ilist* find_pos(ilist *&il, int k); // Инициализация функции поиска позиции k


// Добавление (вставка) элемента в начало списка
void insert_begin(ilist *&il, int k)
{
ilist *r = new ilist;
r->num = k;
r->next=il;
il=r;
}

// Удаление первого элемента: второй становится началом
float del_begin(ilist *&il)
{
ilist *r=il;
int x=r->num;
il=r->next;
return x;
}

// Вставка или добавление элемента в середину списка
float insert_middle(ilist *&il, int k, int nm)
{
ilist* lst = find_pos(il, k-1); // Элемент списка распологается перед местом вставки
ilist* lst1 = lst-> next; // Элемент списка распологается после места вставки
ilist* tmpList = new ilist; // Создаётся новый элемент списка
tmpList->num = nm;
tmpList->next = lst1;
lst->next = tmpList;
return(0);
}

// Удаление элемента из середины списка
float del_middle(ilist *&il, int k)
{
if(k<=1) // Если k=1, то происходит удаление первого элемента
{
del_begin(il);
return(0);
}
ilist* lst = find_pos(il, k - 1); // Последний элемент помещается перед удаляемым
ilist* lst1 = lst -> next; // Удаляемый элемент
int x = lst1->num;
lst1 = lst1->next; // Определение следующего после удаляемого
lst->next = lst1; // Он делается следующим вместо удаляемого
return(x);
}


// Вставка или добавление элемента в конец списка
float ins_end(ilist *&il, int nm)
{
ilist* lst = il;
while (lst->next) // Отыскание последнего элемента
lst = lst->next;
ilist* lst1 = new ilist; // Создание вставляемого элемента
lst1->num = nm;
lst1->next = NULL;
lst->next = lst1; // Его вставка
return(0);
}

// Удаление последнего элемента с конца списка
float del_end(ilist *&il)
{
ilist* lst = il;
ilist* lst1 = il;
while (lst->next) // Отыскание последнего и предпоследнего элементов
{
lst1 = lst;
lst = lst->next;
}
lst1->next = NULL; // Предпоследний элемент списка делается последним
int x=lst->num;
return(x);
}

// Поиск элемента с данным номером
ilist* find_pos(ilist *&il, int k)
{
ilist* lst = il;
for (int i = 1; i<k; i++)
lst = lst->next;
return(lst);
}

// Печать списка
float print_list(ilist *&lst)
{
if(!lst) return(0);
cout << lst->num << '\t';
ilist* nlst;
nlst=lst->next;
while (nlst)
{
int k=nlst->num;
cout << k << '\t';
nlst=nlst->next;
}
cout << endl;
return(0);
}

// Ввод вещественного(ых) числа(ел)
float ninp()
{
float n;
cout << "Введите вещественное число - ";
cin >> n;
return(n);
}


// Ввод списка
ilist* linp()
{
ilist* lst = NULL;
float n;
cout << "Введите список вещественных чисел через пробел. Для окончания введите";
cout << " введите отрицательное число.\n";
cin >> n;
while (n>=0)
{
insert_begin(lst, n);
cin >> n;
}
return(lst);
}

// Удаление всех элементов равных данному
float del_all(ilist *&il, int n)
{
ilist* lst;
if (il->next == NULL) // Если элемент последний, то
{
if (il->num == n) // в случае, когда он равен n
il = NULL; // он удаляется
return(0);
}
if (il->num == n) // Если n – первый, он выбрасывается
il = il -> next;
lst = il->next;
del_all(lst, n); // Операция повторяется рекурсивно с хвостом
il->next = lst; // списка и он присоединяется к началу
return(0);
}

int main()
{
clrscr();
int n, k;
ilist* lst = NULL;
// Параметры экрана
struct text_info ti;
gettextinfo(&ti);
int WL = ti.winleft;
int WR = ti.winright;
int WT = ti.wintop;
int WB = ti.winbottom;

// Меню программы
cout << "1. Создать список.\n";
cout << "2. Добавить элемент.\n";
cout << "3. Удалить элемент из начала.\n";
cout << "4. Добавить элемент в позицию k.\n";
cout << "5. Удалить элемент из позиции k.\n";
cout << "6. Добавить элемент в конец .\n";
cout << "7. Удалить элемент в конце .\n";
cout << "8. Печать списка.\n";
cout << "9. Удаление всех элементов равных данному.\n";
cout << "10. Выход.\n";
// Часть экрана (окно) для вывода результатов
window(WL, WT+10, WR, WB);



// Выполнение операций над списком
while(1)
{
cout << "\nВведите номер действия - ";
cin >> n;
switch(n)
{
case 1:
lst=linp();
break;

case 2:
n = ninp();
insert_begin(lst, n);
break;

case 3:
del_begin(lst);
break;

case 4:
cout << "Введите номер позиции ";
cin >> k;
n = ninp();
insert_middle(lst, k, n);
break;

case 5:
cout << "Введите номер позиции ";
cin >> k;
cout << endl << " Удаляется " << find_pos(lst, k)->num << endl;
del_middle(lst, k);
break;

case 6:
n = ninp();
ins_end(lst, n);
break;

case 7:
del_end(lst);
break;

case 8:
break;

case 9:
n = ninp();
del_all(lst, n);
break;

default:
return(1);
}

print_list(lst);
cout << "\nНажмите кнопку Enter";
getch();
}
}





Обсуждение

Неизвестный
06.10.2008, 17:04
общий
это ответ
Здравствуйте, Михаил Степанович!

Так у Вас же переменные целые!
В самом элементе списка:

int num; // Объявление переменной

и во всех функциях тоже. int - целый знаковый тип! Замените на float или double.
Неизвестный
06.10.2008, 17:24
общий
это ответ
Здравствуйте, Орлов Михаил Степанович!
Причин куча.
1. Тип данных в списке у Вас был объявлен int, что является целым числом, вещественные при присваивании ему будут обрезаться
struct ilist // Создание списочной структуры
{
int num; // Объявление переменной
ilist *next; // Указатель на следующей список
};
Вещественными типами являются float и double.
2. Тип данных для ввода также был объявлен целым.
3. Все функции принимающие как аргумент число, которое нужно добавить принимали целое, а не вещественное.

В приложении исправленный код.

Приложение:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

struct ilist // Создание списочной структуры
{
float num; // Объявление переменной
ilist *next; // Указатель на следующей список
};

ilist* find_pos(ilist *&il, int k); // Инициализация функции поиска позиции k


// Добавление (вставка) элемента в начало списка
void insert_begin(ilist *&il, float k)
{
ilist *r = new ilist;
r->num = k;
r->next=il;
il=r;
}

// Удаление первого элемента: второй становится началом
float del_begin(ilist *&il)
{
ilist *r=il;
float x=r->num;
il=r->next;
return x;
}

// Вставка или добавление элемента в середину списка
float insert_middle(ilist *&il, int k, float nm)
{
ilist* lst = find_pos(il, k-1); // Элемент списка распологается перед местом вставки
ilist* lst1 = lst-> next; // Элемент списка распологается после места вставки
ilist* tmpList = new ilist; // Создаётся новый элемент списка
tmpList->num = nm;
tmpList->next = lst1;
lst->next = tmpList;
return(0);
}

// Удаление элемента из середины списка
float del_middle(ilist *&il, int k)
{
if(k<=1) // Если k=1, то происходит удаление первого элемента
{
del_begin(il);
return(0);
}
ilist* lst = find_pos(il, k - 1); // Последний элемент помещается перед удаляемым
ilist* lst1 = lst -> next; // Удаляемый элемент
float x = lst1->num;
lst1 = lst1->next; // Определение следующего после удаляемого
lst->next = lst1; // Он делается следующим вместо удаляемого
return(x);
}


// Вставка или добавление элемента в конец списка
float ins_end(ilist *&il, float nm)
{
ilist* lst = il;
while (lst->next) // Отыскание последнего элемента
lst = lst->next;
ilist* lst1 = new ilist; // Создание вставляемого элемента
lst1->num = nm;
lst1->next = NULL;
lst->next = lst1; // Его вставка
return(0);
}

// Удаление последнего элемента с конца списка
float del_end(ilist *&il)
{
ilist* lst = il;
ilist* lst1 = il;
while (lst->next) // Отыскание последнего и предпоследнего элементов
{
lst1 = lst;
lst = lst->next;
}
lst1->next = NULL; // Предпоследний элемент списка делается последним
float x=lst->num;
return(x);
}

// Поиск элемента с данным номером
ilist* find_pos(ilist *&il, int k)
{
ilist* lst = il;
for (int i = 1; i<k; i++)
lst = lst->next;
return(lst);
}

// Печать списка
float print_list(ilist *&lst)
{
if(!lst) return(0);
cout << lst->num << '\t';
ilist* nlst;
nlst=lst->next;
while (nlst)
{
float k=nlst->num;
cout << k << '\t';
nlst=nlst->next;
}
cout << endl;
return(0);
}

// Ввод вещественного(ых) числа(ел)
float ninp()
{
float n;
cout << "Введите вещественное число - ";
cin >> n;
return(n);
}


// Ввод списка
ilist* linp()
{
ilist* lst = NULL;
float n;
cout << "Введите список вещественных чисел через пробел. Для окончания введите";
cout << " введите отрицательное число.\n";
cin >> n;
while (n>=0.f)
{
insert_begin(lst, n);
cin >> n;
}
return(lst);
}

// Удаление всех элементов равных данному
float del_all(ilist *&il, float n)
{
ilist* lst;
if (il->next == NULL) // Если элемент последний, то
{
if (il->num == n) // в случае, когда он равен n
il = NULL; // он удаляется
return(0);
}
if (il->num == n) // Если n – первый, он выбрасывается
il = il -> next;
lst = il->next;
del_all(lst, n); // Операция повторяется рекурсивно с хвостом
il->next = lst; // списка и он присоединяется к началу
return(0.f);
}

int main()
{
clrscr();
int n, k;
float num;
ilist* lst = NULL;
// Параметры экрана
struct text_info ti;
gettextinfo(&ti);
int WL = ti.winleft;
int WR = ti.winright;
int WT = ti.wintop;
int WB = ti.winbottom;

// Меню программы
cout << "1. Создать список.\n";
cout << "2. Добавить элемент.\n";
cout << "3. Удалить элемент из начала.\n";
cout << "4. Добавить элемент в позицию k.\n";
cout << "5. Удалить элемент из позиции k.\n";
cout << "6. Добавить элемент в конец .\n";
cout << "7. Удалить элемент в конце .\n";
cout << "8. Печать списка.\n";
cout << "9. Удаление всех элементов равных данному.\n";
cout << "10. Выход.\n";
// Часть экрана (окно) для вывода результатов
window(WL, WT+10, WR, WB);



// Выполнение операций над списком
while(1)
{
cout << "\nВведите номер действия - ";
cin >> n;
switch(n)
{
case 1:
lst=linp();
break;

case 2:
num = ninp();
insert_begin(lst, num);
break;

case 3:
del_begin(lst);
break;

case 4:
cout << "Введите номер позиции ";
cin >> k;
num = ninp();
insert_middle(lst, k, num);
break;

case 5:
cout << "Введите номер позиции ";
cin >> k;
cout << endl << " Удаляется " << find_pos(lst, k)->num << endl;
del_middle(lst, k);
break;

case 6:
num = ninp();
ins_end(lst, num);
break;

case 7:
del_end(lst);
break;

case 8:
break;

case 9:
num = ninp();
del_all(lst, num);
break;

default:
return(1);
}

print_list(lst);
cout << "\nНажмите кнопку Enter";
getch();
}
}
Форма ответа