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

Поиск:

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


Новичок



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

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



спасибо за внимание, вставила новые строки, компилятор как будто бы не понимает что такое i, что он зацикливает и не считывает в массив структур
вот мой исходник

Код

#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;


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;
FILE *f=fopen("source.txt","r");
while feof(f)
{
fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
i=i+1;
}
fseek(f,0,SEEK_SET);
fclose(f);
printf("Inicializacia bazi\n");
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);
fopen("source.txt","r");
for(j=0;j<=i;j++)
{
fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
fputs("\n",f);
j=j+1;
}
fclose(f);
getch();}





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


Эксперт
****


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

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



МальвинаC, ну отформатируй код наконец - самой же искать ошибки будет проще. Например, так:
Код
void main()
{
   int i; //i содержит мусор
   int j;
   clrscr();
   FILE *f=fopen("source.txt","r");
   while feof(f)
   {
      fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
      i=i+1;
   }
   fseek(f,0,SEEK_SET);
   fclose(f);
   printf("Inicializacia bazi\n");
   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);
   fopen("source.txt","r");
   for(j=0;j<=i;j++)
   {
      fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
      fputs("\n",f);
      j=j+1;
   }
   fclose(f);
   getch();
}

В частности, где у тебя i инициализируется перед использованием в 106-й строке?

Кстати, что такое "компилятор не понимает" по твоему? Когда компилятор не понимает, он выдает ошибку.
PM   Вверх
МальвинаC
Дата 15.4.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



он сейчас выдает фильм номер 1.... 
                              название...
                                 .....
                              фильм номер номер 2....
                              название
                                   .....
                                   ....
                                    ....
                             фильм номер 2013
тоесть i=2013?
да, я так понимаю, именно в 106 строчке
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 ужасное, что я не вижу ошибку, а сдавать завтра
PM MAIL   Вверх
bsa
Дата 15.4.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
int i; //после этой операции i содержит мусор
...
i = i + 1; //а в этой строке к "мусору" прибавляется 1
Что будет, если к мусору прибавить 1?  smile 
PM   Вверх
МальвинаC
Дата 15.4.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну я прописала i=0; он все равно не считывает, помоги пожалуйста исправить код.... я уже в панике....

Добавлено через 7 минут и 44 секунды
кстати j=j+1? в цикле for нужно убрать, но он все равно не считывает
PM MAIL   Вверх
bsa
Дата 15.4.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



feof() выдает 0, когда файл не достиг конца. while выполняется пока условие не равно нулю. Таким образом, цикл не выполняется никогда. Чтобы он выполнялся, нужно инвертировать условие:
Код
while( !feof(f) )...

Далее, когда ты пишешь цикл 
Код
for(i=0; i < 10; ++i)
то его компилятор преобразует в следующий код:
Код
i = 0;
while(i < 10) {
    ...
    ++i;
}
Поэтому инкрементировать j (j = j +1 или что тоже самое ++j) не надо внутри тела цикла.
PM   Вверх
МальвинаC
Дата 15.4.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну да, логично с файлами, и почему же он не считывает
PM MAIL   Вверх
bsa
Дата 15.4.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



МальвинаC, отформатируй весь свой код так, как я показал. Тогда и будем ошибки искать.
Кстати, ты !feof(f) сделала?
PM   Вверх
МальвинаC
Дата 15.4.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да, сделала) сейчас выложу код

Добавлено через 54 секунды
Код

void main()
{
   int i; //i содержит мусор
   int j;
   clrscr();
   FILE *f=fopen("source.txt","r");
   while (!feof(f))
   {
      fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
      i=i+1;
   }
   fseek(f,0,SEEK_SET);
   fclose(f);
   printf("Inicializacia bazi\n");
   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);
   fopen("source.txt","r");
   for(j=0;j<=i;j++)
   {
      fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
      fputs("\n",f);
   }
   fclose(f);
   getch();
}


Добавлено через 2 минуты и 5 секунд
ой, сейчас весь выложу

Добавлено через 10 минут и 54 секунды
сортировка проходит верно, ошибка где-то с файлами
Код

#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;


     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()
{
   int i; 
   int j;
   clrscr();
   FILE *f=fopen("source.txt","r");
   while (!feof(f))
   {
      fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
      i=i+1;
   }
   fseek(f,0,SEEK_SET);
   fclose(f);
   printf("Inicializacia bazi\n");
   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);
   fopen("source.txt","r");
   for(j=0;j<=i;j++)
   {
      fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
      fputs("\n",f);
   }
   fclose(f);
   getch();
}




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


Бывалый
*


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

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



Цитата(МальвинаC @  15.4.2008,  19:30 Найти цитируемый пост)

Код

fclose(f);
// ...
fopen("source.txt","r");

for(j=0;j<=i;j++)
{
  fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
  fputs("\n",f);
}
fclose(f);


а куда всё это записывается, ведь f закрыта.
проверьте ещё раз содержимое файла.
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



файл открыт для чтения когда мы записываем в массив структур, а для записи, когда записываем в файл

Добавлено через 2 минуты и 1 секунду
когда он заккрыт, мы просто выводим массив структур на экран
PM MAIL   Вверх
Optimus
Дата 15.4.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(МальвинаC @  15.4.2008,  19:30 Найти цитируемый пост)
 
Код

while (!feof(f))
{
  fscanf(f,"%20s  %20s %10s %4s %10s %10s",av[i].nazvanie,av[i].rejisser,av[i].strana,av[i].god_vipuska,av[i].stoimost,av[i].dohod);
   i=i+1;
}

// ...

for(j=0;j<=i;j++)
{
  fprintf(f,"%20s  %20s %10s %4s %10s %10s",av[j].nazvanie,av[j].rejisser,av[j].strana,av[j].god_vipuska,av[j].stoimost,av[j].dohod);
  fputs("\n",f);
}


а ничего что в файл записывается "\n", но не считывается.
Извиняюсь если где-то не прав, мало на С программировал.
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
МальвинаC
Дата 15.4.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я тоже мало) думаю ничего страшного, /n-переход на новую строку, а считывает он построчно.... хотя не знаю, я надеюсь на bsa smile 
PM MAIL   Вверх
Optimus
Дата 15.4.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(МальвинаC @  15.4.2008,  19:49 Найти цитируемый пост)
когда он заккрыт, мы просто выводим массив структур на экран 

файл открывается, но переменной f не присваивается

проверьте ещё раз содержимое файла. 

Это сообщение отредактировал(а) Optimus - 15.4.2008, 20:01
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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