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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проект в Борланде С++ 
V
    Опции темы
Winterlord
Дата 3.5.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, уважаемые программисты. Опять обращаюсь к вам за помощью.

Тема: Структуры, списки
Задание: Удалить все элементы с заданным значением (значение вводится с клавиатуры) или удалить список (выбирается после запуска программы). Список числовой. 
Во входном txt файле список, в выходном - изменённый список.

Программа разбита на 3 файла и полностью рабочая, но нужно сделать из неё проект (в Борланде С++ 3,1). Как ни подключай, как ни соединяй файлы - ничего не выходит, то переопределение, то недоопределение. Если есть время, подскажите плз как правильно подключить эти файлы в проект.


Код

//SPISOK.H
// структура элемента из списка
struct spis_element
{
 int value; // числовое значение
 struct spis_element *prev; // указатель на предыдущий элемент списка, если он NULL, то это первый элемент
 struct spis_element *next; // указатель на следующий элемент списка, если он NULL, то это последний элемент
};

struct spis_element *first;   // указатель на первый элемент списка
struct spis_element *current; // указатель на текущий элемент списка
struct spis_element *last;    // указатель на последний элемент списка

// функция загрузки чисел из файла и построение списка
void Create_spis_from_file(const char *filename);

// Функция записи списка в выходной файл
void Write_spis_to_file(const char *filename);

// Функция удаления заданного элемента из списка
void Delete(int value);

// Функция удаления всего списка
void Delete_all();


Код

//SPISOK.CPP
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "spisok.h"
//--------------------------------------------------------------------

// функция загрузки чисел из файла и построение списка
void Create_spis_from_file(const char *filename)
{
 int n;
 char str[100],*s;
 FILE *f=fopen(filename,"rt");
 struct spis_element *prev;

 first=NULL;
 current=NULL;
 prev=NULL;

 if(!f) return; // если файл не открывается, то выходим и не создаём список

 // читаем из файла все числа и запихиваем их в список
 while(fgets(str,100,f)) // читаем строку из файла
 {
    s=strtok(str," ,");
    while(s) // обрабатываем очередное число из строки
    {
       current=(struct spis_element*)malloc(sizeof(struct spis_element)); // выделяем память для элемента списка
       current->value=atoi(s); // числовое значение элемента
       current->prev=prev; // предыдущий элемент
       if(prev) prev->next=current; // следующий элемент предыдущего элемента
       if(!first) first=current; // первый элемент
       prev=current; // предыдущий элемент
       s=strtok(NULL," ,");
    }
 }
 if(current) current->next=NULL;
 last=current;
  
 fclose(f);
}
//--------------------------------------------------------------------

// Функция записи списка в выходной файл
void Write_spis_to_file(const char *filename)
{
 FILE *f=fopen(filename,"wt");

 if(!f) // если файл не создан, то пишем об ошибке
 {
    puts("Can not create out file!!!");
    return;
 }

 if(!first) // если список пустой, то и пишим в выходной файл, что он пустой
 {
    fputs("Spisok pustoj!!!",f);
    fclose(f);
    return;
 }
 
 // если список полный, то пишем список в файл
 current=first;
 do
 {    
    fprintf(f,"%d ",current->value);
    current=current->next;
 }while(current);

 fclose(f); 
}
//--------------------------------------------------------------------

// Функция удаления заданного элемента из списка
void Delete(int value)
{
 struct spis_element *temp; // временная переменная

 if(!first) return; // если список пустой, то выходим из функции

 current=first; 
 do
 {
    if(current->value==value) // если находим нужный элемент, то удаляем его
    {
       if(current==first) first=current->next; // корректируем указатель на первый элемент из списка
       if(current==last) last=current->prev; // корректируем указатель на последний элемент
       if(current->prev) current->prev->next=current->next; // корректируем указатель предыдущего элемента
       if(current->next) current->next->prev=current->prev; // корректируем указатель следующего элемента
       temp=current;       
       current=current->next; // переходим к следующему элементу         
       free(temp); // удаляем элемент из памяти       
    }else
    { 
       current=current->next; // переходим к следующему элементу
    }
 }while(current);
}
//--------------------------------------------------------------------

// Функция удаления всего списка
void Delete_all()
{
 struct spis_element *temp; // временная переменная

 if(!first) return; // если список пустой, то выходим из функции

 current=first;
 do
 {  
    temp=current->next;
    free(current);  // удаляем текущий элемент из памяти
    current=temp; // переходим к следующему элементу
 }while(current);

 first=NULL;
 last=NULL;
}
//--------------------------------------------------------------------

Код

//MAIN.CPP
#include <stdio.h>
#include <conio.h>
#include "spisok.cpp"

int main()
{
 int n;

 Create_spis_from_file("file.txt");

 if(!first)
 {
    puts("\nSpisok not created!");
    getch();
    return 1;
 }
 puts("\n1-delete value, 2-delete all");

 n=getch();
 if(n==49)
 {
  puts("\nEnter value: ");
  scanf("%d",&n);
  Delete(n);
 }else if(n==50) Delete_all();

 Write_spis_to_file("file_out.txt");
 
 return 0;
}


P.S. Если в Борланде совсем никак, подскажите плз как сделать в другом компиляторе. Заранее спасибо!

Это сообщение отредактировал(а) Winterlord - 3.5.2009, 21:35
PM MAIL ICQ   Вверх
bsa
Дата 3.5.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



думаю, в BC++ 3.1 это делается как-то через меню project. Думаю, туда нужно добавить два cpp файла.
h файл нужно подключать во всех cpp, в которых используются функции, объявленные в этом хидере - в твоем случае, в обоих.
#include "spisok.cpp" - вообще глупость, иклюдами нужно подключать h-файлы, потому что иначе смысла не было делить на несколько файлов.
PM   Вверх
Winterlord
Дата 3.5.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, По заданию надо поделить на файлы=)
А в чём вообще удобнее всего проект составлять?
PM MAIL ICQ   Вверх
math64
Дата 4.5.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Нужно создать проект spisok.prj (какое у него расширение не помню) через меню проект и добавить в него два файла - main.cpp и spisok.cpp
В main.cpp заменить #include "spisok.cpp" на #include "spisok.h" Если программа из одного файла проект не нужен
компиляция из командной строки bcc -e spisok.exe main.cpp spisok.cpp
PM   Вверх
Winterlord
Дата 4.5.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa
math64
Большое вам спасибо! Всё сделал;)

Это сообщение отредактировал(а) Winterlord - 4.5.2009, 16:50
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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