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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2013, 19:41   #1
Javlonkhan
Пользователь
 
Регистрация: 01.01.2013
Сообщений: 20
По умолчанию Решение очень сложных задач на массивы

Помогите пожалуйста если сможете:
У меня тут в программе выводятся 2 ошибки, хотя алгоритм задачи правильно составлен и вроде нет никаких синтаксических ошибок. Но не знаю в чём проблема….
Условие задачи:
Известно, что в городе ХХХХ самыми тёплыми являются дни с 15 июля по 15 августа
Для проведения фестиваля были выбраны 7 следующих подряд дней, наиболее тёплых по данным за последние 10 лет. Составить программу для выполнения этой работы на ЭВМ.
Указания к решению этой задачи:
Исходные данные целесообразно представить в виде двумерного массива 10Х32. По исходному
массиву далее формировать массив 10Х26, каждый элемент которого – сумма температур за каждые 7 из 32 дней. Далее нужно просуммировать столбцы этого массива и определять, для какого сотлбца сумма элементов является максимальной.
Вот, что у меня получилось:
Код:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[10][32];
int i,j,j1, sum1, jMax=0, iMin=0, sum=0;
int max = 0;
for (i = 0; i< 10 ; i++)
for (j = 0; j < 32; j++){ 
a[i][j]=rand()%20-10;
cout<<"a["<<i<<","<<j<<"] = "<<a[i][j]<<endl;
cout<<endl;
}
for (i = 0; i< 10; i++)
for (j = 0; j < 26; j++){
for(j1=j; j1<7; j1++){
          sum1=sum+a[i,j1];
a[i,j]=sum1;
if(a[i][j]>a[iMin][jMax])
{iMin=i, jMax=j;

cout<<endl;}}}
cout<<"a[iMin][jMax]="<<a[iMin][jMax]<<endl;
system("pause");
}

Последний раз редактировалось Stilet; 26.01.2013 в 22:49.
Javlonkhan вне форума Ответить с цитированием
Старый 19.01.2013, 19:50   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Неплохая попытка.
Замечания:
1) Кросспостинг http://programmersforum.ru/showthread.php?t=223939
2)
Код:
for (i = 0; i< 10; i++)
        for (j = 0; j < 26; j++)
        {
            for(j1=j; j1<7; j1++)
            {
                sum1=sum+a[i,j1];
                a[i,j]=sum1;
            }
        }
не эквивалентно
Код:
// (c) Базиля
for i:=1 to 10 do
   for j:=1 to 26 do
   begin
   sum:=0;
      for j1:=j to j+6 do
      sum=sum+a[i,j1];
   a[i,j]:=sum;
   end;
Сумму нужно обнулять или делать более хитрым способом. И третий вложенный цикл неправильный.
3) Неплохо бы узнать, что за ошибки (я кое-какие вижу). Обычно компилятор говорит строчку, в которой видит ошибку.
4) Используйте кнопочку Решетка # для оформления кода.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.01.2013 в 20:00.
BDA вне форума Ответить с цитированием
Старый 22.01.2013, 08:24   #3
Javlonkhan
Пользователь
 
Регистрация: 01.01.2013
Сообщений: 20
По умолчанию

Прошу прощения, что забыл вам сказать эти ошибки. У меня ошибки появляются на 13-14 строчках. Я всё сделал как вы говорили, и даже попробовал сумму положить внутрь вложенного цикла после условия. Но всё равно у меня ничего не вышло.
Javlonkhan вне форума Ответить с цитированием
Старый 22.01.2013, 08:28   #4
Javlonkhan
Пользователь
 
Регистрация: 01.01.2013
Сообщений: 20
По умолчанию

Точнее не в 13-14строчках а 18-19 строчках. Вот моя переделанная прога:
Код:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[10][32];
int i,j,j1, sum1, jMax=0, iMin=0, sum=0;
int max = 0;
for (i = 0; i< 10 ; i++)
for (j = 0; j < 32; j++){ 
a[i][j]=rand()%20-10;
cout<<"a["<<i<<","<<j<<"] = "<<a[i][j]<<endl;
cout<<endl;
}
for (i = 0; i< 10; i++)
for (j = 0; j < 26; j++){
for(j1=j; j1<7; j1++){

if(a[i][j]>a[iMin][jMax])
{sum1=sum+a[i,j1];
a[i,j]=sum1;
iMin=i, jMax=j;
cout<<endl;}}}
cout<<"a[iMin][jMax]="<<a[iMin][jMax]<<endl;
system("pause");
}
После этого одна ошибка исчезла, но другая осталась.




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 22.01.2013 в 08:35.
Javlonkhan вне форума Ответить с цитированием
Старый 22.01.2013, 11:01   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Прошу прощения, что забыл вам сказать эти ошибки. У меня ошибки появляются на 13-14 строчках.
Ну, наверное, надо что-то исправить на 12-14 строчках. Скажите пожалуйста, что Вы получили в Google, забив туда текст ошибки? Что Вы к настоящему моменту прочитали о работе с массивами?
Abstraction вне форума Ответить с цитированием
Старый 22.01.2013, 12:28   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Замечания такие:
0) Форматируйте код нормально - всем будет удобнее читать.
1) Вы не читаете предыдущие замечания
Третий вложенный цикл - НЕПРАВИЛЬНЫЙ. (вот этот for(j1=j; j1<7; j1++){})
2) a[i,j] - такое обращение невозможно в C++ (правильнее выразиться, возможно, но приведет не к ожидаемому результату).
3) Вы пытаетесь сделать по заданию, но пропускаете несколько операций.
Этот тройной цикл нужен только для того, чтобы сформировать из 10х32 массива 10х26 массив. Никакого поиска тут еще нельзя осуществлять.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.01.2013 в 12:34.
BDA вне форума Ответить с цитированием
Старый 26.01.2013, 20:24   #7
Javlonkhan
Пользователь
 
Регистрация: 01.01.2013
Сообщений: 20
По умолчанию

А не могли бы вы подсказать, какие именно операции я пропускаю и как мне сделать правильно третий вложенный цикл???
Javlonkhan вне форума Ответить с цитированием
Старый 26.01.2013, 21:02   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
for (i = 0; i < 10; i++)
        for (j = 0; j < 26; j++)
        {
            sum = 0;
            for(j1 = j; j1 < j + 7; j1++)
                sum += a[i][j1];
            a[i][j] = sum;
        }
Этот тройной цикл сформирует массив 10 на 26.
Цитата:
Далее нужно просуммировать столбцы этого массива и определять, для какого столбца сумма элементов является максимальной.
Если уж хочется поменьше кода, то нужно поменять вложенность циклов (можно пропустить шаг формирования массива 10 на 26):
Код:
#include <iostream>
#include <stdlib.h>
#include <ctime>

using namespace std;

int main()
{
    srand(time(NULL));
    int a[10][32];
    int day = -1, all_sum = 0;
    for (int i = 0; i< 10 ; ++i) {
        for (int j = 0; j < 32; ++j) {
            a[i][j] = rand()%20 - 10;
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    for (int j = 0; j < 26; ++j) {
        int sum = 0;
        for (int i = 0; i < 10; ++i)
            for(int k = j; k < j + 7; ++k)
                sum += a[i][k];
        if (sum > all_sum || day < 0) {
            all_sum = sum;
            day = j;
        }
    }
    cout << "days: ";
    (day + 15 > 31)?(cout << day - 16 << " August - "):(cout << day + 15 << " July - ");
    (day + 21 > 31)?(cout << day - 10 << " August" << endl):(cout << day + 21 << " July" << endl);
    system("pause");
}
Не ручаюсь за 100% правильность кода. Да и сам алгоритм не самый эффективный.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 26.01.2013 в 21:11.
BDA вне форума Ответить с цитированием
Старый 26.01.2013, 22:41   #9
Javlonkhan
Пользователь
 
Регистрация: 01.01.2013
Сообщений: 20
По умолчанию

Ага, теперь мне всё ясно, но только вот почему вы инициализируете перемменую day как -1 и зачем нужна эта запись и вот эта также:
(day + 15 > 31)?(cout << day - 16 << " August - ")cout << day + 15 << " July - ");
(day + 21 > 31)?(cout << day - 10 << " August" << endl)cout << day + 21 << " July" << endl);
Javlonkhan вне форума Ответить с цитированием
Старый 26.01.2013, 22:54   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

day указывает на первый день из промежутка, который должна найти программа.
Я его инициализировал -1, чтобы в цикле он сразу был заменен на 0 (чтобы не думать, чем инициализировать all_sum).
Код:
 (day + 15 > 31)?(cout << day - 16 << " August - "):(cout << day + 15 << " July - ");
day=0 это 15 июля
day=1 - 16 и т.д.
Если day+15 больше 31, то первый день расположен в следующем месяце.
day+15-31=day-16 августа.

Последний день промежутка day+6.
Также считаем, в каком месяце он находится.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++. Решение самых сложных задач по массивам. Javlonkhan Помощь студентам 5 01.01.2013 21:00
Нужно решение задач на Pascal по теме массивы dimkom Помощь студентам 3 08.10.2012 01:12
VB. Решение задач на одномерные и двумерные массивы. alex.puppeteer Помощь студентам 1 10.02.2011 07:21
Парни нужно решение задач на Pascal. Тема массивы. 666WARRIOR999 Помощь студентам 3 15.12.2009 15:59