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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2013, 12:25   #1
Jeckor
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
Восклицание Проблемы со структурой (Си)

Помогите разобраться, почему функция не считает средний балл учеников (функция float SrSum()). Инфу программа считывает с файла:
Yagnukov KIT-33 4.0 4.5 5.0 4.5
Clinton White_House 5.0 5.0 5.0 5.0
Petrov-Ivanov KIT-23_a 3.0 3.5 5.0 3.5

Вот, как работает:
Безымянный5.jpg

Проблема в самой функции или в том, как я её вызываю?

Код:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#define N 3
#define M 4

struct uchenik
	{
		char fio[15];
		char faculty[15];
		float mark[4];
	};

void ReadText(uchenik *);

void GetText(uchenik *);

float SrSum(uchenik *);

void Sort(uchenik *);

int _tmain(int argc, _TCHAR* argv[])
{
	struct uchenik uchenik[N];
	GetText(uchenik);
	getch();
	return 0;
}

void ReadText(uchenik *s)
{
	FILE *file1;
	file1=fopen("file1.txt","r");
	for (int i=0; i<N; i++)
	{
		fscanf(file1,"%s%s", &s[i].fio, &s[i].faculty);
		for (int d=0; d<M; d++)
		{
			fscanf(file1,"%f", &s[i].mark[d]);
		}
	}
}
void GetText(uchenik *s)
{
	float srsum;
	ReadText(s);
	printf("\t Surname\t   Faculty        Marks			Middle mark\n\n");
	Sort(s);
	for (int i=0; i<N; i++)
	{
		srsum=SrSum(s);
		printf("%d)\t %s\t   %s\t", i+1, s[i].fio, s[i].faculty);
		for (int d=0; d<M; d++)
		{
			printf("%.1f ", s[i].mark[d]);
		}
		printf("\t%.1f\n\n", srsum);
	}
}

float SrSum(uchenik *s)
{
	float sum=0;
	float srsum=0;
	int i=0,d;
	for (d=0; d<M; d++)
	{
		sum+=s[i].mark[d];
		srsum=sum/M;
	}
	return srsum;
}

void Sort (uchenik *s)
{
	struct uchenik sorter;
	int a,b;
	for (int i=0; i<N; i++)
		for (a=2; a>i; a--)
		{
			b=0;
			while (s[a].fio[b]==s[a-1].fio[b])
			b++;
			if (s[a].fio[b]<s[a-1].fio[b])
			{	
				sorter=s[a];
				s[a]=s[a-1];
				s[a-1]=sorter;
			}
		}
}
Jeckor вне форума Ответить с цитированием
Старый 28.10.2013, 12:43   #2
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Код:
float SrSum(uchenik *s)
{
	float sum=0;
	float srsum=0;
	int i=0,d;
	for (d=0; d<M; d++)
	{
		sum+=s[i].mark[d];
		srsum=sum/M;
	}
	return srsum;
}
киньте за цикл

srsum=sum/M;

но не в этом суть. а суть в том что всегда обращаетесь к первому ученику i=0;
Код:
int i=0,d;
sum+=s[i].mark[d];
если считаете по всем ученикам-тогда вам нужен внешний цикл от 0 до N по i
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 28.10.2013 в 12:48.
SaLoKiN вне форума Ответить с цитированием
Старый 28.10.2013, 12:43   #3
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Код:
	int i=0,d;
Код:
		sum+=s[i].mark[d];
всегда i = 0:
Код:
		sum+=s[0].mark[d];
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 30.10.2013, 09:44   #4
Jeckor
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
Печаль

Я понял ошибку, но у меня не получается её исправить.

Безымянный.jpg

Код:
void GetText(uchenik *s)
{
	float srsum;
	ReadText(s);
	printf("\t Surname\t   Faculty        Marks			Middle mark\n\n");
	Sort(s);
	for (int i=0; i<N; i++)
	{
		srsum=SrSum(s);
		printf("%d)\t %s\t   %s\t", i+1, s[i].fio, s[i].faculty);
		for (int d=0; d<M; d++)
		{
			printf("%.1f ", s[i].mark[d]);
		}
		printf("\t%.1f\n\n", srsum);
	}
}

float SrSum (uchenik *s)
{
	float srsum=0, sum=0;
	int d,i;
	for (i=0; i<N; i++)
	{
		for (d=0; d<M; d++)
		{
			sum+=s[i].mark[d];
		}
		srsum=sum/M;
	}
	return srsum;
}
Jeckor вне форума Ответить с цитированием
Старый 30.10.2013, 09:52   #5
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

смотрим внимательно!
Код:
float SrSum (uchenik *s)
{
	float srsum=0, sum=0;
	int d,i;
	for (i=0; i<N; i++) тут цикл по студентам
	{
		for (d=0; d<M; d++) тут цикл по предметам для каждого студента
		{
			sum+=s[i].mark[d]; а тут какая то одна переменная sum, которая в себе содержит суммы всех. думаю намек понятен
		}
		srsum=sum/M;
	}
	return srsum;
}
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 30.10.2013, 09:52   #6
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Процедура SrSum возвращает всегда только одну, последнюю среднюю сумму (для i = N).
Вам необходимо либо добавить в структуру uchenik поле "средняя сумма", которое заполняется в ходе работы процедуры SrSum, либо каким-то образом определять номер ученика по передаваемому в функцию параметру.

Иначе говоря: в процедуру передавать не только ссылку на структуру "ученик", но и номер в этой структуре, для которого подсчитать среднюю оценку. И выкинуть цикл по i.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со структурой SorryHelpMePLZ C/C++ Базы данных 1 02.06.2013 23:33
Вопросы со структурой oliwin Общие вопросы C/C++ 0 05.10.2011 17:39
Проблема со структурой в Си. danik93 Помощь студентам 2 17.08.2010 15:49
проблема со структурой Petruha-nsk Общие вопросы C/C++ 1 18.04.2009 21:12
Проблемы с динамической структурой данных Mailz Общие вопросы C/C++ 1 21.05.2008 00:18