Операции над строками и файлами: подсчет количества студентов с тройками по физике - C (СИ)
Формулировка задачи:
Написать функцию подсчета количества студентов с тройками по физике .
Решение задачи: «Операции над строками и файлами: подсчет количества студентов с тройками по физике»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int main(void) {
int stupids = 0;
xmlDocPtr doc = xmlReadFile("students.xml", NULL, 0);
if ( ! doc ) {
perror("xmlReadFile");
exit(1);
}
xmlNodePtr root = xmlDocGetRootElement(doc);
if ( ! root ) {
perror("xmlDocGetRootElement");
xmlFreeDoc(doc);
exit(1);
}
for ( xmlNodePtr stud = root->xmlChildrenNode; stud; stud = stud->next ) {
if ( xmlStrcmp(stud->name, (xmlChar*)"student") == 0 ) {
for ( xmlNodePtr data = stud->xmlChildrenNode; data; data = data->next ) {
if ( xmlStrcmp(data->name, (const xmlChar*)"scores") == 0 ) {
for ( xmlNodePtr scor = data->xmlChildrenNode; scor; scor = scor->next ) {
if ( xmlStrcmp(scor->name, (xmlChar*)"discipline") == 0 ) {
xmlChar * name = NULL;
xmlChar * result = NULL;
for ( xmlNodePtr dis = scor->xmlChildrenNode; dis; dis = dis->next ) {
if ( xmlStrcmp(dis->name, (xmlChar*)"name") == 0 )
name = xmlNodeListGetString(doc, dis->xmlChildrenNode, 1);
else if ( xmlStrcmp(dis->name, (xmlChar*)"score") == 0 )
result = xmlNodeListGetString(doc, dis->xmlChildrenNode, 1);
}
if ( xmlStrcmp(name, (xmlChar*)"Informatics") == 0 && xmlStrcmp(result, (xmlChar*)"2") == 0 )
stupids += 1;
xmlFree(name);
xmlFree(result);
}
}
}
}
}
}
xmlFreeDoc(doc);
printf("%d stupid students\n", stupids);
return 0;
}
Объяснение кода листинга программы
Код считает количество студентов с тройками по физике в XML-файле students.xml. Вот список действий:
- Подключаются необходимые заголовочные файлы.
- Создаются переменные
stupids(количество студентов с тройками) иdoc(XML-документ). - Загружается XML-документ из файла
students.xml. - Получается корневой элемент XML-документа.
- В цикле обходятся все элементы
student. - Если элемент
studentнайден, то в цикле обходятся все элементыscores. - Если элемент
scoresнайден, то в цикле обходятся все элементыdiscipline. - Если элемент
disciplineнайден, то проверяется название и результат. - Если название равно
Informaticsи результат равен2, то увеличивается счетчикstupids. - После завершения всех проверок, освобождается память, занятая строками
nameиresult. - После завершения цикла, выводится количество студентов с тройками.
- Завершается работа программы.