Показать полную графическую версию : [решено] Неправильно работает код. Не могу найти ошибку.
bangybam
22-10-2012, 22:53
Добрый вечер!
Программа, на си, должна показывать минимальное введенное значение и суммировать элементы которые находятся между первым и последним позитивным элементом( не включая их).
Минимальное значение находит правильно, а вот когда первое введенное значение равно 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;
}
bangybam, s+= a[0]<0||a[9]<0 ? 0 : a[i]; »
Для меня загадка, что происходит в данном действии.
Можно это расписать пооперационно?
s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля... дальше я не понимаю.
Это во первых.
Во вторых, что с инициализацией переменных?
Чему равно начальное значение s?
Ну и в третьих -- min значение ищется с ошибкой. (Т.е. работает не во всех случаях).
s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля... дальше я не понимаю. »
s = s + первый элемент меньше нуля ИЛИ 10ый элемент меньше нуля прибавляем 0, иначе прибавляем a[i]
bangybam
23-10-2012, 10:31
первое ferget объяснила правильно, второе там s=0, а третье объясни в чем ошибка в min.
Rulan_IR
23-10-2012, 21:18
Доброго вечера всем!
У меня возникла такая проблема. Подскажите пожалуйста, как на с++ сделать так, что при запуске программы, она ожидала ввода имя файла, и если имя файла неверное, то выдавала бы ошибку об этом, и выдавала бы ошибку при нажатии "Enter". Заранее спасибо!
bangybam, хорошо. С циклом мне понятно. Т.е. понятно, какое действие выполняется. Смысл действия -- остается загадкой.
По заданию -- "сумма между первым и последним положительным элементом". (позитивный элемент -- надо будет взять на заметку :) )
Как в это участвует условие положительности первого ИЛИ последнего элемента, не понятно.
в чем ошибка в min. »
Что если все элементы массива больше 100000 ?
Откуда взялась эта константа, и почему есть уверенность, что это самое большое число?
Ответ собственно очевиден -- в отладочных целях.
Но работает предложенный алгоритм не во всех случаях.
---
Rulan_IR, Введение в языки программирования C и C++. Автор: Ю.Л. Кетков (http://www.intuit.ru/department/pl/ccpp/)
Глава 10: Работа с файлами.
Sidewalker
24-10-2012, 10:11
а вот когда первое введенное значение равно 0 то сумму пишет тоже равную нулю. »
Конечно не работает, написанный код совсем не то делает.
s+= a[0]<0||a[9]<0 ? 0 : a[i]; »
Твой код делает следующее: если первый из введённых 10ти элементов меньше нуля, или последний меньше нуля, то прибавляем к s 0 во ВСЕХ десяти проходах цикла, а если же хотя бы один из этих элементов массива (1ый или 10ый) больше нуля, то добавляем текущее.
Тебе надо так:
суммировать элементы которые находятся между первым и последним позитивным элементом( не включая их) »
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);
bangybam, уточните задание: известно ли сколько элементов будет, или их количество задается во время работы, или оно не известно, но ввод заканчивается по какому-либо признаку.
Sidewalker, у вас есть ошибки:
- нет определения минимального значения;
- неправильное количество скобок;
- отрицательные элементы в сумму они не попадут;
Вот, примерно, то что вам нужно было сделать. Я умеренно растянул задачу, для наглядности. При желании это все можно уместить в несколько строк.
#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
Извините за долгое отсутствие.
Error спасибо за помощь. Программа работает правильно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.