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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2014, 12:22   #1
alucard115
Пользователь
 
Аватар для alucard115
 
Регистрация: 25.12.2012
Сообщений: 88
Вопрос Одномерный массив, С++

В одномерном массиве, состоящей из n вещественных элементов, вычислить:
1) номер минимального элемента массива;
2) сумму элементов массива, расположенных между первым и вторым отрицательными элементами.
3) Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом - все остальные.

касательно 1 пункта:
Код:
#include <iostream>
#include <math.h>
using std::cin;
using std::cout;
using std::endl;
int main(){
int n,i,
maxelem, minelem;	 // Номера максимального и минимального элементов

cout << "Enter n: ";	 // Ввод количества элементов массива
cin >> n;
float *arr = new float [n]; // Создание массива
for (i = 0; i < n; i++){
cout << "Enter element number " << i + 1 << " : ";	 // Ввод элементов массива
cin >> arr[i];
}
maxelem = minelem = 0;
for (maxelem=minelem=i;i<n;i++){
if (fabs(arr[i]) < fabs(arr[minelem])) minelem = i;	 // Определение минимального номера по модулю элемента
}
cout << "Nomer Minimal element massiva :" << minelem <<endl;
system("pause");//Стоп-точка вконце программы
    return 0;
}
массив создает, только немного не понял, как его на экран вывести, и номер минимального элемента массива, помоему как то не так считает..) Проверьте пожалуйста, и подправьте, если не трудно.

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

3)на счет 3 пункта, нашел вот что, но как в мою задачу вписать не знаю... Думаю, стоит сначала разобраться с первыми двумя пунктами..
Код:
int n, i, j=0;
cout<<"Vvedite kolichestvo elementov\n";
cin>>n;
float *massiv=new float [n];
if(!massiv)
{
cout<<"Nedostatochno pamyati\n";
cout<<"Najmite klavishu dlya zaversheniya programmi\n";
getch();
return 0;
}
cout<<"Vvedite massiv iz"<<' '<<n<<' '<<"elemetov\n";
for(i=0; i<n; i++)
cin>>*(massiv+i);
for(int i=0; i<n; i++)
cout<<*(massiv+i)<<' ';

float *massiv2=new float [n];
if(!massiv2)
{
cout<<"Nedostatochno pamyati\n";
cout<<"Najmite klavishu dlya zaversheniya programmi\n";
getch();
return 0;
}


for(i=0; i<n; i++)
if(fabs(massiv[i])<=1)
{
massiv2[j]=massiv[i];
j++;
}

for(i=0; i<n; i++)
if(fabs(massiv[i])>1)
{
massiv2[j]=massiv[i];
j++;
}

for(int j=0; j<n; j++)
cout<<'\n'<<massiv2[j]<<' ';

delete [] massiv;
delete [] massiv2;
Буду рад, помощи, и объяснениям.)

Последний раз редактировалось alucard115; 08.01.2014 в 12:40.
alucard115 вне форума Ответить с цитированием
Старый 08.01.2014, 14:18   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Вот нахождение минимального элемента...
Код:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <locale> 

using namespace std;

double minElem(double *arr, int n);

int main() {
	int n = 0;
	
	setlocale(0, "rus");
	srand((unsigned)time(NULL));

	cout << "Введите количество элементов: ";
	cin >> n;

	double *arr = new double [n];

	for(int i = 0; i < n; i++) {
		cout << " [" << i << "] = ";
		cin >> arr[i];
	}
	cout << "\n Минимальный элемент: " << minElem(arr, n) << endl;
	delete [] arr;
	
	system("PAUSE");
	return 0;
}

double minElem(double *arr, int n) 
{
	double min = arr[0];

	for(int i = 1; i < n; i++) {
		if(arr[i] < min)
			min = arr[i];
	}
	return min;
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 09.01.2014, 12:48   #3
alucard115
Пользователь
 
Аватар для alucard115
 
Регистрация: 25.12.2012
Сообщений: 88
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Вот нахождение минимального элемента...
спасибо! А тот код, который я кидал, совсем не верен, по нахождению минимального элемента..?

по 2 подпункту:
Код:
#include <iostream>
#include <stdlib.h>
using namespace std;

int main() {
const int n = 10;
float a[n];
int sub_count=0;
float sum=0;

for (int i=0;i<n;i++) {
a[i] = rand()%10;
cout << a[i] << "\t";
}

cout << "\n";

for (int i=1;i<n;i++) { 
if (a[i]<0) sub_count++; 
if (sub_count==1) sum+=a[i];
}

cout << sum;

return 0;
}
это верно?
нашел в сети, с таким пояснением :
Цитата:
Сумма всех элементов между первым отрицательным и вторым отрицательным.
Для решения этой задачи нам потребуется ввести понятие флаг (индикатор). В данном случае нам потребуется частный вид флага в виде счетчика. введем переменную которая будет содержать количество найденных нами отрицательных элементов массива
int sub_count = 0;

в теле цикла будем увеличивать значение этой переменной при каждом нахождении отрицательного элемента
for (int i=1;i<n;i++) { if (a[i]<0) sub_count++; }
Теперь все готово для решения основной задачи. На отрезке между первым и вторым отрицательным элементом значение sub_count будет равно 1. Соответственно нам нужно суммировать все элементы при которых sub_count=1
но что то, при запуске программы, непонятно что он высчитывает...

Последний раз редактировалось alucard115; 09.01.2014 в 12:53.
alucard115 вне форума Ответить с цитированием
Старый 10.01.2014, 16:50   #4
alucard115
Пользователь
 
Аватар для alucard115
 
Регистрация: 25.12.2012
Сообщений: 88
По умолчанию

Что скажете?
alucard115 вне форума Ответить с цитированием
Старый 10.01.2014, 20:42   #5
vvmcpp
Форумчанин
 
Аватар для vvmcpp
 
Регистрация: 11.12.2010
Сообщений: 116
По умолчанию

цикл от 1 до n не будет учитывать первый элемент массива, то есть a[0]
Код:
for (int i=1;i<n;i++)
Нам нужно найти сначала отрезок от какого элемента до какого считать сумму.
например от a[firstIndex] до a[secondIndex]

Код:
for(i=0;i<n;i++)
{
//находим первый индекс
   if (a[i]<0) { 
                firstIndex=i;
                subIndex++;
                   }
//находим второй индекс
 if(subIndex==1) secondIndex=i;
   
}

// теперь считаем от a[firstIndex] до a[secondIndex] сумму
for(i=firstIndex;i<secondIndex;i++)
sum+=a[i];
примерно так, потом уже вы можете подумать, как оптимизировать

и еще

// тестирование случайного числа
// вам нужно предусмотреть смену знака в выражении rand () % 10; не получается отрицательных

Код:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int  iArrayLength=12;
    int iArray[iArrayLength];
    
    for (int i=0;i<iArrayLength;i++)
        {
        // rand () % 10; выдает положительное число от 0 до 9
        iArray[i]= rand () % 10;
        // вывод iArray[i]
        cout<<iArray[i]<<" ";
        
        }
    system("PAUSE");
    return EXIT_SUCCESS;
}

Последний раз редактировалось vvmcpp; 11.01.2014 в 00:04. Причина: дополнение ответа
vvmcpp вне форума Ответить с цитированием
Старый 10.01.2014, 22:21   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Может немного заморочено...

Код:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <locale> 

using namespace std;

double minElem(double *arr, int n);
double summElem(double *arr, int n);

int main() {
	int n = 0;
	
	setlocale(0, "rus");
	srand((unsigned)time(NULL));

	cout << "Введите количество элементов: ";
	cin >> n;

	double *arr = new double [n];

	for(int i = 0; i < n; i++) {
		cout << " [" << i << "] = ";
		cin >> arr[i];
	}
	cout << "\n Минимальный элемент: " << minElem(arr, n) << endl;
	cout << "\n Сумма элементов: " << summElem(arr, n) << endl;
	delete [] arr;
	
	system("PAUSE");
	return 0;
}

double minElem(double *arr, int n) 
{
	double min = arr[0];

	for(int i = 1; i < n; i++) {
		if(arr[i] < min)
			min = arr[i];
	}
	return min;
}

double summElem(double *arr, int n)
{
	double summ = 0.0;
	bool flag = false;	// Флаг
	int begin = 0;
	int end = 0;	

	for(int i = 0; i < n; i++) {
		if(arr[i] < 0 && !flag) {
			begin = i;
			flag = true;
		}
		else if(arr[i] < 0 && flag) {
			end = i;
			break;
		}
	}
	
	for(int i = begin + 1; i < end; i++) {
		summ += arr[i];
	}
	return summ;
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 17.01.2014, 10:46   #7
alucard115
Пользователь
 
Аватар для alucard115
 
Регистрация: 25.12.2012
Сообщений: 88
По умолчанию

Цитата:
Сообщение от vvmcpp Посмотреть сообщение
Спасибо! С поиском элемента, тут понятно стало более менее,ну, как находить я имею ввиду. А касательно, "rand ()% 10", можно упростить, заменив так, чтобы пользователь сам вводил числа, и отрицательные тоже. но , это конечно не грамотно, и простовато.. где то у меня было в кодах, вроде, где выставляются случайные числа и отрицательные тоже рандомно.
alucard115 вне форума Ответить с цитированием
Старый 17.01.2014, 10:47   #8
alucard115
Пользователь
 
Аватар для alucard115
 
Регистрация: 25.12.2012
Сообщений: 88
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Может немного заморочено...
Спасибо большое! Эмм.. постараюсь разобраться в том, что Вы написали, все работает, но все же понять тоже надо бы..)
alucard115 вне форума Ответить с цитированием
Старый 17.01.2014, 10:49   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Переделайте немного мой код, вставьте генератор случайных чисел. И вперед...
Я старался максимально просто код написать....
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 17.01.2014 в 10:51.
Bugrimov вне форума Ответить с цитированием
Старый 17.01.2014, 11:46   #10
alucard115
Пользователь
 
Аватар для alucard115
 
Регистрация: 25.12.2012
Сообщений: 88
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Переделайте немного мой код, вставьте генератор случайных чисел. И вперед...
Я старался максимально просто код написать....
Ура!) вот, поставил генератор случайных чисел от -10 до 10.

Код:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <locale> 

using namespace std;

double minElem(double *arr, int n);
double summElem(double *arr, int n);

int main() {
	int n = 0;
	
	setlocale(0, "rus");
	srand((unsigned)time(NULL));

	cout << "Введите количество элементов: ";
	cin >> n;

	double *arr = new double [n];
	
	for(int i = 0; i < n; i++) {
		 arr[i]=rand() % 20 - 10;
		cout << " [" << i << "] = ";
		cout << arr[i];
	}
	cout << "\n Минимальный элемент: " << minElem(arr, n) << endl;
	cout << "\n Сумма элементов: " << summElem(arr, n) << endl;
	delete [] arr;
	
	system("PAUSE");
	return 0;
}

double minElem(double *arr, int n) 
{
	double min = arr[0];

	for(int i = 1; i < n; i++) {
		if(arr[i] < min)
			min = arr[i];
	}
	return min;
}

double summElem(double *arr, int n)
{
	double summ = 0.0;
	bool flag = false;	// Флаг
	int begin = 0;
	int end = 0;	

	for(int i = 0; i < n; i++) {
		if(arr[i] < 0 && !flag) {
			begin = i;
			flag = true;
		}
		else if(arr[i] < 0 && flag) {
			end = i;
			break;
		}
	}
	
	for(int i = begin + 1; i < end; i++) {
		summ += arr[i];
	}
	return summ;
}
все работает как надо) А можете рассказать вот про то, что красным цветов выделил? своими словами, а то не много непонятно что это и как работает..) в интернете прочитал про флаги, и "bool", но толком не понял что это и для чего.. Я так понял, что "bool" - тип данных, принимающих только значения "true" или "false". А флаги - это переменные, булева типа, в основном, которые тоже принимают значения либо "true" либо "false". Например, при поиске элемента в массиве, и элемент найден, то переменная принимает значение true, и впоследствии в коде идет проверка.. так? Может, вы как то попроще сможете объяснить?)

И на счет 3) Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом - все остальные.

Я так представляю. Вот, есть допустим сгенерированный одномерный массив из 5 элементов. ДЛя примера, пока что пусть будут такие числа : [0]=2 [1]=1 [2]=-3 [3]=-2 [4]=5
Значит, нужно поставить условие, чтобы просчитать элементы, и затем, вывести на экран от самого меньшего к большему.. Я, правильно думаю?)
т.е. должно получиться -3, -2, 1 , 2, 5 .. ?
т.к. это все же одна программа, то у меня есть уже сгенерированный одномерный массив. Чтобы задать условие и программа могла подсчитать и сравнить числа между собой, что нужно сделать..?)
Код:
for(i=0; i<n; i++)
if(fabs(massiv[i])<=1)
{
massiv2[j]=massiv[i];
j++;
}

for(i=0; i<n; i++)
if(fabs(massiv[i])>1)
{
massiv2[j]=massiv[i];
j++;
}
добавить еще один без элементный массив, в которого будут отсчитываться сначала все элементы меньше или равные 1, а затем больше 1?

Последний раз редактировалось alucard115; 17.01.2014 в 12:02.
alucard115 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти одномерный массив элементы которого равны минимальным значениям в строках исходной матрицы и одномерный массив элементы... Richik123 Microsoft Office Excel 1 16.10.2013 15:45
Двумерный массив развернуть в одномерный массив по строкам[QBASIC] TrueStyle777 Помощь студентам 3 29.05.2013 21:56
Дан одномерный массив, сформировать новый массив по заданному правилу {Delphi} Nickolai47 Помощь студентам 5 16.12.2012 14:51
Одномерный массив и Двумерный массив eugene1437 Общие вопросы C/C++ 15 25.05.2011 19:17
Одномерный массив. Q basic - Построить новый массив из элементов исходного ,которые больше P. Marishkaa Помощь студентам 2 12.01.2010 16:54