Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

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

Новый участник


Сообщения: 18
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Добрый вечер!
Программа, на си, должна показывать минимальное введенное значение и суммировать элементы которые находятся между первым и последним позитивным элементом( не включая их).
Минимальное значение находит правильно, а вот когда первое введенное значение равно 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;
}

Отправлено: 22:53, 22-10-2012

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4462
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


bangybam,
Цитата bangybam:
s+= a[0]<0||a[9]<0 ? 0 : a[i]; »
Для меня загадка, что происходит в данном действии.
Можно это расписать пооперационно?
s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля... дальше я не понимаю.
Это во первых.
Во вторых, что с инициализацией переменных?
Чему равно начальное значение s?
Ну и в третьих -- min значение ищется с ошибкой. (Т.е. работает не во всех случаях).

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 23:52, 22-10-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ferget

Разный


Сообщения: 1294
Благодарности: 359

Профиль | Отправить PM | Цитировать


Цитата lxa85:
s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля... дальше я не понимаю. »
s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля прибавляем 0, иначе прибавляем a[i]

Отправлено: 02:40, 23-10-2012 | #3


Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось bangybam, 23-10-2012 в 16:51.


Отправлено: 10:31, 23-10-2012 | #4


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:18, 23-10-2012 | #5


Аватара для lxa85

Необычный


Contributor


Сообщения: 4462
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


bangybam, хорошо. С циклом мне понятно. Т.е. понятно, какое действие выполняется. Смысл действия -- остается загадкой.
По заданию -- "сумма между первым и последним положительным элементом". (позитивный элемент -- надо будет взять на заметку :) )
Как в это участвует условие положительности первого ИЛИ последнего элемента, не понятно.
Цитата bangybam:
в чем ошибка в min. »
Что если все элементы массива больше 100000 ?
Откуда взялась эта константа, и почему есть уверенность, что это самое большое число?
Ответ собственно очевиден -- в отладочных целях.
Но работает предложенный алгоритм не во всех случаях.

---

Rulan_IR, Введение в языки программирования C и C++. Автор: Ю.Л. Кетков
Глава 10: Работа с файлами.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 08:29, 24-10-2012 | #6


Пользователь


Сообщения: 107
Благодарности: 9

Профиль | Цитировать


Цитата bangybam:
а вот когда первое введенное значение равно 0 то сумму пишет тоже равную нулю. »
Конечно не работает, написанный код совсем не то делает.
Цитата bangybam:
s+= a[0]<0||a[9]<0 ? 0 : a[i]; »
Твой код делает следующее: если первый из введённых 10ти элементов меньше нуля, или последний меньше нуля, то прибавляем к s 0 во ВСЕХ десяти проходах цикла, а если же хотя бы один из этих элементов массива (1ый или 10ый) больше нуля, то добавляем текущее.

Тебе надо так:

Цитата bangybam:
суммировать элементы которые находятся между первым и последним позитивным элементом( не включая их) »
Код: Выделить весь код
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);
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:11, 24-10-2012 | #7


Новый участник


Сообщения: 6
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Sidewalker, у вас есть ошибки:
- нет определения минимального значения;
- неправильное количество скобок;
- отрицательные элементы в сумму они не попадут;

Отправлено: 14:27, 26-10-2012 | #8


Новый участник


Сообщения: 6
Благодарности: 1

Профиль | Отправить PM | Цитировать


Вот, примерно, то что вам нужно было сделать. Я умеренно растянул задачу, для наглядности. При желании это все можно уместить в несколько строк.
Код: Выделить весь код
#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
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:21, 26-10-2012 | #9


Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:36, 30-10-2012 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Неправильно работает код. Не могу найти ошибку.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
драйвер видеокарты не работает или работает неправильно Kilimnik Pasha Металлолом 6 24-04-2012 19:58
помогите найти ошибку igor7 Программирование в *nix 1 07-02-2011 09:55
CMD/BAT - Не могу найти ошибку Dremuk Скриптовые языки администрирования Windows 1 28-01-2010 15:35
Разное - Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе yulia_hoi Программирование и базы данных 6 08-01-2010 14:50
JavaScript, не могу найти ошибку modem Вебмастеру 3 01-03-2005 15:08




 
Переход