Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печать данных двулинейного направленного списка, Проблема с выводом списка 
:(
    Опции темы
SubZero
  Дата 3.6.2008, 11:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Необходимо создать программу, формирующую двунаправленный линейный список из структур типа car:

struct car
{
     char *mark;
     char *colour;
     char *number;
}

Все части программы оформляются в виде функций:
1) ввод данных (выделение памяти, создание и заполнение вводимыми с клавиатуры данными элементов списка);
2) сохранение введенной информации в задаваемом пользователе файле;
3) восстановление списка (заполнение его информацией, считываемой из файла).

Написать программу необходимо именно на С!! Т.е. никаких классов и т.п. средств из С++ использовать нельзя

Использую компилятор Borland Turbo C++ 3.0. Данные упорно не печатаются. Не могу понять, в чем у меня ошибка..
Вот текст самой программы:

Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

struct avto
{
    char mark[20];
    char colour[20];
    char number[20];
};
struct record
{
    avto car;
    record *previous;
    record *next;
};

int ShowMenu()
{
char s[22];
int n;
do
{
    clrscr();
    printf("\n Выберите необходимый пункт меню:");
    printf("\n 1. Ввод данных с клавиатуры и запись их в файл");
    printf("\n 2. Вывод данных из файла\n");
    gets(s);
    n=atoi(s);
}
while ((n<1) || (n>2));
clrscr();
return n;
}

//ввод данных для списка
void InputAuto(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)
{
char s[22];
int n;
do
{
clrscr();
printf("\nВведите количество автомобилей ");
gets(s);
n = atoi(s);
} while (!(n>0));
for (int i=0;i<n;i++)
{
    ptrLast=new record;
    do
    {
     printf("\nВведите марку автомобиля ");
     s[0] = 20;
     cgets(s);
    }
    while (!(strlen(s)));
    strcpy(p->mark, s+2);
    strcpy(ptrLast->car.mark, s+2);
    do
    {
        printf("\nВведите цвет автомобиля ");
        s[0] = 20;
        cgets(s);
    }
    while (!(strlen(s)));
    strcpy(p->colour, s+2);
    strcpy(ptrLast->car.colour, s+2);

    do
    {
        printf("\nВведите номер автомобиля ");
        s[0] = 20;
        cgets(s);
    }
    while (!(strlen(s)));
    strcpy(p->number, s+2);
    strcpy(ptrLast->car.number, s+2);
    printf("\n");
    //включаем запись в список
    if (ptrFirst==NULL) //списка еще нет
    {
        ptrLast->previous = NULL;
        ptrLast->next = NULL;
        ptrFirst = ptrLast;
    }
    else //список уже существует
    {
        ptrCurrent = ptrFirst;
        //просмотр списка - поиск места для новой записи
        while (ptrCurrent)
        { if (strcmp(ptrLast->car.mark,ptrCurrent->car.mark)<0)
          {  //вставка новой записи перед ptrCurrent
             if (ptrFirst == ptrCurrent) //начало списка
             {
            ptrLast->previous = NULL;
            ptrFirst = ptrLast;
             }
             else  //вставка между записями
             {
            ptrCurrent->previous->next = ptrLast;
            ptrLast->previous = ptrCurrent->previous;
             }
          ptrCurrent->previous = ptrLast;
          ptrLast->next = ptrCurrent;
          break;//выход из цикла просмотра списка
          }
        if (ptrCurrent->next == NULL)
        {  //включаем запись в конец списка
           ptrLast->next = NULL;
           ptrLast->previous = ptrCurrent;
           ptrCurrent->next = ptrLast;
           break;
        }
        ptrCurrent = ptrCurrent->next;
         }  //конец цикла просмотра списка
    }  //включение записи выполнено

}
}

//сохранение данных из списка в файл
int SaveAutos(record *ptrFirst, record *ptrCurrent, record *ptrLast)
{
char path[30];
FILE *ptrFile;
printf("\n Введите название файла, в который будет сохранен список ");
gets(path);
if ((ptrFile=fopen(path,"w"))==NULL)
{
    puts("Не могу открыть файл \n");
    exit(1);
}
// запись в файл осуществляем полями
ptrCurrent=ptrFirst;
while (!(ptrCurrent==NULL))
{
    fprintf(ptrFile,"%s %s %s\n",ptrCurrent->car.mark,ptrCurrent->car.colour, ptrCurrent->car.number);
    ptrCurrent=ptrCurrent->next;
}
// в конце файла - спецкод '***'
fprintf(ptrFile,"***\n");
fclose(ptrFile);
return 0;
}

//перезапись списка из файла в динамическую память
void LoadAutos(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)
{
FILE *ptrFile;
char strFileString[40], path[30];
//открытие файла для чтения
printf("\nВведите название файла из которого будут считываться данные ");
gets(path);
if ((ptrFile=fopen(path,"r"))==NULL)
{
    puts("Не могу открыть файл \n");
    exit(1);
}
ptrFirst = NULL;
do
{
    // чтение из файла по полям пока не дошли до символа завершения "*"
    fscanf(ptrFile,"%s",strFileString);
    if (strFileString[0]!='*')
    {
        //выделение памяти под новый элемент
        ptrLast=(record *)malloc(sizeof(record));
        strcpy(p->mark,strFileString);
        fscanf(ptrFile,"%s %s\n",&(p->colour),&(p->number));
        ptrLast->car = *p;
        if (ptrFirst==NULL) //если списка еще нет
        {
            ptrLast->previous = NULL;
            ptrFirst = ptrLast;
            ptrLast->next = NULL;
            ptrCurrent = ptrFirst;
        }
        else //список уже существует
        {
            ptrCurrent = ptrLast;
            ptrLast->previous = ptrCurrent;
            ptrCurrent->next = ptrLast;
            ptrLast->next = NULL;
        }
    }
} while (strFileString[0]!='*');
fclose(ptrFile); //закрытие файла
}

//вывод элементов списка на экран
void ShowAuto(avto &car)
{
    printf(car.mark,"\n");
    printf(car.colour,"\n");
    printf(car.number,"\n");
}

// тело основной функции
int main()
{
    avto *p=NULL;
    record *ptrFirst=NULL, *ptrLast=NULL, *ptrCurrent;
    int n;
    n = ShowMenu();
    switch(n)
    {
    case 1:
        {
            //ввод данных
            InputAuto(p, ptrFirst, ptrCurrent, ptrLast);
            // вывод содержимого списка
            ptrCurrent=ptrFirst;
            while (ptrCurrent)
            {
                ShowAuto(ptrCurrent->car);
                ptrCurrent=ptrCurrent->next;
            }
            SaveAutos(ptrFirst, ptrCurrent, ptrLast);
            return(0);
            break;
        }
    case 2:
        {
            //загрузка данных из списка
            LoadAutos(p, ptrFirst,ptrCurrent, ptrLast);
            //печать списка
            ptrCurrent=ptrFirst;
            while (ptrCurrent)
            {
                ShowAuto(ptrCurrent->car);
                ptrCurrent=ptrCurrent->next;
            }
            return(0);
            break;
        }
    }
}


Заранее спасибо!


Это сообщение отредактировал(а) SubZero - 4.6.2008, 12:45
PM MAIL   Вверх
rrrFer
Дата 3.6.2008, 12:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



SubZero, 
используй кнопку КОД и напиши функцию для печати списка - ту которая не получается, искать ее в твоем коде мне, например, вломы
-------
вот тут уже ошибка:
Код

void InputAuto(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast);
//...
    record *ptrFirst=NULL, *ptrLast=NULL, *ptrCurrent;
    int n;
    n = ShowMenu();
    switch(n)
    {
    case 1:
        {
            //ввод данных
            InputAuto(p, ptrFirst, ptrCurrent, ptrLast);
//...

вы в функцию InputAuto передаете вообще не инициализированный указатель ptrCurrent, а также чтобы номально инициализировать, например, ptrFirst надо писать:  ptrFirst=new record; потому что, если написать record *ptrFirst=NULL; а потом пытаться использовать этот указатель, то компилятор(в зависимости от версии) может выдать ошибку
--------
вывод списка выглядит ПРИМЕРНО так:
Код

struct avto
{
    char mark[20];
    char colour[20];
    char number[20];
};
struct record
{
    avto car;
    record *previous;
    record *next;
};
void ShowAuto(avto &car){
    printf(car.mark,"\n");
    printf(car.colour,"\n");
    printf(car.number,"\n");
}
void PrintList(record ** Head){
    record *p=*pbeg;
    while(p){
        ShowAuto(p->car);
        p=p->next;
    }
}

примерно - потому что не проверял(у меня твоя программа вообще выдает ошибку почти в каждой строчке)

Это сообщение отредактировал(а) rrrFer - 3.6.2008, 12:29
PM MAIL WWW ICQ   Вверх
SubZero
Дата 3.6.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Цитата(rrrFer @ 3.6.2008,  12:04)
SubZero, 
используй кнопку КОД и напиши функцию для печати списка - ту которая не получается, искать ее в твоем коде мне, например, вломы
-------

вы в функцию InputAuto передаете вообще не инициализированный указатель ptrCurrent, а также чтобы номально инициализировать, например, ptrFirst надо писать:  ptrFirst=new record; потому что, если написать record *ptrFirst=NULL; а потом пытаться использовать этот указатель, то компилятор(в зависимости от версии) может выдать ошибку

rrrFer, огромное спасибо за помощь - программа заработала!!

Вы были правы, дело заключалось в указателях. Вместо:

Код

record *ptrFirst=NULL, *ptrLast=NULL, *ptrCurrent;


оказалось достаточным написать:

Код

record *ptrFirst, *ptrLast, *ptrCurrent;


Также я добавил функцию PrintList(), подобно вашему примеру:

Код

void PrintList(record *ptrHead)
{
    record *list=ptrHead;
    while (list) {
    ShowAuto (list->car);
    list=list->next;
    }
}


Таким образом в Турбо С++ 3.0 программа заработала. Теперь необходимо перенести проект в Visual Studio 2003 (Win32-приложение). Буду сейчас пробовать smile

Это сообщение отредактировал(а) SubZero - 3.6.2008, 14:18
PM MAIL   Вверх
SubZero
  Дата 3.6.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Поторопился я однако с выводами, вторая часть программы пока еще не работает (восстановление списка). Скорее всего ошибка лежит здесь:

Код

//перезапись списка из файла в динамическую память
void LoadAutos(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)
{
FILE *ptrFile;
char strFileString[40], path[30];
//открытие файла для чтения
printf("\nВведите название файла из которого будут считываться данные ");
gets(path);
if ((ptrFile=fopen(path,"r"))==NULL)
{
    puts("Не могу открыть файл \n");
    exit(1);
}
ptrFirst = NULL;
do
{
    // чтение из файла по полям пока не дошли до символа завершения "*"
    fscanf(ptrFile,"%s",strFileString);
    if (strFileString[0]!='*')
    {
        //выделение памяти под новый элемент
        ptrLast=(record *)malloc(sizeof(record));
        strcpy(p->mark,strFileString);
        fscanf(ptrFile,"%s %s\n",&(p->colour),&(p->number));
        ptrLast->car = *p;
        if (ptrFirst==NULL) //если списка еще нет
        {
            ptrLast->previous = NULL;
            ptrFirst = ptrLast;
            ptrLast->next = NULL;
            ptrCurrent = ptrFirst;
        }
        else //список уже существует
        {
            ptrCurrent = ptrLast;
            ptrLast->previous = ptrCurrent;
            ptrCurrent->next = ptrLast;
            ptrLast->next = NULL;
        }
    }
} while (strFileString[0]!='*');
fclose(ptrFile); //закрытие файла
}


Выходит сообщение об ошибке - "Null pointer assignment", видимо неправильно работаю с указателями.

Часть программы, где вызывается данная функция:

Код

case 2:
        {
            //загрузка данных из списка
            LoadAutos(p, ptrFirst,ptrCurrent, ptrLast);
            //печать списка
                        PrintList(ptrFirst);
            return(0);
            break;
        }


На всякий случай приведу текст всей программы:

Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>

struct avto
{
    char mark[20];
    char colour[20];
    char number[20];
};
struct record
{
    avto car;
    record *previous;
    record *next;
};

int ShowMenu()
{
char s[22];
int n;
do
{
    clrscr();
    printf("\n Выберите необходимый пункт меню:");
    printf("\n 1. Ввод данных с клавиатуры и запись их в файл");
    printf("\n 2. Вывод данных из файла\n");
    gets(s);
    n=atoi(s);
}
while ((n<1) || (n>2));
clrscr();
return n;
}

//
void InputAuto(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)
{
char s[22];
int n;
do
{
clrscr();
printf("\nВведите количество автомобилей ");
gets(s);
n = atoi(s);
} while (!(n>0));
for (int i=0;i<n;i++)
{
    ptrLast=new record;
    do
    {
     printf("\nВведите марку автомобиля ");
     s[0] = 20;
     cgets(s);
    }
    while (!(strlen(s)));
    strcpy(p->mark, s+2);
    do
    {
        printf("\nВведите цвет автомобиля ");
        s[0] = 20;
        cgets(s);
    }
    while (!(strlen(s)));
    strcpy(p->colour, s+2);
    do
    {
        printf("\nВведите номер автомобиля ");
        s[0] = 20;
        cgets(s);
    }
    while (!(strlen(s)));
    strcpy(p->number, s+2);
    ptrLast->car=*p;
    printf("\n");
    //включаем запись в список
    if (ptrFirst==NULL) //списка еще нет
    {
        ptrLast->previous = NULL;
        ptrLast->next = NULL;
        ptrFirst = ptrLast;
    }
    else //список уже существует
    {
        ptrCurrent = ptrFirst;
        //просмотр списка - поиск места для новой записи
        while (ptrCurrent)
        { if (strcmp(ptrLast->car.mark,ptrCurrent->car.mark)<0)
          {  //вставка новой записи перед ptrCurrent
             if (ptrFirst == ptrCurrent) //начало списка
             {
            ptrLast->previous = NULL;
            ptrFirst = ptrLast;
             }
             else  //вставка между записями
             {
            ptrCurrent->previous->next = ptrLast;
            ptrLast->previous = ptrCurrent->previous;
             }
          ptrCurrent->previous = ptrLast;
          ptrLast->next = ptrCurrent;
          break;//выход из цикла просмотра списка
          }
        if (ptrCurrent->next == NULL)
        {  //включаем запись в конец списка
           ptrLast->next = NULL;
           ptrLast->previous = ptrCurrent;
           ptrCurrent->next = ptrLast;
           break;
        }
        ptrCurrent = ptrCurrent->next;
         }  //конец цикла просмотра списка
    }  //включение записи выполнено

}
}

//сохранение данных из списка в файл
int SaveAutos(record *ptrFirst, record *ptrCurrent, record *ptrLast)
{
char path[30];
FILE *ptrFile;
printf("\n Введите название файла, в который будет сохранен список ");
gets(path);
if ((ptrFile=fopen(path,"w"))==NULL)
{
    puts("Не могу открыть файл \n");
    exit(1);
}
// запись в файл осуществляем полями
ptrCurrent=ptrFirst;
while (!(ptrCurrent==NULL))
{
    fprintf(ptrFile,"%s %s %s\n",ptrCurrent->car.mark,ptrCurrent->car.colour, ptrCurrent->car.number);
    ptrCurrent=ptrCurrent->next;
}
// в конце файла - спецкод '***'
fprintf(ptrFile,"***\n");
fclose(ptrFile);
return 0;
}

//перезапись списка из файла в динамическую память
void LoadAutos(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)
{
FILE *ptrFile;
char strFileString[40], path[30];
//открытие файла для чтения
printf("\nВведите название файла из которого будут считываться данные ");
gets(path);
if ((ptrFile=fopen(path,"r"))==NULL)
{
    puts("Не могу открыть файл \n");
    exit(1);
}
ptrFirst = NULL;
do
{
    // чтение из файла по полям пока не дошли до символа завершения "*"
    fscanf(ptrFile,"%s",strFileString);
    if (strFileString[0]!='*')
    {
        //выделение памяти под новый элемент
        ptrLast=(record *)malloc(sizeof(record));
        strcpy(p->mark,strFileString);
        fscanf(ptrFile,"%s %s\n",&(p->colour),&(p->number));
        ptrLast->car = *p;
        if (ptrFirst==NULL) //если списка еще нет
        {
            ptrLast->previous = NULL;
            ptrFirst = ptrLast;
            ptrLast->next = NULL;
            ptrCurrent = ptrFirst;
        }
        else //список уже существует
        {
            ptrCurrent = ptrLast;
            ptrLast->previous = ptrCurrent;
            ptrCurrent->next = ptrLast;
            ptrLast->next = NULL;
        }
    }
} while (strFileString[0]!='*');
fclose(ptrFile); //закрытие файла
}

//вывод элементов списка на экран
void ShowAuto(avto &car)
{
    cout<<car.mark<<"\n";
    cout<<car.colour<<"\n";
    cout<<car.number<<"\n";
}

// тело основной функции
int main()
{
    avto *p=NULL;
    record *ptrFirst, *ptrLast, *ptrCurrent;
    int n;
    n = ShowMenu();
    switch(n)
    {
    case 1:
        {
            //ввод данных
            InputAuto(p, ptrFirst, ptrCurrent, ptrLast);
            // вывод содержимого списка
            ptrCurrent = ptrFirst;
            while (ptrCurrent) {
       ShowAuto(ptrCurrent->car);
       ptrCurrent=ptrCurrent->next; }
            SaveAutos(ptrFirst, ptrCurrent, ptrLast);
            return(0);
            break;
        }
    case 2:
        {
            //загрузка данных из списка
            LoadAutos(p, ptrFirst,ptrCurrent, ptrLast);
            //печать списка
            ptrCurrent = ptrFirst;
            while (ptrCurrent) {
       ShowAuto(ptrCurrent->car);
       ptrCurrent=ptrCurrent->next; }      
            return(0);
            break;
        }
    }
}


P.S. Я новичок в программировании на С/С++, поэтому уж не обессудьте за корявый стиль..   smile 






Это сообщение отредактировал(а) SubZero - 4.6.2008, 11:21
PM MAIL   Вверх
rrrFer
Дата 3.6.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



SubZero, 

Цитата(SubZero @  3.6.2008,  14:16 Найти цитируемый пост)
Теперь необходимо перенести проект в Visual Studio 2003 (Win32-приложение).

функция clrscr(); там неработает
Цитата(SubZero @  3.6.2008,  14:43 Найти цитируемый пост)
  // чтение из файла по полям пока не дошли до символа завершения "*"

как я понял "*" вы используете, чтобы определить конец файла, дак вот, при достижении конца возвращается eof, а также есть фукция feof();, вобщем так:
Код

#include <iostream>
void main(){
    FILE *f;
    char tmp[255];
    f=fopen("file_name.txt","r");
    while(!feof(f)){
        fscanf(f,"%s",tmp);
        printf("%s\n",tmp);
    }
    system("pause");
}

Цитата

На всякий случай приведу текст всей программы:

а затем вы пишете программу(как будто бы вы ее и не правили, посмотрите мой предыдущий пост, я там уже писал, что вы в функцию передаете неправильно инициализированные указатели), вы пишите:
Код

    avto *p=NULL;
    record *ptrFirst, *ptrLast, *ptrCurrent;
    InputAuto(p, ptrFirst, ptrCurrent, ptrLast);

т.е. указтели есть а обьекта нет, можно исправить так:
   
Код

  avto *p=new avto;
     record *ptrFirst=new record, *ptrLast=new record, *ptrCurrent=new record;
     InputAuto(p, ptrFirst, ptrCurrent, ptrLast);

как я понял вы пишите компилятором не поддерживающим С++(где то в ващей программе видел malloc) вот вам предстоит и тут писать не new а malloc

Это сообщение отредактировал(а) rrrFer - 3.6.2008, 17:20
PM MAIL WWW ICQ   Вверх
SubZero
Дата 4.6.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Цитата(rrrFer @ 3.6.2008,  17:11)
SubZero, 

Цитата(SubZero @  3.6.2008,  14:16 Найти цитируемый пост)
Теперь необходимо перенести проект в Visual Studio 2003 (Win32-приложение).

функция clrscr(); там неработает
Цитата(SubZero @  3.6.2008,  14:43 Найти цитируемый пост)
  // чтение из файла по полям пока не дошли до символа завершения "*"

как я понял "*" вы используете, чтобы определить конец файла, дак вот, при достижении конца возвращается eof, а также есть фукция feof();, вобщем так:
Код

#include <iostream>
void main(){
    FILE *f;
    char tmp[255];
    f=fopen("file_name.txt","r");
    while(!feof(f)){
        fscanf(f,"%s",tmp);
        printf("%s\n",tmp);
    }
    system("pause");
}

Цитата

На всякий случай приведу текст всей программы:

а затем вы пишете программу(как будто бы вы ее и не правили, посмотрите мой предыдущий пост, я там уже писал, что вы в функцию передаете неправильно инициализированные указатели), вы пишите:
Код

    avto *p=NULL;
    record *ptrFirst, *ptrLast, *ptrCurrent;
    InputAuto(p, ptrFirst, ptrCurrent, ptrLast);

т.е. указтели есть а обьекта нет, можно исправить так:
   
Код

  avto *p=new avto;
     record *ptrFirst=new record, *ptrLast=new record, *ptrCurrent=new record;
     InputAuto(p, ptrFirst, ptrCurrent, ptrLast);

как я понял вы пишите компилятором не поддерживающим С++(где то в ващей программе видел malloc) вот вам предстоит и тут писать не new а malloc

Насчет clrscr() я в курсе, а что есть вместо нее?

Программу я исправил, просто там не так много изменений))

Ваш метод исправления указателей не подходит - вылетает ошибка. 

Пользуюсь компилятором Borland Turbo С++ 3.0. Само собой С++ он поддерживает smile

Насчет feof() знаю, просто мне показалось более наглядным использовать свой метод)


Что же касается

  
Код

  avto *p=new avto;
     record *ptrFirst=new record, *ptrLast=new record, *ptrCurrent=new record;
     InputAuto(p, ptrFirst, ptrCurrent, ptrLast);


то скорее всего это необходимо в Visual Studio 2003, там все-таки более строгий компилятор.

PM MAIL   Вверх
bronislav
Дата 4.6.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Цитата(SubZero @  4.6.2008,  08:20 Найти цитируемый пост)
Пользуюсь компилятором Borland Turbo С++ 3.0. Само собой С++ он поддерживает 

Он не поддерживает актуальный (текущий) стандарт.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
SubZero
Дата 4.6.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Цитата(bronislav @ 4.6.2008,  09:55)
Цитата(SubZero @  4.6.2008,  08:20 Найти цитируемый пост)
Пользуюсь компилятором Borland Turbo С++ 3.0. Само собой С++ он поддерживает 

Он не поддерживает актуальный (текущий) стандарт.

Мне это и не нужно)) Для более сложных задач есть Visual Studio smile
PM MAIL   Вверх
rrrFer
Дата 4.6.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



SubZero, 
Цитата

Насчет clrscr() я в курсе, а что есть вместо нее?

system("cls"); можно так.
PM MAIL WWW ICQ   Вверх
SubZero
Дата 4.6.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Вот еще возник вопрос. Данный код работает нормально:

Код

void ShowAuto(avto &car)
{
    cout<<car.mark<<"\n";
    cout<<car.colour<<"\n";
    cout<<car.number<<"\n";
}
...
int main()
...
ptrCurrent = ptrFirst;
while (ptrCurrent)
{
   ShowAuto(ptrCurrent->car);
   ptrCurrent=ptrCurrent->next;
}




Если же пытаюсь написать более правильно
Код

void ShowAuto(avto &car)
{
    cout<<car.mark<<"\n";
    cout<<car.colour<<"\n";
    cout<<car.number<<"\n";
}

void PrintList(record *ptrHead)
{
  record *list=ptrHead;
  while (list) {
    ShowAuto(list->car);
    list=list->next;
  }
}

...
int main()
...
PrintList(ptrFirst);


то программа вылетает с ошибкой. 

Думаю виновата функция 

Код

void InputAuto(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)


Насколько я понимаю она работает с копиями указателей, не изменяя при этом их значения. Проэтому после ее вызова значение ptrFirst по-прежнему не определено. Вроде бы нужно писать

Код

void InputAuto(avto &p, record &ptrFirst, record &ptrCurrent, record &ptrLast)


но тогда компилятор выдает вообще кучу ошибок.. 
С другой стороны в первом варианте также используется значение ptrFirst после вызова функции InputAutos и ошибки не возникает! Чудеса какие-то..  smile 
Честно говоря, не пойму, в чем же тогда дело? smile 

Это сообщение отредактировал(а) SubZero - 4.6.2008, 11:24
PM MAIL   Вверх
SubZero
Дата 4.6.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Оставлю пока проблемы с PrintList(), это не так важно. По-прежнему не могу разобраться, почему неправильно работает функция LoadAutos()

Код

//перезапись списка из файла в динамическую память
void LoadAutos(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)
{
FILE *ptrFile;
char strFileString[40], path[30];
//открытие файла для чтения
printf("\nВведите название файла из которого будут считываться данные ");
gets(path);
if ((ptrFile=fopen(path,"r"))==NULL)
{
    puts("Не могу открыть файл \n");
    exit(1);
}
ptrFirst = NULL;
do
{
    // чтение из файла по полям пока не дошли до символа завершения "*"
    fscanf(ptrFile,"%s",strFileString);
    if (strFileString[0]!='*')
    {
        //выделение памяти под новый элемент
        ptrLast=(record *)malloc(sizeof(record));
        strcpy(p->mark,strFileString);
        fscanf(ptrFile,"%s %s\n",&(p->colour),&(p->number));
        ptrLast->car = *p;
        if (ptrFirst==NULL) //если списка еще нет
        {
            ptrLast->previous = NULL;
            ptrFirst = ptrLast;
            ptrLast->next = NULL;
            ptrCurrent = ptrFirst;
        }
        else //список уже существует
        {
            ptrCurrent = ptrLast;
            ptrLast->previous = ptrCurrent;
            ptrCurrent->next = ptrLast;
            ptrLast->next = NULL;
        }
    }
} while (strFileString[0]!='*');
fclose(ptrFile); //закрытие файла
}


Выходит сообщение об ошибке - "Null pointer assignment", т.е. я неправильно работаю с указателями.

Часть программы, где вызывается данная функция:

Код

case 2:
        {
            //загрузка данных из списка
            LoadAutos(p, ptrFirst,ptrCurrent, ptrLast);
            //печать списка
            ptrCurrent = ptrFirst;
            while (ptrCurrent) {
               ShowAuto(ptrCurrent->car);
               ptrCurrent = ptrCurrent->next; }
            return(0);
            break;
        }


Написать программу нужно именно на С
Неужели никто не может сказать в чем проблема?  smile 
PM MAIL   Вверх
mes
Дата 4.6.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SubZero @  3.6.2008,  11:37 Найти цитируемый пост)
Написать программу необходимо именно на С!! Т.е. никаких классов и т.п. средств из С++ использовать нельзя


Цитата(SubZero @  4.6.2008,  11:13 Найти цитируемый пост)
    cout<<car.mark<<"\n";

в C нет cout

Цитата(SubZero @  4.6.2008,  11:13 Найти цитируемый пост)
void InputAuto(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)
Насколько я понимаю она работает с копиями указателей, не изменяя при этом их значения. Проэтому после ее вызова значение ptrFirst по-прежнему не определено. Вроде бы нужно писать

void InputAuto(avto *&p, record *&ptrFirst, record *&ptrCurrent, record *&ptrLast)

а лучше заведи примерно такую структуру
struct list
{
    record *ptrFirst;
    record *ptrCurrent;
     record *ptrLast;
}; 
и передавай ее вместо кучи параметров ))

Это сообщение отредактировал(а) mes - 4.6.2008, 13:29


--------------------
PM MAIL WWW   Вверх
SubZero
Дата 4.6.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Цитата(mes @ 4.6.2008,  13:15)
Цитата(SubZero @  3.6.2008,  11:37 Найти цитируемый пост)
Написать программу необходимо именно на С!! Т.е. никаких классов и т.п. средств из С++ использовать нельзя


Цитата(SubZero @  4.6.2008,  11:13 Найти цитируемый пост)
    cout<<car.mark<<"\n";

в C нет cout

Цитата(SubZero @  4.6.2008,  11:13 Найти цитируемый пост)
void InputAuto(avto *p, record *ptrFirst, record *ptrCurrent, record *ptrLast)
Насколько я понимаю она работает с копиями указателей, не изменяя при этом их значения. Проэтому после ее вызова значение ptrFirst по-прежнему не определено. Вроде бы нужно писать

void InputAuto(avto *&p, record *&ptrFirst, record *&ptrCurrent, record *&ptrLast)

а лучше заведи примерно такую структуру
struct list
{
    record *ptrFirst;
    record *ptrCurrent;
     record *ptrLast;
}; 
и передавай ее вместо кучи параметров ))

Виноват, насчет cout я, конечно, лажанулся))

Исправил заголовок функции InputAuto(), заодно у SaveAutos() и LoadAutos(). Теперь программа заработала!!!  smile 
Огромное спасибо  smile 

Единственное, немного смущает надпись "Null pointer assignment", которая все равно вылезает в ветви 2 программы по завершении распечатки данных.  smile 

Это сообщение отредактировал(а) SubZero - 4.6.2008, 14:22
PM MAIL   Вверх
mes
Дата 4.6.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(SubZero @  4.6.2008,  14:03 Найти цитируемый пост)
Единственное, немного смущает надпись "Null pointer assignment", 

немного??   smile 

а ты память выделяешь? сильно сомневаюсь..


--------------------
PM MAIL WWW   Вверх
SubZero
Дата 4.6.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Цитата(mes @ 4.6.2008,  14:51)
Цитата(SubZero @  4.6.2008,  14:03 Найти цитируемый пост)
Единственное, немного смущает надпись "Null pointer assignment", 

немного??   smile 

а ты память выделяешь? сильно сомневаюсь..

Да, немного) Дело в цикле while:

Код

while (ptrCurrent)
            {
               ShowAuto(ptrCurrent->car);
               ptrCurrent=ptrCurrent->next;
    }


В последней итерации цикла ptrCurrent становится равным NULL.

Что касается выделения памяти, то, само собой, я это делаю. Посмотри функции InputAuto() и LoadAutos() smile

P.S. Как правильно цитировать пост несколько раз по частям, что-то не пойму как это сделать..
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0837 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.