Студентам.
Я не жадный, по мере работ буду выкладывать сюда, может кого спасет.
ЗЫ Если будут недочеты и ляпусы, то просьба не глупо критиковать, а указать точно что и где, т.к. делаю забесплатно, на качество не серчать :)
ЗЫЗЫ Для студентов: написано в MS Visual C++ 7
ЗЫЗЫЗЫ Предлагаю всю конструктивную критику по окончании разбора полетов удалять. Я свои топики уже снёс.
Задание:
Описать функцию, которая удаляет из списка за каж-дым вхождением элемента Е, значение которого введено с клавиатуры, один элемент, если такой есть и он отличен от Е.
<--- задание писал не я, таким выдали в инсте, и у меня ощущение, что человек даже русским языком не владеет :) --->
//------------------------------------------------------*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
//СТРУКТУРА ОДНОГО ЭЛЕМЕНТА СПИСКА
struct list_item
{
int val;
list_item *next;
};
//ФУНКЦИЯ ВЫВОДЯЩАЯ РУССКИЕ БУКВЫ В КОНСОЛЬ ДЕЙСТВИТЕЛЬНО РУССКИМИ :)
void rus_out(char *str)
{
char out_str[255];
CharToOem(str,out_str);
printf("%s",out_str);
return;
}
int main(void)
{
unsigned int numb;
list_item *start, *curr;
rus_out("Введите число элементов в списке: ");
scanf("%d",&numb);
if(numb<1)
{
rus_out("Введено недопустимое число!\nНажмите любую кнопку для завершения программы\n");
getch();
return 1;
}
rus_out("Введите элементы списка.\n");
start=(list_item*)malloc(sizeof(list_item));
scanf("%d",&(start->val));
start->next=0;
numb--;
//ЕСЛИ ЭЛЕМЕНТОВ БОЛЬШЕ ЧЕМ ОДИН, ТО НАЧИНАЕМ СЧИТЫВАНИЕ СПИСКА
if(numb)
{
// curr=new list_item;
curr=start;
for(;numb;numb--)
{
curr->next=(list_item*)malloc(sizeof(list_item));
curr=curr->next;
scanf("%d",&(curr->val));
curr->next=0;
}
}
//ВЫВОДИМ СПИСОК ДЛЯ КОНТРОЛЯ
rus_out("Введен список: |");
curr=start;
do
{
printf(" %d |",curr->val);
curr=curr->next;
}while(curr);
printf("\n");
rus_out("Введите элемент Е: ");
int E;
scanf("%d",&E);
//НАЧИНАЕМ ПОИСК ЭЛЕМЕНТА СОДЕРЖАЩЕГО ДАННОЕ ЗНАЧЕНИЕ
list_item *next_curr;
curr=start;
do
{
if(curr->val==E)
{
if(curr->next)
{
if(curr->val != curr->next->val)
{
next_curr=curr->next->next;
free(curr->next);
curr->next=next_curr;
}
}
}
curr=curr->next;
}while(curr);
//ВЫВОДИМ СПИСОК ДЛЯ ПРОВЕРКИ УДАЧНОСТИ УДАЛЕНИЯ
rus_out("Отредактированный список: |");
curr=start;
do
{
printf(" %d |",curr->val);
curr=curr->next;
}while(curr);
printf("\n");
//ОСВОБОЖДАЕМ ДИНАМИЧЕСКУЮ ПАМЯТЬ ВЫДЕЛЕННУЮ ПОД СПИСОК
curr=start;
do
{
start=curr;
curr=curr->next;
free(start);
}while(curr);
rus_out("Нажмите любую клавишу для завершения программы...\n");
getch();
return 0;
}
Задание: Определить класс-строку. В класс включить два кон-структора: для определения класса строки строкой сим-волов и путем копирования другой строки (объекта клас-са строки).
Определить операции над строками:
>> перевертывание строки (запись символов в об-ратном порядке);
++ нахождение наименьшего слова в строке.
*/
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
class x_string
{
char *priv_str;
bool get_string_from_user;
public:
x_string(char *str);
x_string(const x_string &obj);
~x_string();
void input();
void out();
char *get();
void operator>>(char *str);
char * operator++();
};
#define STRLEN 255
//ФУНКЦИЯ ВЫВОДЯЩАЯ РУССКИЕ БУКВЫ В КОНСОЛЬ ДЕЙСТВИТЕЛЬНО РУССКИМИ
void rus_out(char *str)
{
char out_str[255];
CharToOem(str,out_str);
printf("%s",out_str);
return;
};
//СОЗДАНИЕ ОБЪЕКТА ПО СТРОКЕ
x_string::x_string(char *str)
{
priv_str=str;
get_string_from_user=0;
}
//СОЗДАНИЕ ОБЪЕКТА ПРИ ПОМОЩИ КОПИРОВАНИЯ СТРОКИ ИЗ ДРУГОГО ОБЪЕКТА
//ЧЕРЕЗ КОНСТРУКТОР КОПИЙ
x_string::x_string(const x_string &obj)
{
priv_str=new char[strlen(obj.priv_str)+1];
memcpy(priv_str,obj.priv_str,strlen(obj.priv_str));
priv_str[strlen(obj.priv_str)]=0;
get_string_from_user=0;
}
char * x_string::get()
{
return priv_str;
}
void x_string::out()
{
cout<<priv_str<<endl;
}
void x_string::input()
{
get_string_from_user=1;
priv_str=new char[255];
gets(priv_str);
}
x_string::~x_string()
{
if(get_string_from_user)
delete[] priv_str;
}
//ПЕРЕГРУЖАЕМ ОПЕРАТОР >>
void x_string::operator >>(char *str)
{
int i=strlen(priv_str);
for(--i;i >-1 ;i--)str[strlen(priv_str)-1-i]=priv_str;
return;
}
//ПЕРЕГРУЖАЕМ ОПЕРАТОР ++
char * x_string::operator++()
{
if(!strcmp(priv_str,""))return 0;//ЕСЛИ СТРОКА ПУСТАЯ
unsigned int start_pos=0;//СТАРТОВАЯ ПОЗИЦИЯ САМОГО КОРОТКОГО СЛОВА
unsigned int word_len=0xFFFFFFFF;//СЛОВ ДЛИННЕЕ УЖ ТОЧНО НЕ БЫВАЕТ
unsigned int x_len=0;//ПЕРЕМЕННАЯ ДЛЯ ПОДСЧЕТА ДЛИННЫ ТЕКУЩЕГО СЛОВА
//НАЧИНАЕМ ПОИСК САМОГО КОРОТКОГО СЛОВА
for(int i=0;i<=strlen(priv_str);i++)
{
if(priv_str==' ' || priv_str=='\0')//СЛОВО ЗАКОНЧИЛОСЬ ЕСЛИ ВСТРЕТИЛСЯ
//ПРОБЕЛ ЛИБО КОНЕЦ СТРОКИ.
{ //СРАВНИВАЕМ ЕГО ДЛИННУ С ДЛИННОЙ ПРЕДЫДУЩЕГО СЛОВА
if((x_len < word_len) && (x_len !=0))//И ЕСТЬ ЛИ ВООБЩЕ У НЕГО ДЛИННА
{
word_len=x_len;
start_pos=i - x_len;//ВЫЧИСЛЯЕМ СТАРТОВУЮ ПОЗИЦИЮ НАШЕГО СЛОВА
}
x_len=0;//ОБНУЛЯЕМ СЧЕТЧИК ДЛИННЫ ДЛЯ СЛЕДУЮЩЕГО СЛОВА
}
else x_len++;
}
if(word_len==0xFFFFFFFF && !start_pos)return 0;//ВВЕЛИ СПЛОШНЫЕ ПРОБЕЛЫ
char *word=new char[word_len+1];//БУФЕР В КОТОРОМ БУДЕТ ВОЗВРАЩЕНО САМОЕ КОРОТКОЕ СЛОВО
memset(word,0,word_len+1);//ОЧИЩАЕМ ЕГО
memcpy(word,&priv_str[start_pos],word_len);//КОПИРУЕМ ИЗ ИСХОДНОЙ СТРОКИ В ВОЗВРАЩАЕМУЮ
return word;//ГОТОВО
}
int main()
{
rus_out("Введите строку: ");
x_string obj1("");
obj1.input();//ВВОДИМ СТРОКУ В ПЕРВЫЙ ОБЕКТ
x_string obj2(obj1);//ИНИЦИАЛИЗИРУЕМ ВТОРОЙ ЗНАЧЕНИЕМ ИЗ ПЕРВОГО
char *str=new char[STRLEN];
memset(str,0,255);
rus_out("Перевернутая строка: ");
obj1>>str;//ПЕРЕВОРАЧИВАЕМ НАШУ ИСХОДНУЮ СТРОКУ В ПЕРЕМЕННУЮ str
cout<<str<<endl;
//ИЩЕМ САМОЕ КОРОТКОЕ СЛОВО В СТРОКЕ ИЗ ОБЕКТА 2
if(!obj2++)
rus_out("Пустая строка!\n");
else
{
rus_out("Самое короткое слово в строке: ");
cout<<obj2++<<endl;
}
return 0;
}
ЗЫ В плюсах я совсем слаб, по этому буду благодарен за конструктивные предложения.
Определить класс-строку. В класс включить два кон-структора: для определения класса строки строкой сим-волов и путем копирования другой строки (объекта клас-са строки). Предусмотреть функции поиска слова в стро-ке и добавления другой строки, начиная с позиции N
*/
#include <iostream.h>
#include <windows.h>
#include <string.h>
#include <stdio.h>
//ФУНКЦИЯ ВЫВОДЯЩАЯ РУССКИЕ БУКВЫ В КОНСОЛЬ ДЕЙСТВИТЕЛЬНО РУССКИМИ
void rus_out(char *str)
{
char out_str[255];
CharToOem(str,out_str);
printf("%s",out_str);
return;
};
//ФУНКЦИЯ ПРЕОБРАЗУЮЩАЯ РУССКИЕ БУКВЫ В char
char *rus_in(void)
{
char in_str[255];
char ret_str[255];
scanf("%s",in_str);
OemToChar(in_str,ret_str);
return ret_str;
};
//ОБЪЯВЛЯЕМ КЛАСС-СТРОКУ
class x_string
{
char *priv_str;
bool get_string_from_user;
public:
x_string(char *str);
x_string(const x_string &obj);
~x_string(){if(get_string_from_user)delete[] priv_str;}
void input();//ВВОД С КЛАВИАТУРЫ
void out();//ВЫВОД НА ЭКРАН
char *get();//ВОЗВРАЩЕНИЕ ЗНАЧЕНИЯ СТРОКИ
int search(char *word);//ПОИСК СЛОВА В СТРОКЕ
void insert(char *fragm, int pos);//ДОБАВЛЕНИЕ ФРАГМЕНТА В СТРОКУ
};
//СОЗДАНИЕ ОБЪЕКТА ПО СТРОКЕ
x_string::x_string(char *str)
{
priv_str=str;
get_string_from_user=0;
}
//СОЗДАНИЕ ОБЪЕКТА ПРИ ПОМОЩИ КОПИРОВАНИЯ СТРОКИ ИЗ ДРУГОГО ОБЪЕКТА
x_string::x_string(const x_string &obj)
{
priv_str=new char[strlen(obj.priv_str)+1];
memcpy(priv_str,obj.priv_str,strlen(obj.priv_str));
priv_str[strlen(obj.priv_str)]=0;
get_string_from_user=0;
}
void x_string::input()
{
get_string_from_user=1;
priv_str=new char[255];
char *buf=new char[255];
gets(buf);
OemToChar(buf,priv_str);
delete [] buf;
}
void x_string::out()
{
char *buf=new char[255];
CharToOem(priv_str,buf);
cout<<buf<<endl;
delete [] buf;
}
char * x_string::get()
{
return priv_str;
}
//ФУНКЦИЯ ПОИСКА СЛОВА В СТРОКЕ
int x_string::search(char *word)
{
char *begin_str=strstr(priv_str,word);
if(begin_str)
{
//ВЫСЧИТЫВАЕМ НОМЕР ПОЗИЦИИ С КОТОРОЙ НАЧИНАЕТСЯ СЛОВО
//ПРИ ПОМОЩИ РАЗНОСТИ АДРЕСОВ УКАЗАТЕЛЕЙ
return ((begin_str-priv_str)/sizeof(char));
}
return -1;
}
//ЯРКИЙ ПРИМЕР ПЛОХОГО СТИЛЯ ПРОГРАММИРОВАНИЯ
//ТАК ПРОГРАММИРОВАТЬ НЕ НАДО, НО ПЕРЕДЕЛЫВАТЬ МНЕ УЖЕ ЛЕНЬ
//ФУНКЦИЯ ВСТАВЛЯЕТ/ДОБАВЛЯЕТ СТРОКУ
void x_string::insert(char *fragm, int pos)
{
int full_len=strlen(priv_str) + strlen(fragm) + 1;
char *buf=new char[full_len];
memset(buf,0,full_len);
memcpy(buf,priv_str,pos-1);
memcpy(buf+pos-1,fragm,strlen(fragm));
memcpy(buf + (pos-1) + strlen(fragm), priv_str + pos - 1, strlen(priv_str)- pos + 1);
if(get_string_from_user)delete [] priv_str;
priv_str=buf;
}
int main()
{
x_string obj1(""), obj2("");
int pos;
rus_out("Введите строку: ");
obj1.input();
rus_out("Введите слово для добавления/вставки: ");
obj2.input();
rus_out("Введите позицию с которой нужно вставить слово: ");
cin>>pos;
if(pos>strlen(obj1.get()))
{
rus_out("Введено число больше чем длинна строки, строка будет добавлена в конец:\n");
pos=strlen(obj1.get())+1;
}
else
if(pos<1)
{
rus_out("Т.к. значение меньше допустимого, то строка будет вставлена в начало:\n");
pos=1;
}
obj1.insert(obj2.get(),pos);
obj1.out();
rus_out("Введите строку в которой будет произведен поиск: ");
obj1.input();
rus_out("Введите искомое слово: ");
char *buf=rus_in();
pos=obj1.search(buf);
if(pos==-1)rus_out("Указанное слово не найдено\n");
else
{
rus_out("Позиция слова: ");
cout<<pos+1;
}
cout<<endl;
return 0;
}
(задаётся с клавиатуры) вида: автор, название, год издания, и
выводящую на экран все книги нужного автора в библиографическом
порядке(по году издания).*/
#include <windows.h>
#include <stdio.h>
#include <conio.h>
struct book
{
char avtor[255]; //ФИО АВТОРА
char caption[255]; //НАЗВАНИЕ КНИГИ
int year; //ГОД ИЗДАНИЯ
};
void rus_out(char *str);
bool sort_out(book *list, u_int numb, char *avtor);
int main(void)
{
u_int book_number=0;
rus_out("Введите количество книг: ");
scanf("%u",&book_number);
char avtor[255]="";
book *list=new book[book_number];
rus_out("Введите данные о книгах.\n");
for(u_int i=0;i<book_number;i++)
{
rus_out("Книга №"),printf("%d\n",i+1);
rus_out("Введите фамилию автора: ");scanf("%s",&list.avtor);
rus_out("Введите название книги: ");scanf("%s",&list.caption);
rus_out("Введите год издания: ");scanf("%d",&list.year);
};
rus_out("Введите имя автора книги которого требуется найти: ");
scanf("%s",&avtor);
sort_out(list,book_number,avtor);
rus_out("Программа выполнена. Нажмите любую кнопку для завершения.\n");
getch();
return 0;
}
bool sort_out(book *list, u_int numb, char *avtor)
{
u_int count=0;//ЧИСЛО КНИГ С СООТВЕТСТВУЮЩИМ АВТОРОМ
register u_int i;//ВСПОМОГАТЕЛЬНАЯ ПЕРЕМЕННАЯ ИСПОЛЬЗУЕМАЯ В ЦИКЛАХ
//СЧИТАЕМ, СКОЛЬКО У НАС КНИГ С НУЖНЫМ НАМ АВТОРОМ
for(i=0;i<numb;i++)
if(!strcmp(list.avtor,avtor))count++;
if(!count)
{
rus_out("Нет ни одной книги данного автора!\n");
return 0;
}
else
{
rus_out("Книг найдено: ");
printf("%d\n",count);
}
//СОЗДАЕМ МАССИВ УКАЗАТЕЛЕЙ НА НУЖНЫЕ НАМ КНИГИ
book **pt_list=(book**)malloc(sizeof(book*) * count);
u_int sort_pos=0;
//ИНИЦИАЛИЗИРУЕМ УКАЗАТЕЛИ АДРЕСАМИ НУЖНЫХ КНИГ
for(i=0;i<numb;i++)
if(!strcmp(list.avtor,avtor))
{
pt_list[sort_pos]=&list;
sort_pos++;
};
//ПРОИЗВОДИМ СОРТИРОВКУ СПИСКА
book *buf;
for(i=0; i < count - 1; i++)
{
for(u_int j=i+1; j < count; j++)
{
if(pt_list[j]->year < pt_list->year)
{
buf=pt_list;
pt_list=pt_list[j];
pt_list[j]=buf;
}
}
}
//ВЫВОДИМ ОТСОРТИРОВАННЫЙ СПИСОК
for(i=0;i<count;i++)
{
printf("%u. ",i+1);rus_out("Название: ");
printf("\"%s\", %d ",pt_list->caption,pt_list->year);
rus_out("год издания\n");
}
free(pt_list);//ОСВОБОЖДАЕМ ПАМЯТЬ ИЗ ПОД СПИСКА
return 1;
}
//ФУНКЦИЯ ВЫВОДЯЩАЯ РУССКИЕ БУКВЫ В КОНСОЛЬ ДЕЙСТВИТЕЛЬНО РУССКИМИ
void rus_out(char *str)
{
char out_str[255];
CharToOem(str,out_str);
printf("%s",out_str);
return;
}
Задание:
Описати клас ”домашня бібліотека”. Передбачити можливість роботи з довільним числом книг, пошуку книг за якою-небудь ознакою (наприклад, по автору або по року видання), додавання книг в бібліотеку, видалення книг з неї, сортування книг по різних полях. Написати програму, що демонструє роботу з цим класом.
НО писать программу не надо помогите только с двумя функциями это сортировка и удаления книги, а функции показать добавить и поиск я уже сделал.
Тоесть у меня есть текстовый файл:
lkjdf 1239
jkllk 2334
lkjbm 1000
и мне надо его отсортировать(по году) и функцию удаления книги(желательно по автору)
Пожалуйста помогите!
Задание:
Описати клас ”домашня бібліотека”. Передбачити можливість роботи з довільним числом книг, пошуку книг за якою-небудь ознакою (наприклад, по автору або по року видання), додавання книг в бібліотеку, видалення книг з неї, сортування книг по різних полях. Написати програму, що демонструє роботу з цим класом.
Нет, я конечно все понимаю, страна у нас интернациональная, но все же большинство участников форума говорят по русски и поймут данное задание с большим трудом. (я вразумил твое задание, но все же так не надо)
НО писать программу не надо помогите только с двумя функциями это сортировка
Ты СТРАШНЫЙ ЛЕНТЯЙ! Слов нет. См. выше - в моем предыдущем посте как раз есть функция сортировки.
и удаления книги, а функции показать добавить и поиск я уже сделал.
Тоесть у меня есть текстовый файл:
lkjdf 1239
jkllk 2334
lkjbm 1000
и мне надо его отсортировать(по году) и функцию удаления книги(желательно по автору)
Вопрос такой - у тебя все это счастье в массиве хранится, или в списке?
масива нету привожу:
main.cpp
[COLOR=BLUE]#include <stdlib.h>
void main ()
{
library lib;
char ch;
l1: clrscr();
printf("\n\n\n\n\t\tHOME LIBRARY\n\n");
printf("\n\n\n\n\t\tVuberete nugnoe deystvie:\n\n");
printf("\t\t\t1.Add book\n");
printf("\t\t\t2.Show book\n");
printf("\t\t\t3.Search book\n");
printf("\t\t\t4.Delete book\n");
printf("\t\t\t5.Sort book\n");
printf("\t\t\t6.Exit");
ch=getch();
switch(ch){
case '1': lib.add();goto l1;
case '2': lib.show();goto l1;
case '3': lib.find();goto l1;
case '4': lib.del();goto l1;
case '5': lib.sort();goto l1;
case '6': exit(1);
default : goto l1;
}
}
LAB6.CPP
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
class library {
public:
char a[20];
int y;
void add();
void del();
void find();
void sort();
void show();
};
void library :: add() {
clrscr();
char ch;
ofstream file("c:\\user\\lab6\\bi.txt",ios::app);
l1: printf("\n\nEnter Author:");
cin>>a;
printf("\n\nEnter Year:");
cin>>y;
file<<a<<" "<<y<<endl;;
printf("\n\nBook ADDED");
printf("\n\nMore?(y/n))");
ch=getch();
switch(ch) {
case 'y':goto l1;
default :break;
}
file.close();
}
void library :: show() {
clrscr();
printf("\n\n\tLIST LIBRARY\n\n");
ifstream file1("c:\\user\\lab6\\BI.TXT");
while (!file1.eof()){
file1>>a>>y;
cout<<"\t Author:"<<a<<"\t\t Year:"<<y<<endl;}
getch();
file1.close();
}
void library :: find() {
char b[20];
clrscr();
cout<<"\n\n\n\t\t\tWhat Authors to find?"; cin>>b;
ifstream file("c:\\user\\lab6\\bi.txt");
while(!file.eof())
{
file>>a>>y;
if(!strcmpi(a,b)){
cout<<"\n\t"<<a<<"\t"<<y<<endl;}
}
getch();
}
void library :: del()
{
???????????????????
getch();
}
void library :: sort(){
clrscr();
???????????????????
getch();
}
ДА нимагу я его отредактирыва яс отключены все нах поотключено пипец......йолы палы и тырнета капейки......
ДА нимагу я его отредактирыва яс отключены все нах поотключено пипец......
Я тебе открою большую тайну - я вообще не пользуюсь поддержкой JS в браузере, только в исключительных случаях вроде настройки маршрутизатора. И тем не менее посты оформлены достойным образом.
йолы палы и тырнета капейки......
А ты хочешь совсем на халяву решение получить? Что бы отредактировать один пост - много инета не надо. Поверь мне, я знаю, что такое мало инета.
Теперь по теме.
Т.к. тебе надо редактировать библиотеку в онлайне так сказать, то разумнее всего будет создать динамический список - см. мой самый первый пост. Только вместо ввода с клавиатуры поставь оператор чтения из файла в этот список. Удаление элемента - см. тот же самый пост.
Сортировка - пост номер 3. Там производится сортировка динамического списка.
Запись отредактированного списка в файл - см. как удаляется весь список в конце программы, и перед удалением каждого элемента записывай его в файл.
Т.к. ты юзаешь С++, то используй new & delete, а не malloc() & free() как это сделано у меня.
Попытайся хоть что-то сделать сам. Результат - на обозрение. Иначе помогать не стану. Если только кто другой поможет.
ЗЫ после тега [ code ] вовсе не надо ставить color - код сам посинеет.
MAIN.CPP
#include <stdlib.h>
void main ()
{
library lib;
char ch;
l1: clrscr();
printf("\n\n\n\n\t\tHOME LIBRARY\n\n");
printf("\n\n\n\n\t\tVuberete nugnoe deystvie:\n\n");
printf("\t\t\t1.Add book\n");
printf("\t\t\t2.Show book\n");
printf("\t\t\t3.Search book\n");
printf("\t\t\t4.Delete book\n");
printf("\t\t\t5.Sort book\n");
printf("\t\t\t6.Exit");
ch=getch();
switch(ch){
case '1': lib.add();goto l1;
case '2': lib.show();goto l1;
case '3': lib.find();goto l1;
case '4': lib.del();goto l1;
// case '5': lib.sort();goto l1;
case '6': exit(1);
default : goto l1;
}
}
LAB6.CPP
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
class library {
public:
char a[20];
int y;
void add();
void del();
void find();
void sort();
void show();
};
void library :: add() {
clrscr();
char ch;
ofstream file("c:\\user\\lab6\\bi.txt",ios::app);
l1: printf("\n\nEnter Author:");
cin>>a;
printf("\n\nEnter Year:");
cin>>y;
file<<a<<" "<<y<<endl;;
printf("\n\nBook ADDED");
printf("\n\nMore?(y/n))");
ch=getch();
switch(ch) {
case 'y':goto l1;
default :break;
}
file.close();
}
void library :: show() {
clrscr();
printf("\n\n\tLIST LIBRARY\n\n");
ifstream file("c:\\user\\lab6\\bi.TXT",ios::app);
while (!file.eof()){
file>>a>>y;
if(file.eof()){break;} else
cout<<"\t Author:"<<a<<"\t\t Year:"<<y<<endl;}
cout<<"\n\n\t\tPress any key to continue";
getch();
file.close();
}
void library :: find() {
char b[20];
clrscr();
cout<<"\n\n\n\t\t\tWhat Authors to find?\n"; cin>>b;
ifstream file("c:\\user\\lab6\\bi.txt");
while(!file.eof())
{
file>>a>>y;
if(!strcmpi(a,b)){
cout<<"\n\t"<<a<<"\t"<<y<<endl;}
}
cout<<"\n\n\t\tPress any key to continue";
getch();
}
void library :: del() {
char b[20];
clrscr();
cout<<"\n\n\n\t\t\tWhat Authors to DELETE?\n"; cin>>b;
ifstream file1("c:\\user\\lab6\\bi.txt");
ofstream file2("c:\\user\\lab6\\bi1.txt",ios::trunc);
while(!file1.eof())
{
file1>>a>>y;
if(strcmpi(a,b)){
if(file1.eof()){break;} else
file2<<a<<" "<<y<<endl;
}
}
cout<<"\n\n\t\tBook is Deleted";
cout<<"\n\n\t\tPress any key to continue";
file1.close();
file2.close();
ifstream file3("c:\\user\\lab6\\bi1.txt");
ofstream file4("c:\\user\\lab6\\bi.txt",ios::trunc);
while(!file3.eof()){
file3>>a>>y;
if(!strcmpi(a,a)){
if(file3.eof()){break;} else
file4<<a<<" "<<y<<endl;}}
file3.close();
file4.close();
getch();
}
Работает просто отлично. Но пажалуйста надо уже на завтра сдать полную лабу! помогите с сортировкой прошу очень пажалустаааааа!!!
Но пажалуйста надо уже на завтра сдать полную лабу! помогите с сортировкой прошу очень пажалустаааааа!!!
В С++ не шарю :) И что-то мне кажется ты муйней страдаешь. Файлов развел кучу.
Давай так: сделай чтение файла в масиив структур вида:
{
char avtor[255];
int year;
};
А я тебе сортировку этого массива напишу. Только это будет наверное уже вечером. (вечер у меня часов до 3-х ночи :))
struct book
{
char av[20];
int ye;
};
int size=0;
int i,j,x;
FILE *f1 = fopen("c:\\user\\lab6\\bi.TXT","w+t");
while(!feof){
size++;}
while(!feof){
fscanf(f1,"%s %d\n",book.av,book.ye);
for ( i=0; i < size; i++)
x = book.ye;
for ( j=i-1; j>=0 && book[j].ye > x; j--)
book[j+1].ye = book[j].ye;
book[j+1] = x;
}
for (int h = 0; h <size; h++)
printf ("%d ", book[h].ye);
}
getch();
fclose(f1);
}
ЗЫ:жду не дождусь вечера.......
#include <stdio.h>
#define NAME_LEN 255
struct book
{
char avtor[NAME_LEN];
int year;
};
int sort(void)
{
register u_int book_count,i;//ВСПОМОГАТЕЛЬНАЯ ПЕРЕМЕННАЯ ИСПОЛЬЗУЕМАЯ В ЦИКЛАХ
char name[NAME_LEN];
int year;
FILE *file=fopen("file.txt","r");
if(!file)return 0;
for(book_count=0;fscanf(file,"%s%d",name,&year)!=EOF;book_count++);//СЧИТАЕМ КОЛИЧЕСТВО ЗАПИСЕЙ
rewind(file);//УСТАНАВЛИВАЕМ УКАЗАТЕЛЬ НА НАЧАЛО ФАЙЛА
book *list=(book*)malloc(sizeof(book)*book_count);
if(!list)return 0;
for(i=0;fscanf(file,"%s%d",&list.avtor,&list.year)!=EOF;i++)
{
}
book buf;
for(i=0; i < book_count- 1; i++)
{
for(u_int j=i+1; j < book_count; j++)
{
if(list[j].year < list.year)
{
buf=list;
list=list[j];
list[j]=buf;
}
}
}
freopen("file.txt","w",file);
for(i=0;i<book_count;i++)
fprintf(file, "%s %d\n",list.avtor,list.year);
free(list);
fclose(file);
return 1;
}
int main(void)
{
if(!sort())printf("Sort faild!\n");
else printf("Sort succesed!\n");
return 0;
}
Надеюсь - сможешь сам вставить эту функцию в свою программу.
Ниже вылажую полностью готовую программу:
Описать класс "домашняя библиотека". Показует книги, удаляет книгу по автору, находит книгу по автору, добавить книгу в библиотеку, а также отсортировать по увеличению года.
Примечание: работает с двумя полями "АВТОР" "ГОД".
main.cpp
library lib;
char ch;
l1: clrscr();
printf("\n\n\n\n\t\tHOME LIBRARY\n\n");
printf("\n\n\n\n\t\tVuberete nugnoe deystvie:\n\n");
printf("\t\t\t1.Add book\n");
printf("\t\t\t2.Show book\n");
printf("\t\t\t3.Search book\n");
printf("\t\t\t4.Delete book\n");
printf("\t\t\t5.Sort book\n");
printf("\t\t\t6.Exit");
ch=getch();
switch(ch){
case '1': lib.add();goto l1;
case '2': lib.show();goto l1;
case '3': lib.find();goto l1;
case '4': lib.del();goto l1;
case '5': lib.sort();goto l1;
case '6': exit(1);
default : goto l1;
}
}
lab6.cpp
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
class library {
public:
char a[20];
int y;
void add();
void del();
void find();
void sort();
void show();
};
struct book
{
char avtor[25];
int year;
};
void library :: add() {
clrscr();
char ch;
ofstream file("c:\\user\\lab6\\bi.txt",ios::app);
l1: printf("\n\nEnter Author:");
cin>>a;
printf("\n\nEnter Year:");
cin>>y;
file<<a<<" "<<y<<endl;;
printf("\n\nBook ADDED");
printf("\n\nMore?(y/n))");
ch=getch();
switch(ch) {
case 'y':goto l1;
default :break;
}
file.close();
}
void library :: show() {
clrscr();
printf("\n\n\tLIST LIBRARY\n\n");
ifstream file("c:\\user\\lab6\\bi.TXT",ios::app);
while (!file.eof()){
file>>a>>y;
if(file.eof()){break;} else
cout<<"\t Author:"<<a<<"\t\t Year:"<<y<<endl;}
cout<<"\n\n\t\tPress any key to continue";
getch();
file.close();
}
void library :: find() {
char b[20];
clrscr();
cout<<"\n\n\n\t\t\tWhat Authors to find?\n"; cin>>b;
ifstream file("c:\\user\\lab6\\bi.txt");
while(!file.eof())
{
file>>a>>y;
if(!strcmpi(a,b)){
cout<<"\n\t"<<a<<"\t"<<y<<endl;}
}
cout<<"\n\n\t\tPress any key to continue";
getch();
}
void library :: del() {
char b[20];
clrscr();
cout<<"\n\n\n\t\t\tWhat Authors to DELETE?\n"; cin>>b;
ifstream file1("c:\\user\\lab6\\bi.txt");
ofstream file2("c:\\user\\lab6\\bi1.txt",ios::trunc);
while(!file1.eof())
{
file1>>a>>y;
if(strcmpi(a,b)){
if(file1.eof()){break;} else
file2<<a<<" "<<y<<endl;
}
}
cout<<"\n\n\t\tBook is Deleted";
cout<<"\n\n\t\tPress any key to continue";
file1.close();
file2.close();
ifstream file3("c:\\user\\lab6\\bi1.txt");
ofstream file4("c:\\user\\lab6\\bi.txt",ios::trunc);
while(!file3.eof()){
file3>>a>>y;
if(!strcmpi(a,a)){
if(file3.eof()){break;} else
file4<<a<<" "<<y<<endl;}}
file3.close();
file4.close();
getch();
}
void library :: sort() {
clrscr();
int book_count,i;
char name[25];
int year;
FILE *file=fopen("C:\\user\\lab6\\bi.txt","r");
for(book_count=0;fscanf(file,"%s %d",name,&year)!=EOF;book_count++);
rewind(file);
book *list=(book*)malloc(sizeof(book)*book_count);
for(i=0;fscanf(file,"%s %d",&list.avtor,&list.year)!=EOF;i++)
{}
book buf;
for(i=0; i < book_count- 1; i++)
{
for(int j=i+1; j < book_count; j++)
{
if(list[j].year < list.year)
{
buf=list;
list=list[j];
list[j]=buf;
}
}
}
freopen("c:\\user\\lab6\\bi.txt","w",file);
printf("\n\n\n\t\t\t\tBook Sorted!");
printf("\n\n\n\t\t\t\tPress any key to continue!");
for(i=0;i<book_count;i++)
fprintf(file, "%s %d\n",list.avtor,list.year);
free(list);
fclose(file);
getch();
}
Исправленно...лабу сдал....5)
{
char avtor[25];
int year;
[color=red] book *next;[/color]//ЭТО ИЗЛИШНЕ
};
Убери выделенное поле структуры - это я сам его туда случайно влепил. Вернее не случайно, сперва хотел сделать через однонаправленный список, но потом передумал и стал делать через массив. А поле это убрать забыл. Щас исправил.