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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2012, 19:58   #1
interfeys
Пользователь
 
Регистрация: 31.12.2010
Сообщений: 29
По умолчанию С4 Егэ на Си

Видимо меня кто-то неправильно понял...
Вот задание:

На вход программы подается 366 строк, которые содержат информацию о среднесуточной температуре всех дней 2008 года. Формат каждой из строк следующий: сначала записана дата в виде dd.mm (на запись номера дня и номера месяца в числовом формате отводится строго два символа, день от месяца отделен точкой), затем через пробел записано значение температуры — число со знаком плюс или минус, с точностью до 1 цифры после десятичной точки. Данная информация отсортирована по значению температуры, то есть хронологический порядок нарушен. Требуется написать программу, которая будет выводить на экран информацию о месяце (месяцах), среднемесячная температура у которого (которых) наименее отклоняется от среднегодовой. В первой строке вывести среднегодовую температуру. Найденные значения для каждого из месяцев следует выводить в отдельной строке в виде: номер месяца,отклонение от среднегодовой температуры.


Код:
#include<stdio.h>
const int N=366;
struct info{
       int date;   //дата
       int month;  // месяц
       float tem;  // температура
       float stem;}; //Средняя температура,
       // Немного не соответствует структире, может стоило
       //сделать отдельный массив?

main()
{
int month[12]={31,29,31,30,31,30,31,31,30,31,30,31};
float styear=0.0; //Средняя температура за год
info arr[N]; // Может нужно обнулить?
for(int i=0; i<N; i++){
   scanf("%d.%d %f", &arr[i].date,&arr[i].month,&arr[i].tem);
   //Как сильно нужно себя ударить, чтобы не забывать ставить "&" ?
   styear+=arr[i].tem; //Сумма температур за год
}
float motklon=styear; 
//Минимальное отклонение, думаю не может быть больше,
//чем сумма температур?
float otklonen; //среднемесячное отклонение
styear/=N; //Средняя температура за год

for(int j=0;j<12;j++)
{
   for(int e=0;e<N;e++) //Смотрим весь массив в поисках нужного месяца
   {
      if(arr[e].month==j) // Нашли
         arr[j].stem+=arr[e].tem; //Прибавили к сумме температур месяца
   }
   arr[j].stem/=month[j]; //теперь туда же записали ср.темп
   otklonen=styear-arr[j].stem; //Отклонение 
   if(otklonen<0)      // По модулю
      otklonen=-otklonen; 
   if(motklon>otklonen) // Ищем минимум
      motklon=otklonen;
}
printf("%f\n",styear); //Ср годовая т.
for(int z=0;z<12;z++)
{
   if(arr[z].stem<=motklon) //Пишем минимум
      printf("%d %f\n", z+1, arr[z].stem);
}
}
1. Выводит хрень, что не так я сделал, не пойму
2. Сложность алгоритма O(N^2), возможно ли меньше?
3. Скажите как лучше выкладывать сюда, через [CODE],[HTML]или[PHP]?

Последний раз редактировалось Stilet; 18.11.2012 в 20:54.
interfeys вне форума Ответить с цитированием
Старый 18.11.2012, 21:31   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
       float stem;}; //Средняя температура,
       // Немного не соответствует структире, может стоило
       //сделать отдельный массив?
Конечно, отдельный массив.
Код:
main()
Не знаю, каким стандартом руководствуется ЕГЭ, но int main(void) хуже точно не будет.
Код:
info arr[N]; // Может нужно обнулить?
Отсюда и идёт глюк, потому что stem не инициализированы. Но нужно не обнулять, а stem из структуры убрать.
Код:
//Как сильно нужно себя ударить, чтобы не забывать ставить "&" ?
На компе больше пиши, компилятор ругаться будет - тогда и без компа потом вспомнишь.
Цитата:
2. Сложность алгоритма O(N^2), возможно ли меньше?
Среднюю температуру по месяцам можно считать при вводе, так же, как и среднегодовую.
Код:
float motklon=styear; 
//Минимальное отклонение, думаю не может быть больше,
//чем сумма температур?
Может. Среднегодовая вообще может быть 0, потому что там и плюсовая, и минусовая есть. Используй FLT_MAX из float.h.
Somebody вне форума Ответить с цитированием
Старый 19.11.2012, 10:18   #3
interfeys
Пользователь
 
Регистрация: 31.12.2010
Сообщений: 29
По умолчанию

Код:
int main(void)
{
float stem[12]={0,0,0,0,0,0,0,0,0,0,0,0};//Средняя температура
int month[12]={31,29,31,30,31,30,31,31,30,31,30,31};
float styear=0.0; //Средняя температура за год
info arr[N]; 
for(int i=0; i<N; i++){
   scanf("%d.%d %f", &arr[i].date,&arr[i].month,&arr[i].tem);
   styear+=arr[i].tem; //Сумма температур за год
   stem[arr[i].month]+=arr[i].tem; //Сумма температур за месяц
}
float motklon=FLT_MAX; 
float otklonen; //среднемесячное отклонение
styear/=N; //Средняя температура за год

for(int j=0;j<12;j++)
{
    stem[j]/=month[j]; //записали ср.темп
   otklonen=styear-stem[j]; //Отклонение 
   if(otklonen<0)      // По модулю
      otklonen=-otklonen; 
   if(motklon>otklonen) // Ищем минимум
      motklon=otklonen;
}
printf("%f\n",styear); //Ср годовая т.
for(int z=0;z<12;z++)
{
   if(stem[z]<=motklon) //Пишем минимум
      printf("%d %f\n", z+1, stem[z]);
}
int g;
scanf("%d", &g);
}
Похоже, что все исправил
Вообще, я плохо представляю, как можно сделать все на листочке без ошибок
(Хотя этот пример не самый сложный из предложенных)

Последний раз редактировалось interfeys; 19.11.2012 в 11:05.
interfeys вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С4 Егэ на Си interfeys Помощь студентам 23 29.11.2012 20:25
ЕГЭ часть В Xcopy Помощь студентам 8 24.02.2010 21:00
ЕГЭ Xcopy Помощь студентам 6 05.02.2010 14:44
Задача ЕГЭ Rusl92 Паскаль, Turbo Pascal, PascalABC.NET 4 18.04.2009 10:49