2013-09-17 3 views
1

Я по-прежнему относительно новичок в C и у меня было 2 вопроса. У меня есть структура студентов:C программирование инициализирует массив структур и т. Д.

struct student{ 
     Name name; 
     Comment comment; 

     int ID; 
     float fee; 
    } 

Существует глобальный массив из 10000 студентов. Имя и комментарий - это структуры, которые содержат только указатели на символы. Кроме того, есть 5 функций:

 void InitStudent(); 
     BOOL AddNewStudent(); 
     BOOL DeleteStudent(); 
     BOOL ReportStudents(): 
     BOOL Cleanup(); 
  1. В InitStudents(), все студент идентификаторы должны быть инициализированы до -1. Не уверен, что это более простой способ сделать это, чем цикл через весь массив и инициализировать идентификаторы?

  2. В ReportStudents мы должны сообщать обо всех участвующих в базе данных, которые были добавлены. Проблема в том, что нет переменной StudentCount или что-то подобное. Функция DeleteStudent также может удалять студентов, оставляя пробелы в массиве (не могу изменить это). Также функции не могут принимать какие-либо параметры. Есть ли способ зацикливать или распечатать всех студентов без необходимости повторять 10000 раз, если ID не равен -1?

заранее спасибо

+0

Нужно ли быть массивом? Похоже, отличное место для использования связанного списка. – zubergu

+0

несчастливо да. Не разрешается изменять какой-либо код. Было бы намного проще со связанным списком. –

ответ

0
  1. Не очень, если вы сделаете это через функцию вам необходимо перебрать все из студенческих структур, чтобы установить идентификатор -1. Хотя, если вы всегда проверяете ID перед использованием структуры, вы можете сойти с memset, так как -1 имеет удобный битовый узор.

    /* assuming all_students is your array of struct student (and not a pointer 
    * to a block of memory) 
    */ 
    memset(all_students, -1, sizeof(all_students)); 
    
  2. Не без некоторых других средств слежения, которые студенты являются действительными, через другую структуру данных, такие как связанный список или bitmap.

+0

Да, это было бы проще со связанным списком ... к сожалению, это не может быть изменено. Просто хотел свести к минимуму завершение цикла becasue looping через 10000 раз для возможности только как 5 студентов - это отходы –

+0

memset работал как шарм :) спасибо –

0

В InitStudents(), все студент идентификаторы должны быть инициализированы до -1. Не уверен, что это более простой способ сделать это, чем цикл через весь массив и инициализировать идентификаторы?

Поскольку выражение инициализатора (-1) является константным выражением, вы могли бы технически инициализировать массив 10000-элемента с синтаксисом списка инициализатора, хотя я сомневаюсь, что вырабатывая десять тысяч структуры Инициализаторы, считается, что «проще». Цикл кажется жизнеспособным решением.

В ReportStudents мы должны сообщать обо всех участвующих в базе данных, которые были добавлены. Проблема в том, что нет переменной StudentCount или что-то подобное. Функция DeleteStudent также может удалять студентов, оставляя пробелы в массиве (не могу изменить это). Также функции не могут принимать какие-либо параметры. Есть ли способ зацикливать или распечатать всех студентов без необходимости повторять 10000 раз, если ID не равен -1?

Не совсем, если у вас есть массив, то вам нужно пройти через весь массив. 10000 элементов мало, однако это не должно быть проблемой с точки зрения времени выполнения.

0

Цитирование через массив - это самый простой способ сделать это.

На ваш второй вопрос все зависит от всей реализации. Вы можете отсортировать массив и сохранить следующую позицию пустого массива для своей вставки. Поэтому, когда вы сообщаете, вы можете просто зациклиться до последнего индекса, который, как известно, содержит действительного ученика (Id не является -1)

0

Что касается восстановления одного студента, может помочь index tree.

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

Операции поиска затем выполняются с использованием дерева, в результате чего индекс массива является результатом.

Смежные вопросы