Форум программистов, компьютерный форум CyberForum.ru

ЕГЭ Информатика С2 (Массивы) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.96
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
18.02.2011, 18:37     ЕГЭ Информатика С2 (Массивы) #1
Здравствуйте, решаю задачи для подготовки к ЕГЭ,все вроде бы легко,но проблема в том, что все ответы на Паскале.
Решал такую задачу, вроде результат получается правильный, но решение вроде другое.
Меня интересует правильно ли написана программа? И с какого элемента начинается отсчет элементов массива в паскале?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
Опишите на русском языке или одном из языков 
программирования алгоритм поиска трех последовательных элементов, 
сумма которых максимальна, в числовом массиве из 30 элементов. 
*/
#include<iostream>
#define N 30
using namespace std;  
int main()          
{setlocale (LC_ALL, "Russian");
int i,k,max=0,sum,a[N];
for (i=0;i<N;i++)
cin>>a[i];
for (i=0;i<N;i++)
{sum=(a[i]+a[i+1]+a[i+2]);
if(sum>max)
{max=sum;
k=i;}}
cout<<"Cумма ("<<max<<") трех последовательных элементов, номера которых: "<<endl;
cout<<k<<", "<<k+1<<", "<<k+2<<", "<<" максимальна."<<endl;
return 0;}
Ответ:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const N=30;
var a:array[1..N] of integer;
    Max, Sum, i, k: integer;
begin
  Sum:=a[1]+a[2]+a[3];
  Max:=Sum; k:=1;
  for i:=2 to N-2 do begin
    Sum:=Sum-a[i-1]+a[i+2]; { или Sum:=a[i]+a[i+1]+a[i+2];}
    if Sum >Max then begin
      Max:=Sum;
      k:=i;
    end;
  end;
  for i:=k to k+2 do
    writeln('A[',i,']=',a[i]);
end.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2011, 18:37     ЕГЭ Информатика С2 (Массивы)
Посмотрите здесь:

C++ Информатика
ЕГЭ Информатика С2 C++
ЕГЭ Информатика С2 C++
C++ ЕГЭ Информатика С4
C++ ЕГЭ Информатика
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
18.02.2011, 19:38     ЕГЭ Информатика С2 (Массивы) #2
правильно ли написана программа?
, ну давайте устроим разбор полетов...

C++
1
max=0
а если все элементы массива отрицательны? тогда максимум и останется 0..., поэтому в коде на Паскале его и инициализировали
Pascal
1
Sum:=a[1]+a[2]+a[3];
далее, вот тут
C++
1
2
for (i=0;i<N;i++)
{sum=(a[i]+a[i+1]+a[i+2]);
при i = N-1 уйдете за границы массива, обращением к a[i+2], а в той области памяти всякий мусор...

больше нареканий по алгоритму не вижу.. и да
И с какого элемента начинается отсчет элементов массива в паскале?
с 1.
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
18.02.2011, 19:54  [ТС]     ЕГЭ Информатика С2 (Массивы) #3
Цитата Сообщение от Vandris Посмотреть сообщение
а если все элементы массива отрицательны? тогда максимум и останется 0..., поэтому в коде на Паскале его и инициализировали
Об этом даже и не подумал когда писал код.

Добавлено через 7 минут
Цитата Сообщение от Vandris Посмотреть сообщение
при i = N-1 уйдете за границы массива, обращением к a[i+2], а в той области памяти всякий мусор...
а почему компилятор не выдает ошибку?

исправил на
C++
1
2
for (i=2;i<N;i++)
{sum=(a[i]+a[i-1]+a[i-2]);
но меня интересует почему не было ошибок, и ответ правильный выводился на экран при
C++
1
2
for (i=0;i<N;i++)
{sum=(a[i]+a[i+1]+a[i+2]);
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
18.02.2011, 19:56     ЕГЭ Информатика С2 (Массивы) #4
Цитата Сообщение от Sokolov Посмотреть сообщение
а почему компилятор не выдает ошибку?
Потому что, програмист сам должен следить за такими ошибками.
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
18.02.2011, 20:06     ЕГЭ Информатика С2 (Массивы) #5
а почему компилятор не выдает ошибку?
потому что языки С/С++ не занимаются проверкой выхода за границы массива, ответственность за это на программисте
почему не было ошибок, и ответ правильный выводился на экран при
вероятно просто повезло... для интереса можете посмотреть что находится за границами массива...
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    int array[10];
    for (int i = 0; i < 10; i++)
        array[i] = i;
    for (int i = 0; i < 100; i++)
        std::cout << array[i] << " ";
    return 0;
}

Не по теме:

asics, опередил =)

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.02.2011, 20:10     ЕГЭ Информатика С2 (Массивы) #6
Sokolov, замечаю, что в соседней теме "Как сказать циклу", что здесь, вы сильно полагаетесь на компилятор, что он вам слюнявчик наденет и будет ещё слюнки подтирать))) Вы это бросьте. Не такой это язык, и не такой у него компилятор. Подобные вещи (типа массивов и границ и всего, что с этим связано) Си++ унаследовал от Си, а Си не зря называли высокоуровневым ассемблером, он ооочень многие нехорошие вещи прощал программисту. Так что учитесь строго следить за такими вещами самостоятельно.
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
19.02.2011, 13:25  [ТС]     ЕГЭ Информатика С2 (Массивы) #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Sokolov, замечаю, что в соседней теме "Как сказать циклу", что здесь, вы сильно полагаетесь на компилятор, что он вам слюнявчик наденет и будет ещё слюнки подтирать))) Вы это бросьте. Не такой это язык, и не такой у него компилятор. Подобные вещи (типа массивов и границ и всего, что с этим связано) Си++ унаследовал от Си, а Си не зря называли высокоуровневым ассемблером, он ооочень многие нехорошие вещи прощал программисту. Так что учитесь строго следить за такими вещами самостоятельно.
ага, тем более на ЕГЭ не будет компилятора =)

Добавлено через 17 часов 11 минут
Помогите найти ошибку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
Дан прямоугольный массив целых положительных чисел 10 х 20.
Опишите на русском языке или на одном из языков программирования
алгоритм поиска строки с наименьшей суммой элемен-тов. 
Вывести на печать номер строки и сумму ее элементов. 
Предполагается, что такая строка единственна.
*/
#include<iostream>
#define n 10
#define m 20
using namespace std;  
int main()  
{setlocale (LC_ALL, "Russian");
int a[n][m],i,j,sum=0,min,i1=0;
for (i=0;i<n;i++)
{cout<<endl;
for (j=0;j<m;j++)
cin>>a[i][j];
}
for (j=0;j<m;j++)
sum+=a[0][j];
min=sum;
sum=0;
for (i=0;i<n;i++)
{for (j=0;j<m;j++)
  {sum+=a[i][j];
if (sum<min)
{min=sum;
i1=i;}}}
cout<<"Строка с наименьшей суммой ("<<min<<") элемен-тов номер: "<<i1<<endl;
return 0;}
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
19.02.2011, 14:01     ЕГЭ Информатика С2 (Массивы) #8
Нашел, исправил, вроде работает как надо поймете в чем причина была?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
Дан прямоугольный массив целых положительных чисел 10 х 20.
Опишите на русском языке или на одном из языков программирования
алгоритм поиска строки с наименьшей суммой элемен-тов.
Вывести на печать номер строки и сумму ее элементов.
Предполагается, что такая строка единственна.
*/
#include <iostream>
#define n 10
#define m 20
 
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    int a[n][m], sum = 0, min, i1 = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cin >> a[i][j];   // не надоедает каждый раз для проверки работы вводить n*m = 200 чисел?? =)
    }
    for (int i = 0; i < m; i++)
        sum += a[0][i];
    min = sum;
    for (int i = 0; i < n; i++)
    {
        sum = 0;   //вот эту строчку переместил
        for (int j = 0; j < m; j++)
        {
            sum += a[i][j];
            if (j == m-1)  //и добавил это условие
                if (sum < min)
                {
                    min = sum;
                    i1 = i;
                }
        }
    }
    cout << "Строка с наименьшей суммой ("<< min <<") элемен-тов номер: "<< i1 <<endl;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2011, 14:18     ЕГЭ Информатика С2 (Массивы)
Еще ссылки по теме:

C++ Информатика 8-9 классы
Массивы A+B=C (трудная задача из ЕГЭ) C++
C++ C4 ЕГЭ

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
19.02.2011, 14:18  [ТС]     ЕГЭ Информатика С2 (Массивы) #9
Цитата Сообщение от Vandris Посмотреть сообщение
// не надоедает каждый раз для проверки работы вводить n*m = 200 чисел?? =)
я меняю m и n на 3 и 4 =)
Yandex
Объявления
19.02.2011, 14:18     ЕГЭ Информатика С2 (Массивы)
Ответ Создать тему
Опции темы

Текущее время: 05:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru