2015-10-27 2 views
-1

Я пытаюсь написать эффективную функцию, которая принимает значение как вход и проверяет это значение в массиве. Если значение существует в массиве, тогда возвращайте индекс для этого значения в массиве. 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 для циклов.

+1

Что вы имеете в виду 'эффективной way'? Кроме того, ваш код не так уж и волнует. – SKD

+1

, если вы используете инструкцию return, тогда вам не нужно использовать перерыв. он немедленно покинет функцию. 'rIndex = i; return rIndex; break; ' вы можете напрямую использовать' return i; ' – Grv

+0

@SKD Эффективным я имел в виду, если он может быть оптимизирован. Возможно, это было не очень ясно. Я немного отредактировал, чтобы сделать его более ясным. – jas

ответ

0

Один из возможных способов без необходимости использовать другой цикл

int getIndex(int schoolAddressInfo) 
{ 
    int rIndex = -1; // index to return 
    int i; 
    bool firstFreeIndexFound = false; 

    for (i = 0; i < 4; i++) 
    { 
    if (school_1[i].schoolId == schoolAddressInfo) // check if value exist in an array, if it does return the index 
    { 
     rIndex = i; 
     return rIndex; //don't need to go through rest of the array 
    } 
    else if (school_1[i].schoolId == 0 && firstFreeIndexFound!=true) // if the index in array school_1 doesn't contain any data i.e default value = 0, mark that index 
    { 
     rIndex = i; 
     firstFreeIndexFound = true; 
    } 
    } 
    return rIndex; 
} 
Смежные вопросы