1 Востаннє редагувалося sonik_20014 (13.01.2014 01:16:35)

Тема: Динамічні структури!!!

реалізувати операцію вставки нового елемента у відсортований список і операцію вилучення зі списку даних про 3-х студентів з найнижчим рейтинговим балом
вже зроблено пів програми потрібно тільки вилучити дані про 3-х студентів з найнижчим рейтинговим балом

#include <iostream> 
#include <fstream> 
#include <conio.h> 
#include <cstring> 
#include <Windows.h>
using namespace std;
struct info{
    char *surname; 
    char *name;
    char *date;
    int matan, diskr, prog, ist, kult;
};
struct sesiya{
    info data;
    sesiya *next;
};
sesiya *start = new sesiya, *p = new sesiya, *pp = new sesiya;
int quantity=0;    
void swap(info *, info *);
void sort(int);
void addItem();
void displayALL();
void komisiya();
void remove(int);
void main(){ 
    setlocale(LC_ALL,"UKR");
    char *lexems[9], **str = new char* [15];
    for(int i = 0; i < 15; i++ )//виділення пам'яті під **str
        str[i] = new char [200];

    if(!start || !p || !pp || !lexems || !str){
        cout<<"Недостатньо пам'яті!";
        _getch();
        return;
    }

    ifstream file1("student.txt"); 

    if (file1.fail()){ 
        cerr << "Помилка читання файлу" << endl; 
        exit(1); 
    }
    start = NULL;
    while (!file1.eof()){ 
        int k=0;
        file1.getline(str[quantity], 200);//зчитування рядка 
        //розбиття рядка на лексеми
        lexems[k]=strtok(str[quantity],"\t");
        while(lexems[k]){
            k++;
            lexems[k]=strtok(NULL,"\t");
        }
        p->data.surname=lexems[0];
        p->data.name=lexems[1]; 
        p->data.date=lexems[2];
        p->data.matan=atoi(lexems[3]);
        p->data.diskr=atoi(lexems[4]);    
        p->data.prog=atoi(lexems[5]);
        p->data.ist=atoi(lexems[6]);
        p->data.kult=atoi(lexems[7]);

        
        if(!start)//виконається лише раз
            start = p; 
        sesiya *pp = new sesiya; 
        p->next = pp; 
        p=pp; 
        quantity++;
    } 
    file1.close();
    delete [] str;
    p->next = NULL;
    displayALL();
    sort(quantity);
    cout<<"\n\nВiдбулося сортування за назвою в алфавiтному порядку.\n\n";
    displayALL();
    komisiya();
    
        
    char answer[4];
    cout<<"\nДодати новий запис yes/no ? ";
    cin>>answer;
    while(1){
        if(!strcmp(answer, "yes") || !strcmp(answer, "Yes") || !strcmp(answer, "YES")){
            while(p->next)
                p=p->next;
            addItem();
            sort(quantity);
            cout<<endl;
            displayALL();
            komisiya();
            
            

            cout<<"\nДодати новий запис yes/no ? ";
            cin>>answer;
        }    
        else if(!strcmp(answer, "no") || !strcmp(answer, "No") || !strcmp(answer, "NO"))
            break;
        else
            cin>>answer;
    }
    /*cout<<"\nВилучити 3-х студентiв з найнижчим рейтинговим балом yes/no ? ";
    cin>>answer;
    cout<<"\nСписок без 3-х студентiв з найнижчим рейтинговим балом:\n\n";
    while(1){
        int k=0;//допоміжна змінна, яка вказує чи відповідь так
        if(!strcmp(answer, "yes") || !strcmp(answer, "Yes") || !strcmp(answer, "YES")){
            
            remove(quantity);
            sort(quantity);
            displayALL();
            komisiya();
            break;
            
        }
        else if(!strcmp(answer, "no") || !strcmp(answer, "No") || !strcmp(answer, "NO"))
            break;
        else
            cin>>answer;}
        */
 _getch();
}
void swap(info *a, info *b)
{
    info *tmp;
    tmp=b;
    b=a;
    a=tmp;
}
void sort(int quantity){
    for(int j=0; j<quantity; j++){
        p = start;
        while(1){
            pp = p;
            p = p->next;
            if(!pp->next) 
                break;
            int k=0;
            if(pp->next->next!=NULL){
                while(pp->data.surname[k] && pp->next->data.surname[k]){
                    if((char)pp->data.surname[k]>(char)pp->next->data.surname[k]){
                        swap(pp->data, pp->next->data);
                        break;
                    }
                    else if((char)pp->data.surname[k]==(char)pp->next->data.surname[k])
                        k++;
                    else
                        break;
                }
            }
        }
    }
    pp->next = NULL;
}
void addItem(){
    sesiya *ptr = new sesiya;
    short length = 50;
    char *surname = new char[length];
    char *name = new char[length];
    char *date = new char[length];
    cin.ignore();
    cout<<"\nВведiть прiзвище: ";
    cin.getline(surname, length);
    ptr->data.surname = surname;
    cout<<"Введiть Iмя: ";
    cin.getline(name, length) ;
    ptr->data.name = name;
    cout<<"Введiть рiк: ";
    cin.getline(date, length) ;
    ptr->data.date = date;
    cout<<"Матан: ";
    cin>>ptr->data.matan;
    cout<<"КДМ: ";
    cin>>ptr->data.diskr;
    cout<<"ОП: ";
    cin>>ptr->data.prog;
    cout<<"Iстор: ";
    cin>>ptr->data.ist;
    cout<<"Культ: ";
    cin>>ptr->data.kult;
    ptr->next = start;
    start = ptr;
    quantity ++;
}
void displayALL(){
    p = start;
    cout<<"Прiзв\tIмя\tДата\t\tМатан\tКДМ\tОП\tIстор\tКульт\n";
    while(p->next){
        cout<<p->data.surname<<"\t"<<p->data.name<<"\t"<<p->data.date<<"\t"<<p->data.matan<<"\t"<<p->data.diskr<<"\t"<<p->data.prog<<"\t"<<
            p->data.ist<<"\t"<<p->data.kult<<endl;
        p = p->next;}
    }
void komisiya(){
    cout<<"\nСтуденти якi отримали 2 на iспитах\n\n";
    p = start;
    cout<<"Прiзв\tIмя\tДата\t\tМатан\tКДМ\tОП\tIстор\tКульт\n";
    while(p->next){
        if((p->data.matan==2) || (p->data.diskr==2) || (p->data.prog==2) || (p->data.ist==2) || (p->data.kult==2)){
            cout<<p->data.surname<<"\t"<<p->data.name<<"\t"<<p->data.date<<"\t"<<p->data.matan<<"\t"<<p->data.diskr<<"\t"<<p->data.prog<<"\t"<<
                p->data.ist<<"\t"<<p->data.kult<<endl;}
        p = p->next;
    }
}

допоможіть будь ласка буду дуже вдячний))

Post's attachments

student.txt 372 b, 140 downloads since 2014-01-13 

2 Востаннє редагувалося sonik_20014 (13.01.2014 01:17:44)

Re: Динамічні структури!!!

скинув файл

3

Re: Динамічні структури!!!

1. В умові сказано "операцію вставки нового елемента у відсортований список", а не "операції вставки нового елемента і сортування". Пояснюю: щоб вставити в сортований список, треба знайти місце елемента в середині списку і вставити новий елемент туди, тоді змінений список теж буде сортованим.
2. Для порівняння рядків є strcmp.
3. Якщо сортувати не за прізвищем, а за балом, то треба буде вилучити 3 елементи з кінця (чи з початку), що робиться елементарно.