Обработка имен и оценок студентов указателями - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Описание: Пользователь вводит строкой имена студентов и их оценку за экзамен, например:

Yossi 59 Chedva 94 Rivka 46 Ran 99 Amir 43 Zohar 79

Нужно создать два массива и записать в один - имена, в другой - оценку. Затем обработать данные: проверить правильность ввода данных (имена состоят из английских букв, а оценки в интервале от 0 до 100), записать в failed[] тех, у кого меньше 60 баллов, посчитать максимальную и среднюю оценки. Предполагается использовать функции:

int validate_data(int grades[], char *names[], int size)

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

int find_failures(int grades[], char *names[], int students_num, char *failed[], double *average, int *maximal)

которая записывает в failed[] провалившихся, находит максимальную оценку, считает среднее, возвращает количество провалившихся (размер массива failed). Проблема в том, что я категорически, не смотря на десятки уже прочтенных статей, не понимаю, как пользоваться указателями. Моя идея решения: пользователь вводит данные, данные записываются в строку char str[]. Дальше функция

init_arrays

обрабатывает эту строку. for(i=0; str[i]!='\0'; i++) {

проверяет, если и-тое значение буква, то до пробела записывается в names[] (массив указателей. Должен быть двумерный, потому что имена столбиком), если пробел - идет дальше, если цифра, то через str[i]-'0' записывается в grades[]. Возвращаемое значение - количество студентов (т.е. количество рядов двумерных массивов)

}

int validate_data(int grades[], char *names[], int size)

- идет по колонкам массива неймс, если там есть ошибка - включается флаг на удаление. Потом проходит по массиву грейдс. Если там ошибки - опять в флаг. Далее на основании флага - удаляются и смещаются данные.

int find_failures(int grades[], char *names[], int students_num, char *failed[])

проверяет членов грейдс на <60, и если да, то заносит соответствующее имя в фейлд, увеличивает счетчик после каждого внесения имени, возвращает счетчик. Вопрос в том, как правильно использовать указатели в таком случае. Вот хоть убей не понимаю. Вопросы: 1. Функция init_arrays принимает массив указателей, массив, строку
init_arrays(char **names[][SIZE_COL], int grades[], char str[])
правильно ли я объявила аргументы? в чем разница между

char* var

,

char *var

и

char **var

? при вызове функции, что я должна передать функции, чтобы передать именно массив указателей? 2. Та же функция, тело. (внимание! говнокод)
{
        int i;
    int rows=0; 
    int columns=0;
    int number_of_students;
    for (i = 0; str[i]!='\0'; i++) //пока не дойду до конца строки
        {
            if((str[i]>65 && str[i]<90) || (str[i]>97 && str[i]<122)) //если буква
            {
                while(str[i]!=' ') //пока не дойду до пробела
                {
            
                    names[rows][columns] = &str[i]; //записывается в массив указателей на имена
                    i++;
                    columns++;
                }
            }
            else if(str[i]>48 && str[i]<57) //если цифра
            {
                while(str[i]!=' ')//пока не дойду до нуля
                {
            
                    grades[rows] = grades[rows]*10+str[i]-'0'; //перевожу в интовое
                    i++;
                }
            }
            else
            {
                i++; //если попадаю на пробел, просто иду дальше
            }
            rows++; //после того, как записались данные одного студента, перехожу на следующий ряд 
                                     //массива
    }
    number_of_students=rows-1; //после того, как достигли конца строки, считаем количество студентов
//-1 - потому что после последнего студента количество рядов все-таки увеличилось
    return number_of_students; //возвращаем количество студентов
}
вопросы: правильное и корректное использование знаков * и &
names[rows][columns] = &str[i]
вот тут я указателю даю значение, поэтому я ставлю &. А если мне надо указателю дать указатель? Фухх.. простите, что путано. Сама слабо понимаю, чего я не понимаю. Надеюсь, если объясните, дальнейшее решу сама. Если нет - выложу еще куски говнокода с конкретными вопросами. Спасибо.

Решение задачи: «Обработка имен и оценок студентов указателями»

textual
Листинг программы
int validate_data(int grades[], char *names[][STR_SIZE],  int size) 
{ 
    int i; 
    int rows=0; 
    int columns=0; 
    int flag=0; 
 
    printf("names[%d] = %s \n", 1, *(names+STR_SIZE));

Объяснение кода листинга программы

Код начинается с функции validate_data, которая принимает три аргумента: массив оценок grades, двумерный массив имен names и переменную size.

  1. Создаются три переменные: i, rows и columns, которые будут использоваться для подсчета количества строк и столбцов в массиве имен.
  2. Создается переменная flag, которая будет использоваться для отслеживания наличия ошибок в данных.
  3. Выводится сообщение с именем первого студента в массиве имен и его значением. Обратите внимание, что в данном коде не выполняется никакой проверки на валидность данных.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы