C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Ответить
Аватара пользователя
bangybam

C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение bangybam »

Добрый вечер!

Программа, на си, должна показывать минимальное введенное значение и суммировать элементы которые находятся между первым и последним позитивным элементом( не включая их).

Минимальное значение находит правильно, а вот когда первое введенное значение равно 0 то сумму пишет тоже равную нулю.

Помогите найти ошибку пожалуйста.

Среда Dev-C++



Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
main ()
{
int min=100000,i,s=0,a[10]; 
for (i=0; i<10; i++)
{
scanf("%i", &a[i]);
if(a[i]< min)
{
min=a[i]; 
} 
}
printf("Min znach : %i\n" ,min);
for (i=0; i<10; i++)
{
s+= a[0]<0||a[9]<0 ? 0 : a[i];
}
printf("%i\n",s);
system ("pause");
return 0;
}
Аватара пользователя
ferget

Re: C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение ferget »

Цитата lxa85:



s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля... дальше я не понимаю.
C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.




s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля прибавляем 0, иначе прибавляем a
Аватара пользователя
bangybam

Re: C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение bangybam »

первое ferget объяснила правильно, второе там s=0, а третье объясни в чем ошибка в min.
Аватара пользователя
Rulan_IR

Re: C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение Rulan_IR »

Доброго вечера всем!

У меня возникла такая проблема. Подскажите пожалуйста, как на с++ сделать так, что при запуске программы, она ожидала ввода имя файла, и если имя файла неверное, то выдавала бы ошибку об этом, и выдавала бы ошибку при нажатии "Enter". Заранее спасибо!
Аватара пользователя
lxa85

Re: C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение lxa85 »

bangybam, хорошо. С циклом мне понятно. Т.е. понятно, какое действие выполняется. Смысл действия -- остается загадкой.

По заданию -- "сумма между первым и последним положительным элементом". (позитивный элемент -- надо будет взять на заметку :) )

Как в это участвует условие положительности первого ИЛИ последнего элемента, не понятно.


Цитата bangybam:



в чем ошибка в min.
C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.




Что если все элементы массива больше 100000 ?

Откуда взялась эта константа, и почему есть уверенность, что это самое большое число?

Ответ собственно очевиден -- в отладочных целях.

Но работает предложенный алгоритм не во всех случаях.



---



Rulan_IR,
Введение в языки программирования C и C++. Автор: Ю.Л. Кетков


Глава 10: Работа с файлами.
Аватара пользователя
Sidewalker

Re: C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение Sidewalker »

Цитата bangybam:



а вот когда первое введенное значение равно 0 то сумму пишет тоже равную нулю.
C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.




Конечно не работает, написанный код совсем не то делает.


Цитата bangybam:



s+= a[0]

Код: Выделить всё

bool start=FALSE; // флаг, показывающий, попадался ли уже среди элементов массива положительный, т.е. стоит ли СЛЕДУЮЩИЙ положительный прибавлять
int last=0; // сюда занесём ПОСЛЕДНИЙ ПОЛОЖИТЕЛЬНЫЙ элемент массива, чтобы потом его вычесть из суммы
for (int i=0; i<10; i++)
{
if(a[i]>0) {
       if (start==FALSE) start=TRUE;    //если встретили первый ПОЛОЖИТЕЛЬНЫЙ (это не обязательно a[0]) элемент массива, то меняем флаг,
                                                       //чтобы в будущем знать, что как минимум 1 положительный уже был
       else {
                    s=s+a[i];           // иначе, если start уже равно TRUE, т.е. уже положительный был, то встреченный нами положительный a[i] надо прибавить к сумме
                    last = a[i];
}
s = s - last;
printf("%i\n",s);
Аватара пользователя
Error_

Re: C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение Error_ »

bangybam, уточните задание: известно ли сколько элементов будет, или их количество задается во время работы, или оно не известно, но ввод заканчивается по какому-либо признаку.



Sidewalker, у вас есть ошибки:

- нет определения минимального значения;

- неправильное количество скобок;

- отрицательные элементы в сумму они не попадут;
Аватара пользователя
Error_

Re: C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение Error_ »

Вот, примерно, то что вам нужно было сделать. Я умеренно растянул задачу, для наглядности. При желании это все можно уместить в несколько строк.



Код:

Код: Выделить всё

#include <iostream>
#include <stdlib.h>
#include <time.h>
//Если вам сложно решить какую любо задачу, не усложняйте ее еще больше,
//применяйте метод "разделяй и властвуй". Для наглядности, 
//разделю весь процесс на отдельные части, так больше итераций, но проще понимать код
//потом, при желании, можно обьеденить, но ваша задача - изучение 
//деректива препроцессора, укажем количество элементов массива
#define N 10
using namespace std;
int main ()
{
   srand ( time(NULL) );
  //будущий массив
  int a[N];
  //итератор
  int i;
  //заполнение массива случайными числами от 49 до -50
  //можете заменить ручным вводом
  for(i=0;i<N;i++)
      a[i]=rand()%100-50;
  //выведем массив
  for(i=0;i<N;i++)
      cout<<a[i]<<" ";
  cout<<endl;
  //находжение минимального эллемента
  int min = a[0];
  for(i=1;i<N;i++)
      if (min>a[i]) min=a[i];
  //нахождение первого положительного
  cout << "Минимальный элемент: " << min << endl;  
  i=0;
  while((a[i]<0)&&(i<N)) i++;
  if (i==N) //мы не нашли положительного элемента
	  {
	  cout<<"Положительные элементы отсутствуют.";//сообщили
	  return(-1);//вышли с кодом ошибки
	  }
  else{
  	  int first = i;
	  //нахождение последнего положительного элемента
	  int last = i;
	  for (i=first;i<N;i++) if (a[i]>0) last=i;
	  //первый элемент тоже можно было найти таки мже способом:
	  //полный перебор с конца до начала, последный в списке - был бы первым в массиве
	  //просто показал оба способа
	  //теперь у вас есть два номера: начало и конец сумируемой области
	  cout<<"\nЭлементы между крайними положительными:\n";
	  int sum =0;
	  for (i=first+1; i<last; i++) //от следующего за первым, до последнего не включаяя его
	  {
		sum+=a[i];
		cout<<a[i]<<" ";
	  }
	  //в случае если элемент один, то first == last и сумма будет равна 0:
	  cout << "\nСумма элементов между крайними положительными("<<a[first]<<" и "<<a[last]<<"): "<<sum<<"\n";		
	}
 return(0);
}

Если вы не используете потоковый вывод, переформатируйте его в stdio
Аватара пользователя
bangybam

Re: C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Сообщение bangybam »

Извините за долгое отсутствие.

Error спасибо за помощь. Программа работает правильно.
Ответить

Вернуться в «Программирование и базы данных»