Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Неправильно работает код. Не могу найти ошибку. (http://forum.oszone.net/showthread.php?t=245262)

bangybam 22-10-2012 22:53 2010436

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


lxa85 22-10-2012 23:52 2010467

bangybam,
Цитата:

Цитата bangybam
s+= a[0]<0||a[9]<0 ? 0 : a[i]; »

Для меня загадка, что происходит в данном действии.
Можно это расписать пооперационно?
s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля... дальше я не понимаю.
Это во первых.
Во вторых, что с инициализацией переменных?
Чему равно начальное значение s?
Ну и в третьих -- min значение ищется с ошибкой. (Т.е. работает не во всех случаях).

ferget 23-10-2012 02:40 2010522

Цитата:

Цитата lxa85
s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля... дальше я не понимаю. »

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

bangybam 23-10-2012 10:31 2010601

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

Rulan_IR 23-10-2012 21:18 2010935

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

lxa85 24-10-2012 08:29 2011139

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

Цитата bangybam
в чем ошибка в min. »

Что если все элементы массива больше 100000 ?
Откуда взялась эта константа, и почему есть уверенность, что это самое большое число?
Ответ собственно очевиден -- в отладочных целях.
Но работает предложенный алгоритм не во всех случаях.

---

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

Sidewalker 24-10-2012 10:11 2011171

Цитата:

Цитата 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);


Error_ 26-10-2012 14:27 2012624

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

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

Error_ 26-10-2012 17:21 2012758

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

#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 30-10-2012 15:36 2015095

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


Время: 00:09.

Время: 00:09.
© OSzone.net 2001-