Я пытаюсь написать эффективную функцию, которая принимает значение как вход и проверяет это значение в массиве. Если значение существует в массиве, тогда возвращайте индекс для этого значения в массиве. Else, если значение не существует, затем верните следующий свободный индекс в массив. В основной функции я хотел бы написать один из следующих индексов return by getIndex() - либо с индексом, возвращаемым getIndex , либо следующим свободным индексом.Как проверить, существует ли значение в массиве или возвращать следующий бесплатный индекс
#include <stdio.h>
typedef struct Section {
int numOfStudents;
} Section;
typedef struct School {
int schoolId;
int numberofSections;
Section sections[5];
} School;
School school_1[4]; // array that hold the values
int getIndex(int schoolAddressInfo)
{
int empty_index[4] = {-1,-1,-1,-1}; //array to hold next free index
int rIndex = -1; // index to return
int i,j,k;
for (i = 0; i < 4; i++)
{
if (school_1[i].schoolId == 0) // if the index in array school_1 doesn't contain any data i.e default value = 0, mark that index
{
empty_index[i] = i;
}
else if (school_1[i].schoolId == schoolAddressInfo) // check if value exist in an array, if it does return the index
{
rIndex = i;
return rIndex;
break; // break once element found, don't need to go through rest of the array
}
}
// if the value is not found, return first free index out of indexs saved in empty_index
for (j = 0; j < 4; j++)
{
if (empty_index[j] != -1)
{
rIndex = empty_index[j];
return rIndex;
break;
}
}
return rIndex;
}
//function to populate the array that hold values i.e school_1[]
void populateSchool(){
int i,j;
for(i=0; i < 4; i++)
{
school_1[i].schoolId = 0;
school_1[i].numberofSections = 0;
for (j=0;j<5;j++){
school_1[i].sections[j].numOfStudents = 0;
}
}
school_1[0].schoolId = 21;
school_1[1].schoolId = 22;
school_1[3].schoolId = 23;
}
int main()
{
int i,y,z;
int schoolId = 25;
populateSchool(); //populate the array with either default or real values
int index = getIndex(schoolId); //check if schoolId already exist, if it doesn't exist, create new index, else update existing index
for (i=0; i< 5; i++)
{
school_1[index].sections[i].numOfStudents = 20;
}
for (y = 0; y < 5; y++)
{
printf("school_1[%d].sections[%d].numOfStudents= %d\n", index,y,school_1[index].sections[y].numOfStudents);
}
return 0;
}
Этот код работает, но мне интересно, можно ли оптимизировать getIndex(). Например, для получения того же результата без использования 2 для циклов.
Что вы имеете в виду 'эффективной way'? Кроме того, ваш код не так уж и волнует. – SKD
, если вы используете инструкцию return, тогда вам не нужно использовать перерыв. он немедленно покинет функцию. 'rIndex = i; return rIndex; break; ' вы можете напрямую использовать' return i; ' – Grv
@SKD Эффективным я имел в виду, если он может быть оптимизирован. Возможно, это было не очень ясно. Я немного отредактировал, чтобы сделать его более ясным. – jas