Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2011, 18:33   #1
Unknown_Object
 
Аватар для Unknown_Object
 
Регистрация: 18.07.2009
Сообщений: 9
По умолчанию Изменение элемента стракта в функции.

Добрый день,

Моя задача была написать программу на С, которая из файла считывает результаты матчей АПЛ и создает турнирную таблицу и выводит в файл. Все работает отлично, но я хочу её более красиво оформить, а именно разбить части программы на функции, но вся проблема в том, что я пока ещё не знаю как изменять элементы массива из страктов в функции. Мне кажется, что тут нужно использовать двойные-поинтеры, но программа крешеться, так как я не совсем знаю, как получать доступ из функции к элементам стракта. Сорри, это самый первый вариант моего рабочего, потому он совсем не красивый, но вроде читабельный. Во вложении файл инпута, список результатов АПЛ по прошлый тур. (...бедьняга Ливерпуль (((. ) Я хотел бы только узнать, как правильно получать непосредственный доступ к элементу массива страктов (team_list[100].team_name)

Спасибо большое за помощь.


Вот мой код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 1000

struct team_data
{
	char team_name[MAX_LEN+1];
	int cpoints, cwins, cdraws, closses;
};

void find_identity(char team_stream, struct team_data **team_list, int *idf, int *r, int sc) 
{
     int i;
     
     for (i = 0; i < sc; i++)
      {
          if (strcmp(team_stream, *(*team_list[i]).team_name) == 0)
          {
            *idf = 1;
            *r = i;
            break;
          }  
      } 
}

int main(int argc, char *argv[])
{
  char str_tmp[MAX_LEN+1], *(token[1000]), team_home[MAX_LEN+1], team_away[MAX_LEN+1], team_temp[MAX_LEN+1][100];
  struct team_data team_list[100], max, temp;
  FILE *results_from, *table_in;
  int i, j, home, away, pos, tc, sc, idfh, idfa, hr, ar, g, rema, remh, ggg, lc, ch_u, mp;
  
  lc = 0;
  
  results_from = fopen("C:/Hurden/Full_result.txt", "r");
  table_in = fopen("C:/Hurden/1.txt", "w");
  
  team_list[0].cpoints = 0;

  if (results_from == NULL)
  {
     printf("Can't open %s\n", "C:/Hurden/1.txt");
     exit(EXIT_FAILURE);
  }

  else
  {
      
  while(ch_u != EOF)
   {
      ch_u = fgetc(results_from);
      if(ch_u == '\n')  
                    lc++;
   }
    
   rewind(results_from);
      
  for (g = 0; g <= lc ; g++)
  {
      
      fgets(str_tmp, MAX_LEN + 1, results_from);
      sscanf(str_tmp, "%*s%*s%*s%d",&ggg);
      if (ggg == 2010 || ggg == 2011)
         goto again;
    
      sscanf(str_tmp, "%*[^\t]%d-%d", &home, &away);
      sscanf(str_tmp, "%[^\t]", &team_home);
      sscanf(str_tmp, "%*[^\t]%*s%*[\t]%[^\t]", &team_away);
      
      find_identity(team_home, &team_list, &idfh, &hr, sc);
      

      // вот элемент кода который проверяет есть ли команда уже в списке команд или нет, то, что я хочу занести в функции. Или у меня кроме того неправленый вызов функции?  

      for (i = 0; i < sc; i++)
      {
          if (strcmp(team_away, team_list[i].team_name) == 0)
          {
            idfa = 1;
            ar = i;
            break;
          }  
      }     
      
      if (idfh == 0)
      {
         strcpy(team_list[sc].team_name, team_home);
         hr = sc;
         sc++;
      }
         
      if (idfa == 0) 
      {
         strcpy(team_list[sc].team_name, team_away);
         ar = sc;
         sc++;
      }
            
      if (home > away)
      {
         team_list[hr].cwins++;
         team_list[hr].cpoints+=3;
         team_list[ar].closses++;
      }
      else if (away > home)
      {
         team_list[ar].cwins++;
         team_list[ar].cpoints+=3;
         team_list[hr].closses++;
      }
      else if (away == home)
      {
         team_list[ar].cpoints++;      
         team_list[hr].cpoints++;
         team_list[ar].cdraws++;
         team_list[hr].cdraws++;     
      }
      again:
            
      ggg = 0;
  }    
  
  }
  
  max = team_list[0];
  for (i = 0; i < sc; i++)
  {
      for (j = 0; j < sc; j++)
      {
          if (team_list[i].cpoints > team_list[j].cpoints)
          {
             max = team_list[j];
             mp = j;
             
             team_list[mp] = team_list[i];
             team_list[i] = max;
          }
      }
  }
  
  for (i = 0; i < sc; i++)
  {
      printf("%2d. %-30s P:%d   W:%-2d   D:%-2d   L:%d\n",i+1, team_list[i].team_name, team_list[i].cpoints, team_list[i].cwins, team_list[i].cdraws, team_list[i].closses);
      fprintf(table_in, "%2d. %-30s P:%d   W:%-2d   D:%-2d   L:%d\n",i+1, team_list[i].team_name, team_list[i].cpoints, team_list[i].cwins, team_list[i].cdraws, team_list[i].closses);
  }
  
  fclose(results_from);
  fclose(table_in);

  printf("\n");
  system("PAUSE");
  return 0;
}
Вложения
Тип файла: txt Full_result.txt (16.4 Кб, 148 просмотров)
Liverpool FC supporter.

Последний раз редактировалось Unknown_Object; 12.01.2011 в 19:09.
Unknown_Object вне форума Ответить с цитированием
Старый 12.01.2011, 19:16   #2
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

>что я не знаю как изменять элементы массива из страктов в функции

очень просто

Код:
#define MAX_LEN 100
typedef struct team_data
{
   char team_name[MAX_LEN];
   int cpoints, cwins, cdraws, closses;
}S;

void func(char* arr)
{
    //do smth
}
int main()
{
    S s;
    func(&s.team_name[0]);
    return 0;
}
like-nix вне форума Ответить с цитированием
Старый 12.01.2011, 19:44   #3
Unknown_Object
 
Аватар для Unknown_Object
 
Регистрация: 18.07.2009
Сообщений: 9
По умолчанию

Спасибо большое, но проблема в том, что у меня проблема с массива страктов.

Сделав вызов как у вас непосредственно к элементу стракта все норм, но к элементу массива страктов программа крешется без ворнингов никаких(.

Просто я не вижу в чем может быть проблема? Как я понимаю тут "Memory violation exception", как мне бы сказала VC, но мы компилим под Dev C++.

Вот код фунции и вызова.

Код:
void find_identity(char team_stream, char** team_list, int *idf, int *r, int sc) 
{
     int i;
     
     for (i = 0; i < sc; i++)
      {
          if (strcmp(team_stream, *team_list[i]) == 0)
          {
            *idf = 1;
            *r = i;
            break;
          }  
      } 
}
Код:
find_identity(team_home, &team_list[100].team_name, &idfh, &hr, sc);
Liverpool FC supporter.
Unknown_Object вне форума Ответить с цитированием
Старый 12.01.2011, 19:56   #4
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

да крашится =)

потомучто у меня 1-а звездочка xD

и тут *team_list[i] звезда никчему

приведи полный листинг переделанной программы
like-nix вне форума Ответить с цитированием
Старый 12.01.2011, 19:57   #5
Unknown_Object
 
Аватар для Unknown_Object
 
Регистрация: 18.07.2009
Сообщений: 9
По умолчанию

Просто функция должна не получать 1 элемент из массива, она должна работать со всем массивом и проверять есть ли уже такая команда в массиве. Я знаю, что вполне возможно сделать это через linked list другим способом, но я не уверен, нужно ли будет там, чтоб функция работала непосредственно со всем массивом и для этого нужно будет программу очень изменить(

Изменяя звездочку программа также крашится, может проблема в вызове??? так как мы по сути оперируем с массивом из массивов чара.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 1000

struct team_data
{
	char team_name[MAX_LEN+1];
	int cpoints, cwins, cdraws, closses;
};

void find_identity(char team_stream, char** team_list, int *idf, int *r, int sc) 
{
     int i;
     
     for (i = 0; i < sc; i++)
      {
          if (strcmp(team_stream, team_list[i]) == 0)
          {
            *idf = 1;
            *r = i;
            break;
          }  
      } 
}

int main(int argc, char *argv[])
{
  char str_tmp[MAX_LEN+1], *(token[1000]), team_home[MAX_LEN+1], team_away[MAX_LEN+1], team_temp[MAX_LEN+1][100];
  struct team_data team_list[100], max, temp;
  FILE *results_from, *table_in;
  int i, j, home, away, pos, tc, sc, idfh, idfa, hr, ar, g, rema, remh, ggg, lc, ch_u, mp;
  
  lc = 0;
  
  results_from = fopen("C:/Hurden/Full_result.txt", "r");
  table_in = fopen("C:/Hurden/1.txt", "w");
  
  team_list[0].cpoints = 0;

  if (results_from == NULL)
  {
     printf("Can't open %s\n", "C:/Hurden/1.txt");
     exit(EXIT_FAILURE);
  }

  else
  {
      
  while(ch_u != EOF)
   {
      ch_u = fgetc(results_from);
      if(ch_u == '\n')  
                    lc++;
   }
    
   rewind(results_from);
      
  for (g = 0; g <= lc ; g++)
  {
      
      fgets(str_tmp, MAX_LEN + 1, results_from);
      sscanf(str_tmp, "%*s%*s%*s%d",&ggg);
      if (ggg == 2010 || ggg == 2011)
         goto again;
    
      sscanf(str_tmp, "%*[^\t]%d-%d", &home, &away);
      sscanf(str_tmp, "%[^\t]", &team_home);
      sscanf(str_tmp, "%*[^\t]%*s%*[\t]%[^\t]", &team_away);
      
      find_identity(team_home, &team_list[100].team_name, &idfh, &hr, sc);
      

      // âîò ýëåìåíò êîäà êîòîðûé ïðîâåðÿåò åñòü ëè êîìàíäà óæå â ñïèñêå êîìàíä èëè íåò, òî, ÷òî ÿ õî÷ó çàíåñòè â ôóíêöèè. Èëè ó ìåíÿ êðîìå òîãî íåïðàâëåíûé âûçîâ ôóíêöèè?  

      for (i = 0; i < sc; i++)
      {
          if (strcmp(team_away, team_list[i].team_name) == 0)
          {
            idfa = 1;
            ar = i;
            break;
          }  
      }     
      
      if (idfh == 0)
      {
         strcpy(team_list[sc].team_name, team_home);
         hr = sc;
         sc++;
      }
         
      if (idfa == 0) 
      {
         strcpy(team_list[sc].team_name, team_away);
         ar = sc;
         sc++;
      }
            
      if (home > away)
      {
         team_list[hr].cwins++;
         team_list[hr].cpoints+=3;
         team_list[ar].closses++;
      }
      else if (away > home)
      {
         team_list[ar].cwins++;
         team_list[ar].cpoints+=3;
         team_list[hr].closses++;
      }
      else if (away == home)
      {
         team_list[ar].cpoints++;      
         team_list[hr].cpoints++;
         team_list[ar].cdraws++;
         team_list[hr].cdraws++;     
      }
      again:
            
      ggg = 0;
  }    
  
  }
  
  max = team_list[0];
  for (i = 0; i < sc; i++)
  {
      for (j = 0; j < sc; j++)
      {
          if (team_list[i].cpoints > team_list[j].cpoints)
          {
             max = team_list[j];
             mp = j;
             
             team_list[mp] = team_list[i];
             team_list[i] = max;
          }
      }
  }
  
  for (i = 0; i < sc; i++)
  {
      printf("%2d. %-30s P:%d   W:%-2d   D:%-2d   L:%d\n",i+1, team_list[i].team_name, team_list[i].cpoints, team_list[i].cwins, team_list[i].cdraws, team_list[i].closses);
      fprintf(table_in, "%2d. %-30s P:%d   W:%-2d   D:%-2d   L:%d\n",i+1, team_list[i].team_name, team_list[i].cpoints, team_list[i].cwins, team_list[i].cdraws, team_list[i].closses);
  }
  
  fclose(results_from);
  fclose(table_in);

  printf("\n");
  system("PAUSE");
  return 0;
}
Liverpool FC supporter.

Последний раз редактировалось Unknown_Object; 12.01.2011 в 20:01.
Unknown_Object вне форума Ответить с цитированием
Старый 12.01.2011, 19:58   #6
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

моя функция работает со всеми элементами массива =)
like-nix вне форума Ответить с цитированием
Старый 12.01.2011, 19:58   #7
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

верьте мне
like-nix вне форума Ответить с цитированием
Старый 12.01.2011, 20:00   #8
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

ушел жарить катлеты
like-nix вне форума Ответить с цитированием
Старый 12.01.2011, 20:05   #9
Unknown_Object
 
Аватар для Unknown_Object
 
Регистрация: 18.07.2009
Сообщений: 9
По умолчанию

Ок. Спасибо. Буду искать ошибку. Какой вызов у вашей функции?
Liverpool FC supporter.
Unknown_Object вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое изменение названия функции III-N. PHP 2 20.10.2010 19:00
Изменение функции на С++ D[I]K Помощь студентам 3 06.10.2009 19:09
input type='text' блокировать изменение элемента Damhurz HTML и CSS 2 18.04.2009 02:35
Изменение функции поля сводной таблицы Lal Microsoft Office Excel 3 05.03.2009 16:47
Дескрипторы потоков - Для каждого элемента списка необходимо создать поток, выполняющий требуемые функции kdv0403 Общие вопросы Delphi 2 09.06.2007 11:12