Обработка имен и оценок студентов указателями - 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]
Решение задачи: «Обработка имен и оценок студентов указателями»
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.
- Создаются три переменные: i, rows и columns, которые будут использоваться для подсчета количества строк и столбцов в массиве имен.
- Создается переменная flag, которая будет использоваться для отслеживания наличия ошибок в данных.
- Выводится сообщение с именем первого студента в массиве имен и его значением. Обратите внимание, что в данном коде не выполняется никакой проверки на валидность данных.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д