Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи по C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

annaleks

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите, пожалуйста, исправить программу по двусвязанным спискам в C++. Нужно найти среднее значение, элементы, меньшие среднего, удалить, а после элементов, больше среднего, добавить 1500. Почему-то иногда удаляются элементы, равные среднему значению. В чем ошибка?
# include <iostream.h>
# include <windows.h>
# include <iomanip.h>
# include <stdio.h>
# include <conio.h>
 
struct tochd  
{
    int inf;  
    tochd *left;  
    tochd *rigth;  
};  
 
int menu ();
void newochd (tochd **, tochd **);
void add_r (tochd *, int);  
void vvodochd (tochd *,tochd *);
void showochd (tochd *,tochd *);
void read_del (tochd *);
void delochd (tochd **, tochd **);
void zadanie (tochd *,tochd *);
 
 
int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
 
    tochd *sl,*sr;
    newochd(&sl,&sr);
    
    while (1)  
    {  
        switch (menu())  
        {  
            case 1: vvodochd (sl,sr); break;
 
            case 2:    showochd (sl,sr); break;  
 
            case 3: zadanie (sl,sr); showochd (sl,sr); break;
 
            case 4: if (sl->rigth!=sr) { delochd(&sl,&sr); cout <<"Очередь удалена!"<<endl; }
                    else cout <<"Очередь пустая!"<<endl; return 0;
 
            default: "Выберите правильно!";  
        }  
        puts("Press any key to continue");  
        getch();      
        system("cls");  
    }  
}
 
int menu ()  
{  
    cout<<"Выберите:"<<endl;  
    cout<<"1.Ввести значения:"<<endl;
    cout<<"2.Вывести исходный список"<<endl;  
    cout<<"3.Вывести измененный список"<<endl;
    cout<<"4.Удалить список. Выход"<<endl;  
    cout<<endl;
    int i;  
    cin >> i;  
    return i;  
}  
 
void newochd (tochd **sl, tochd **sr) // формирование первого элемента
{
    *sl=new tochd;  
    *sr=new tochd;  
    (*sl)->left=NULL;  
    (*sl)->rigth=*sr;  
    (*sr)->left=*sl;  
    (*sr)->rigth=NULL;
    return;
}  
 
void add_r (tochd *sp, int inf) // добавление элемента после заданного
{
    tochd *spt=new tochd;  
    spt->inf=inf;  
    spt->left=sp;  
    spt->rigth=sp->rigth;  
    sp->rigth=spt;  
    spt->rigth->left=spt;
    return;
}  
 
void vvodochd (tochd *sl,tochd *sr) // заполнение списка  
{
    int n, repeat;
    cout <<"Будете вводить значения? (1-да/0-нет):"<<" "; cin>>repeat;  
    if (repeat!=0 && repeat!=1) return;
        
    while (repeat)
    {
        cout <<"Введите число: "; cin>>n;  
        if (n>-50 && n<50) add_r(sl,n);
        else return;
        cout <<"Продолжить ввод? (да-1,нет-0): ";
        cin >>repeat;
        if (repeat!=0 && repeat!=1) return;
    }
}
 
void showochd (tochd *sl,tochd *sr) // печать списка
{
    if (sl->rigth==sr)  
    {
        cout <<"Очередь пустая!"<<endl;
        return;
    }
    tochd *p=sl;  
    while ((p=p->rigth)!=sr)
    {
        cout <<p->inf<<setw(5);
    }
    cout <<endl;
}
 
void read_del (tochd *sp) // чтение с удалением
{
    sp->left->rigth=sp->rigth;        
    sp->rigth->left=sp->left;  
    delete sp;    
}  
 
void delochd (tochd **sl, tochd **sr) // удаление очереди
{
    tochd *t;
    while( (*sl)->rigth != (*sr) )
    {
        t=(*sl)->rigth->rigth;
        delete (*sl)->rigth;
        (*sl)->rigth=t;
    }
    delete *sl;  *sl = NULL;  
    delete *sr;  *sr = NULL;  
    return;
}
 
void zadanie (tochd *sl,tochd *sr)  
{
    tochd *p=sl, *t;  
    int size=0; double srzn=0;
 
    while ((p=p->rigth)!=sr) size++;
     
    p=sl;
    while ((p=p->rigth)!=sr) srzn+=(double)p->inf/size;
    cout <<"Среднее значение элементов списка равно"<<" "<<srzn<<endl;
 
    p=sl->rigth;
    while (p!=sr)  
    {    
        if (p->inf<srzn)  
        {
            t=p->rigth;
            read_del(p);
            p=t;
        }
 
        else if (p->inf>srzn)
        {
            t=p->rigth;
            add_r(p,1500);
            p=t;
        }
        else p=p->rigth;
    }
}
 

Всего записей: 1 | Зарегистр. 02-05-2015 | Отправлено: 20:53 02-05-2015
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задачи по C/С++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru