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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2021, 11:22   #1
Ana45
Пользователь
 
Регистрация: 24.02.2021
Сообщений: 18
Печаль Программа на C++. Одномерные массивы.

Добрый день!
Была дана задача: даны целые числа а1...аn. Известно, что среди них есть отрицательные. Пусть, это число an и элементы a(n+1), a(n+2),...,am - элементы последовательности стоящие после отрицательного числа. Вычислить сумму квадратов элементов последовательности стоящих после отрицательного числа. Т.е для начала нужно найти отрицательный элемент, а затем выполнить сумму. Моя программа выглядит так:
#include <iostream>
# include <math.h>
using namespace std;
int main()
{int const m=10;
float a[m+1];
cout<<"Enter"<<m<<"numbers"<<endl;
for(int i=0; i<=m; i++) cin>>a[i];
int S=0; int k=0;
for(int k=0; k<=m; k++) if(a[k]<0)
cout<<" negative item received k="<<endl;
for(int k=0;k<=m; k++)
S+=a[k]*a[k];
cout<<"S="<<S<<endl;
return 0;}
Я не могу понять, где моя ошибка. Пожалуйста, можете помочь?
Ana45 вне форума Ответить с цитированием
Старый 24.02.2021, 12:06   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Первая ошибка - прежде чем постить в форум, надо прочитать правила. И там сказано, как надо представлять исходник. Вот так (применить тег CODE).
Код:
#include <iostream>
# include <math.h>
using namespace std;
int main()
{int const m=10;
float a[m+1];
cout<<"Enter"<<m<<"numbers"<<endl;
for(int i=0; i<=m; i++) cin>>a[i];
int S=0; int k=0;
for(int k=0; k<=m; k++) if(a[k]<0)
cout<<" negative item received k="<<endl;
for(int k=0;k<=m; k++)
S+=a[k]*a[k];
cout<<"S="<<S<<endl;
return 0;}
Может быть, теперь кто-то заинтересуется этим кодом вместо представленной "портянки". Так на первый взгляд - что в программе с целыми числами делает float ?
А если так?
Код:
for(int k=0; k<=m; k++) 
   if(a[k]<0)  {k++; Break}
for(;k<=m; k++)
S+=a[k]*a[k];
Можно было через while...

Последний раз редактировалось digitalis; 24.02.2021 в 12:19.
digitalis вне форума Ответить с цитированием
Старый 24.02.2021, 22:17   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Код:
# include <iostream>
# include <math.h>

using namespace std;
int main() {
	int const m = 10;              // Размер массива
	int a[m+1];                    // Описали масив целых чисел
	cout<<"Enter" << m <<"numbers"<<endl; // Запрос на ввод
	for(int i = 0; i <= m; i++)    // Ввод чисел
	    cin >> a[i];
	int S = 0;                     // Инициируем начальную сумму
	int k = 0;                     // Временная переменная - номер
	                               // отрицательного числа
	for(int i = 0; i <= m; i++)
	    if(a[i] < 0){
	    	k = i + 1;             // Нашли номер отриц. числа
		}
	for(int i = k; i <= m; i++)    // Начиная с k-ого элемента
	    S+=a[i]*a[i];              // суммируем квадраты чисел
	    
	cout << "S=" << S << endl;     // Результат

	return 0;
}
PS:
Думаю, что изложенный алгоритм поможет разобраться.
Одна из ошибок заключается в том, что переменная, описанная в программе, и переменная, описанная в заголовке цикла - это разные переменные.
Переменная, описанная в заголовке цикла не должна быть видна вне цикла.
По этой причине в моём примере все переменные циклов - i.

PSS:
Полагаю, что вычислять надо после последнего найденного отрицательного числа.
Если вычислять от первого найденного числа, то поиск отрицательного числа и вычисление можно совместить в одном цикле:
- создаём переменную логического типа, например, flag со значением false;
- в цикле, при нахождении первого отрицательного элемента, flag = true;
- в теле цикла предусматриваем условие:
Код:
if (flag) 
    S+=a[i]*a[i];
PSSS:
Программа даже не компилировалась.
Разбирайтесь.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 25.02.2021, 11:43   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Переменная, описанная в заголовке цикла не должна быть видна вне цикла.
Согласен. Мой косяк. Попробовал в Delphi - не компильнулось, выдала ошибку. Ещё когда изучали Алгол-60 в прошлом тысячелетии, нас об этом предупреждали. Впрочем, видимо, это зависит от реализации - в Fortran IV вроде проходило. Не говоря уж за ассемблер Но конечно - единичные исключения не дают права нарушать правило.
digitalis вне форума Ответить с цитированием
Старый 25.02.2021, 18:32   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
Сообщение от ViktorR
Переменная, описанная в заголовке цикла не должна быть видна вне цикла.
Цитата:
Попробовал в Delphi - не компильнулось, выдала ошибку. ...
Тут есть один момент.
В Delphi и вообще, в Pascal, переменные описываются в специальной области после волшебного слова var. Там нельзя описать переменную абы где.
В Си переменная описывается указанием типа перед её именем и может быть описана в выделенном блоке кода [тут мне сложно объяснить, поскольку пишу по памяти, а лезть в Сеть в лом].
Т.е., например, выражение:
Код:
for (int i = 0; i <= m; i++) {
    <тело цикла>
}
понимается так: создать переменную i и инициализировать её нулём.
При этом область видимости этой переменной - тело цикла. Это как описание переменных функции.
Деталей реализации не знаю, но думаю, что такая переменная создаётся в стеке.
Вместе с тем, если переменную описать вне тела цикла, например:
Код:
int i;
for (i = 0; i <= m; i++) {
    <тело цикла>
}
то она может быть доступна и вне цикла. В этом случае переменная размещается в сегменте данных программы, а не в стеке.

PS:
Насколько помню, и в Си и в Паскале можно описать переменную в теле функции, но такая переменная будет создана в сегменте данных и будет сохраняться между вызовами.
Пример:
Код:
function mf(): real;
const a: integer = 6;
begin
   writeln(a);
   a := a + 1;
   mf := a;
end;

var y: real;
    i: integer;

begin
   for i:= 1 to 10 do
       y := mf();
end.
Можно заметить, что хотя переменная a описана как константа, её можно изменять.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 03.03.2021, 14:47   #6
Ana45
Пользователь
 
Регистрация: 24.02.2021
Сообщений: 18
По умолчанию

ViktorR, Добрый день! с флагом мы еще не работали, поэтому я не совсем могу понять как выполнить данную задачу. Есть альтернативный путь? Будьте так добры
Ana45 вне форума Ответить с цитированием
Старый 03.03.2021, 15:03   #7
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 243
По умолчанию

Код:
#include <iostream>
int main()
{
  const int m=10;
  int a[m];
  std::cout<<"Enter"<<m<<"numbers"<<std::endl;
  for(int i=0; i<m; ++i) std::cin>>a[i];
  int S=0;
  for(int k=0; k<m; ++k)
    if(a[k]<0) {
      std::cout<<" negative item received k="<<k<<std::endl;
      for(++k;k<m; ++k) S+=a[k]*a[k];
      break;
    }
  std::cout<<"S="<<S<<std::endl;
}
FrosyaZZ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа в С++(одномерные массивы) Dr Vikt Помощь студентам 0 22.12.2012 21:58
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12
Программа на одномерные массивы Ekatharina Помощь студентам 8 30.06.2009 21:20