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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> язык С, структуры 
:(
    Опции темы
МальвинаC
Дата 13.4.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, столкнулась со следующей проблемой.прошу помочь) Задание: дан файл структур , необходимо упорядочить его по выбранному полю, и переписать уже отсортированный массив структур в этот же файл 
само упорядочивание реализовано в этой программе ,эта программа работает) но нужно её исправить так чтобы структуры не вводились с клавиатуры, а считывались из файла  а потом перезаписывались в этот же файл. 
Вот код:  Очень прошу помочь
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
struct film
{
char nazvanie[20];
char rejisser[20];
char strana[10];
char god_vipuska[4];
char stoimost[10];
char dohod[10];

}
 av[100];
const int M=100;

int init(void)
{
int i,j,l;
for(i=0;i<M-1;i++)
{printf("Vvedite nazvanie filma\n");
scanf("%s",av[i].nazvanie);
printf("Vvedite god vipuska filma\n");
scanf("%s",av[i].god_vipuska);
printf("Vvedite stoimost filma v tisachax rublei\n");
scanf("%s",av[i].stoimost);
printf("Vvedite rejissera avtomobilia\n");
scanf("%s",av[i].rejisser);
printf("Vvedite stranu proizvoditelya filma \n");
scanf("%s",av[i].strana);
printf("Vvedite dohod filma \n");
scanf("%s",av[i].dohod);
printf("\nEsli vi zakonchili vvodit nazmite 1, inache 0\n");
scanf("%d",&l);
printf("l ravno %i\n",l);
if(l==1){break;}
}
return i;
}
void sortirovka(int r, int w)
{int  i,j,obmen;i=0;
struct film buf;
switch (w)
{ case 1:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].nazvanie,av[j-1].nazvanie)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 2:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].rejisser,av[j-1].rejisser)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 3:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].strana,av[j-1].strana)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 4:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].god_vipuska,av[j-1].god_vipuska)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 5:
do
{i=i+1;
obmen=1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].stoimost,av[j-1].stoimost)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
case 6:
do
{i=i+1;
obmen= 1;
for (j=r;j>=i;j--)
{if (strcmp(av[j].dohod,av[j-1].dohod)<0) {buf=av[j];av[j]=av[j-1];av[j-1]=buf; obmen=0;}}}
while ((obmen==0) || (i==r));
break;
default: printf("Massiv ne otsortirovan\n");}}

void print(int k)
{ int i,l;
while( 1){
printf("esli vi xotite otsortirovat po:\n");
printf("nazvaniy filma nazmite 1\n");
printf("familii rejissera filma nazmite 2\n");
printf("strane proizvoditelya filma nazmite 3\n");
printf("godu vipuska filma nazmite 4\n");
printf("stoimosti filma nazmite 5\n");
printf("dohodu filma nazmite 6\n");
printf("esli vi ne xotite sortirovat nazmite 8:\n");
scanf("%i",&l);
if (l==8){break;};
sortirovka(k,l);
getch();
for(i=0;i<=k;i++)
{printf("\nFilm nomer %i\n",i+1) ;
printf("\n nazvanie_filma  \n%s",av[i].nazvanie);
printf("\n rejisser_filma\n %s",av[i].rejisser);
printf("\n strana_proizvoditel' filma \n %s",av[i].strana);
printf("\n god_vipuska_filma\n %s",av[i].god_vipuska);
printf("\n stoimost_filma\n %s",av[i].stoimost);
printf("\n dohod_filma\n %s",av[i].dohod);
 }
  }
}

void main()
{clrscr();
int i,j;
printf("Inicializacia bazi\n");
i=init();
printf("Kolichestvo filmov v baze =%i\n",i+1)  ;
printf("\nIznacalni spisok\n");
for(j=0;j<=i;j++)
{printf("\n Film nomer %i\n",j+1) ;
printf("\n nazvanie_filma \n%s",av[j].nazvanie);
printf("\n rejisser_filma %s",av[j].rejisser);
printf("\n strana_proizvoditel' filma\n %s",av[j].strana);
printf("\n god_vipuska_filma\n %s",av[j].god_vipuska);
printf("\n stoimost'_filma\n %s",av[j].stoimost);
printf("\n dohod filma\n %s",av[j].dohod);
getch();  }

printf("\nVivod s sortirovkoi\n");
print(i);
getch();}


Добавлено @ 09:08
мне очень нужна ваша помощь, все что я могла, я сделала) если кому не очень сложно, потратьте пожалуйста немного времени...

Это сообщение отредактировал(а) MAKCim - 13.4.2008, 09:10
PM MAIL   Вверх
jonie
Дата 13.4.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

FILE * myDataBase = fopen("C:\\mydb.dat", "wb");
struct film myFilmItem;
..// заполняем тута структуру//...
fwrite((char*)&myFilmItem, sizeof(myFilmItem), 1, myDataBase);

//а тут читаем//
FILE * myDataBase2 = fopen("C:\\mydb.dat", "rb");
struct film myFilmItemOther;
fread((char*)&myFilmItemOther, sizeof(myFilmItemOther), 1, myDataBase2);
//тут работаем со считанной структурой


только про проверки на ошибки забывать не стоит

Это сообщение отредактировал(а) jonie - 13.4.2008, 14:30


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
МальвинаC
Дата 13.4.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



jonie, спасибо тебе за внимание) я уже перепробавала множество функций, но видимо что-то не понимаю в их применении, можно попросить тебя применить эти функции к своей программе, если тебе конечно несложно smile  пожалуйста, очень прошу
PM MAIL   Вверх
МальвинаC
Дата 13.4.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




файл структур уже изначально задан...
PM MAIL   Вверх
МальвинаC
Дата 14.4.2008, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



неужели так сложно....
PM MAIL   Вверх
serega00
Дата 14.4.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



н-да что то вообще не понятно...
PM MAIL WWW   Вверх
Rififi
Дата 14.4.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хы. такаое впечатление, что функцию sortirovka ты нашла на какой-то помойке, впечатление оно конечно жуткое производит, был бы я менее закалённым в боях, мне бы по ночам кошмары снились :gigi:
я бы исправил её на такой вариант, или хотя бы отформатировал код.

// Сортировка по полю nazvanie
int __cdecl NazvanieComparer(const void* p1, const void* p2)
{
    const struct film* f1 = (const struct film*) p1;
    const struct film* f2 = (const struct film*) p2;
    return strcmp(f1->nazvanie, f2->nazvanie);
}

struct film* db; // массив структур film
size_t N = ...  // количество элементов в массиве

qsort(db, N, sizeof(struct film), NazvanieComparer);
PM MAIL   Вверх
МальвинаC
Дата 14.4.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Это сообщение отредактировал(а) МальвинаC - 14.4.2008, 17:09
PM MAIL   Вверх
bsa
Дата 14.4.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



МальвинаC, привязка к файлам осуществляется с помощью функций fopen, fclose, fseek, fprintf и fscanf. Тебе лишь надо заменить все scanf и printf отвечающие за ввод и вывод массива, на fscanf и fprintf, а так же добавить открытие и закрытие файла.
PM   Вверх
МальвинаC
Дата 15.4.2008, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



структуру не так просто считать из файла, в этом вся загвостка, записать в файл несложно, вот: 
Код

if((f=fopen("source.txt","wt"))==NULL)
{
printf("\n Error::Open File");
getch();
}
else
{
for (j=0;j<=CHET;j++)
{
fputs(av[j].nazvanie,f);
fputs(" ",f);
fputs(av[j].rejisser,f);
fputs(" ",f);
fputs(av[j].strana,f);
fputs(" ",f);
fputs(av[j].god_vipuska,f);
fputs(" ",f);
fputs(av[j].stoimost,f);
fputs(" ",f);
fputs(av[j].dohod,f);
fputs("\n",f);
fclose(f);
}
}

а вот как считать я не знаю, напишите если кто знает
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



здесь одна структура записывается в одну строку, поля через пробелы
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



если кто знает, напишите пожалуйста как...потому что я не понимаю...

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


Эксперт
****


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

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



МальвинаC, проще всего это делать так:
Код
struct film
{
   char nazvanie[21]; //не стоит забывать про символ '\0', который означает конец строки, поэтому массив увеличен на 1 символ
   char rejisser[21];
   char strana[11];
   unsigned god_vipuska;
   double stoimost;
   double dohod;
};

...

FILE *file;
struct film film;
....
//чтение структуры из файла
fscanf(file, "%20s %20s %10s %u %f %f", film.nazvanie, film.rejisser, film.strana, &film.god_vipuska, &film.stoimost, &film.dohod);
...
fseek(file, 0, SEEK_SET); //перемещение в начало файла
...
//запись структуры в файл
fprintf(file, "%s %s %s %u %g %g", film.nazvanie, film.rejisser, film.strana, film.god_vipuska, film.stoimost, film.dohod);
...
В данном коде под числовые поля структуры отводятся специально подходящих числовых типов.
PM   Вверх
МальвинаC
Дата 15.4.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо, более мненее ясно, сейчас попробую применить у себя, просто уверена, что сейчас начнут возникать проблемы smile 
PM MAIL   Вверх
bsa
Дата 15.4.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(МальвинаC @ 15.4.2008,  16:03)
спасибо, более мненее ясно, сейчас попробую применить у себя, просто уверена, что сейчас начнут возникать проблемы smile

Если тупо взять и засунуть, то да - будут проблемы. Надо подойти творчески.  smile 
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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