Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2021, 11:16   #1
kottion
Пользователь
 
Регистрация: 24.10.2021
Сообщений: 10
По умолчанию программа на си\си++

Доброго времени суток, неравнодушные.
Пожалуйста, помогите с решением задачи.(с реализацией некоторых ее моментов)
Вот условие -
Отсортировать по среднему баллу
Выведите фамилии и имена учащихся в порядке убывания их среднего балла.
(мне необходимо использовать структуры и динамическую память)
Входные данные
Заданы сначала количество учащихся n, затем n строк, каждая из которых содержит фамилию, имя и три числа (оценки по трем предметам: математике, физике, информатике). Данные в строке разделены одним пробелом. Оценки принимают значение от 1 до 5.

Общее число учащихся не превосходит 100001.
Выходные данные
Необходимо вывести пары фамилия-имя по одной на строке, разделяя фамилию и имя одним пробелом. Выводить оценки не нужно. Если несколько учащихся имеют одинаковые средние баллы, то их нужно выводить в порядке, заданном во входных данных.

входные данные
3
Markov Valeriy 5 5 5
Sergey Petrov 1 1 1
Petrov Petr 3 3 3

выходные данные
Markov Valeriy
Petrov Petr
Sergey Petrov

В чем у меня возникла сложность, я пытался решил простым бабл сортом по одному полю структуры, задача проходит на 97 из 99 тестов. Я спросил у преподавателя , он сказал, что , если решать через qsprt, то задача пройдет все тесты, но с qsort задача падает на третьем тесте....
Я покажу оба свои кода, подскажите, что мне исправить.
Это через qsort (проходит всего на двух тестах)
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <cctype> 
struct People
{
	double marks;
	char Name[100000];
	char LastName[100000];
};
int cpc(const void* a, const void* b)
{
	struct People* ia = (struct People*)a;
	struct People* ib = (struct People*)b;
	return (double)(ia->marks - ib->marks);
}
int main()
{
	int n;
	double  m1, m2, m3;
	char Name[100000], LastName[100000], * buff = NULL;
	scanf("%d", &n);
	struct People* clas;
	clas = (People*)malloc(n * sizeof(People));
	for (int i = 0; i < n; i++)
	{
		scanf("%s %s %lf %lf %lf", LastName, Name, &m1, &m2, &m3);
		clas[i].marks = (m1 + m2 + m3) / (3);
		buff = clas[i].Name;
		strcpy(buff, Name); buff = NULL;
		buff = clas[i].LastName;
		strcpy(buff, LastName); buff = NULL;
	}
	qsort(clas, n, sizeof(struct People), cpc);
	for (int i = 0; i != n; i++)
	{
		printf("%s %s\n", clas[i].LastName, clas[i].Name);
	}
	free(clas);
	return 0;
}
Это обычный бабл сорт (не проходит всего на двух тестах)
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <cctype> 
struct People
{
	double marks;
	char Name[100000];
	char LastName[100000];
};

void sortt(struct People* clas, int count)
{
	double marks;
	char* buff = NULL, Nme[100000], LstName[100000];
	for (int i = 0; i < count; i++)
	{
		for (int j = 0; j < count - 1; j++)
		{
			if (clas[j].marks < clas[j + 1].marks)
			{
				marks = clas[j].marks; 
				buff = Nme; strcpy(buff, clas[j].Name);buff = NULL;
				buff = LstName; strcpy(buff, clas[j].LastName);buff = NULL;
				clas[j] = clas[j + 1];
				clas[j + 1].marks = marks;
				buff = clas[j + 1].Name; strcpy(buff, Nme); buff = NULL;
				buff = clas[j + 1].LastName; strcpy(buff, LstName); buff = NULL;

			}
		}
	}
}


int main()
{
	int n;
	double  m1, m2, m3;
	char Name[100000], LastName[100000], * buff = NULL;
	scanf("%d", &n);
	struct People* clas;
	clas = (People*)malloc(n * sizeof(People));
	for (int i = 0; i < n; i++)
	{
		scanf("%s %s %lf %lf %lf", LastName, Name, &m1, &m2, &m3);
		clas[i].marks = (m1 + m2 + m3) / (3);
		buff = clas[i].Name; 
		strcpy(buff, Name); buff = NULL;
		buff = clas[i].LastName;
		strcpy(buff, LastName); buff = NULL;
	}
	sortt(clas, n);
	for (int i = 0; i != n; i++)
	{
		printf("%s %s\n", clas[i].LastName, clas[i].Name);
	}
	free(clas);
	return 0;
}

Последний раз редактировалось kottion; 04.12.2021 в 11:24.
kottion вне форума Ответить с цитированием
Старый 04.12.2021, 18:10   #2
kottion
Пользователь
 
Регистрация: 24.10.2021
Сообщений: 10
По умолчанию

Задачу решил, вопрос закрыт)))
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <cctype> 
struct People
{
	int marks;
	int index;
	char Name[1000];
	char LastName[1000];
};
int cpc(const void* a, const void* b)
{
	struct People* ia = (struct People*)a;
	struct People* ib = (struct People*)b;
	if (ia->marks < ib->marks)
	{
		return -1;
	}
	else if (ia->marks > ib->marks)
	{
		return 1;
	}
	else if (ia->marks == ib->marks)
	{
		if (ia->index > ib->index)
		{
			return -1;
		}
		else if (ia->index < ib->index)
		{
			return 1;
		}
	}
	/*return (int)(ia->marks - ib->marks);*/
	/*return (double)(ia->marks - ib->marks);*/
}
int main()
{
	int n, m1, m2, m3;
	char Name[1000], LastName[1000], * buff = NULL;
	scanf("%d", &n);
	struct People* clas;
	clas = (People*)malloc(n * sizeof(People));
	for (int i = 0; i < n; i++)
	{
		scanf("%s %s %d %d %d", &LastName, &Name, &m1, &m2, &m3);
		clas[i].index = i;
		clas[i].marks = (m1 + m2 + m3);
		buff = clas[i].Name;
		strcpy(buff, Name); buff = NULL;
		buff = clas[i].LastName;
		strcpy(buff, LastName); buff = NULL;
	}
	qsort(clas, n, sizeof(struct People), cpc);
	for (int i = n - 1; i != -1; i--)
	{
		printf("%s %s\n", clas[i].LastName, clas[i].Name);
	}
	free(clas);
	return 0;
}
kottion вне форума Ответить с цитированием
Старый 05.12.2021, 07:50   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

kottion, это не C, а C++

Цитата:
scanf("%s %s %d %d %d", &LastName, &Name, &m1, &m2, &m3);
две ошибки - адрес у массива не нужно брать.

Либо брать адрес у первого элемента
Код:
scanf("%s %s %d %d %d", &LastName[0], &Name[0], &m1, &m2, &m3);

Последний раз редактировалось Алексей1153; 05.12.2021 в 07:58.
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не запускается программа. Программа должна заполнить массив символом. Через процедуру. anasttb Паскаль, Turbo Pascal, PascalABC.NET 1 27.03.2017 18:31
нужна программа QControl программа для внутрилабораторного контроля качества Версия 5.5. миньен Софт 7 02.03.2014 00:28
Программа на Pascal в Lazarus и программа для одномерного массива целых чисел Yegorka Lazarus, Free Pascal, CodeTyphon 13 20.12.2012 18:02
Программа с применением записей и программа с применение множеств smert99 Помощь студентам 0 16.06.2011 23:14
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09