Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Одномерный массив / 25 сообщений из 36, страница 1 из 2
14.04.2014, 19:43
    #38614703
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Добрый вечер, товарищи программисты. Начну с задания, закончу тем, что я сделал и тем, что не сделал. Очень рассчитываю на вашу помощь.
Задание:
Приложу лучше фото, а то как-то непонятно отображается...

Код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
int A[16], B[26];
     for (int i = 0; i < 16; i++)
	 {
     *(A + i) =rand();
     }
     printf("massiv A: \n");
     for (int i = 0; i < 16; i++)
	 {
     printf("%i %i \n", i, *(A + i));
     }
	 for (int i = 0; i<26; i++)
	 {
	 *(B + i) =rand();
	 }
	 printf ("\n"); 
	 printf ("\n");
	 printf ("\n");
	 printf("massiv B: \n");
	 for (int i = 0; i<26; i++)
	 {
	 printf("%i %i \n", i, *(B + i));
	 }
     return 0;
}


Собственно сформировал массивы, но не понял как создать массив, состоящий из элементов, расположенных между минимальным и максимальным элементами каждого из массивов А и В.
...
Рейтинг: 0 / 0
14.04.2014, 19:55
    #38614710
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SergeyVDне понял как создать массив, состоящий из элементов, расположенных между
минимальным и максимальным элементами каждого из массивов А и В.
Сначала надо найти максимальный и минимальный элемент массивов А и В.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.04.2014, 20:07
    #38614724
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Максимальный размер массива C равен сумме размеров массивов A и B.
Дальше зависит от интерпретации слова "между".
Если "все значения между позицией минимального и позицией максимального элемента", то пробежаться по массиву A и запомнить позиции максимального и минимального элемента. Откопировать элементы между этими позициями (от нуля до всего массива).
Повторить для массива B.
Вывести реально откопированные в массив C значения.
Если "между" это "все значения между минимальным и максимальным" - тупо копируем весь массив.
Ну и плюс ньюансы включения-исключения граничных индексов/значений :)
...
Рейтинг: 0 / 0
14.04.2014, 20:15
    #38614730
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Я так понял, надо писать программу не через printf, а через cout?)
...
Рейтинг: 0 / 0
14.04.2014, 20:17
    #38614732
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Basil A. Sidorov, то есть можно не находить макс и мин элементы, а сразу вычислить сумму массивов?
...
Рейтинг: 0 / 0
14.04.2014, 20:33
    #38614739
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SergeyVDBasil A. Sidorov, то есть можно не находить макс и мин элементы, а сразу вычислить сумму массивов?Не только можно, но и нужно, т.к. без специальных ухищрений вы не можете задать переменный размер массива.
Если вы об интерпретации термина "между", то: ваша задача - вам и решать.
...
Рейтинг: 0 / 0
14.04.2014, 20:34
    #38614740
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Или сделать вот так, но у меня debug error вылезает :D
Для массива А:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for (int i=1;i<16;i++)
{
 if (min>A[i])
   min=A[i];
 if (max<A[i])
   max=A[i];
}
 printf("Max=%d\n", max);
 printf("Min=%d\n", max);
...
Рейтинг: 0 / 0
14.04.2014, 20:35
    #38614742
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Basil A. Sidorov, хорошо, попробую сделать сумму
...
Рейтинг: 0 / 0
14.04.2014, 21:23
    #38614779
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SergeyVD,

ну наконец-то, однострочник:
Код: plaintext
1.
std::copy(std::distance(std::min_element(B, B + 26), std::max_element(B, B + 26)) < 0 ? std::min_element(B, B + 26) : std::max_element(B, B + 26), std::distance(std::min_element(B, B + 26), std::max_element(B, B + 26)) < 0 ? std::max_element(B, B + 26) : std::min_element(B, B + 26), std::copy(std::distance(std::min_element(A, A + 16), std::max_element(A, A + 16)) < 0 ? std::min_element(A, A + 16) : std::max_element(A, A + 16), std::distance(std::min_element(A, A + 16), std::max_element(A, A + 16)) < 0 ? std::max_element(A, A + 16) : std::min_element(A, A + 16), C));
...
Рейтинг: 0 / 0
15.04.2014, 10:15
    #38615040
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Mozok, да вы человек-тернарь ;)
SergeyVD, это у него такой юмор, не пугайтесь. Через 5 часов попробую помочь вам
...
Рейтинг: 0 / 0
15.04.2014, 13:38
    #38615263
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
#include <stdio.h>
#include <stdlib.h>

int extremum(int* a,int power, char* min_or_max)
{
	int* ex=a;
	int* s_a=a;
	if (min_or_max=="min")
	{
		for(int i=1;i<power;i++)	ex=(*ex<=*(a+i))?ex:(a+i);
	}
	else if (min_or_max=="max")
	{
		for(int i=1;i<power;i++)	ex=(*ex>=*(a+i))?ex:(a+i);
	}
	//добавить обработку исключения
	return ex-s_a;
}


int main(int argc, char* argv[])
{
	int a[16],b[26];
	//Заполняем массивы
	for(int i=0;i<16;i++)
	{
		*(a+i)=rand()%100;
		printf("%i ",*(a+i));
	}
	printf("\n");
	for(int i=0;i<26;i++)
	{
		*(b+i)=rand()%100;
		printf("%i ",*(b+i));
	}

	printf("\n %i %i",extremum(a,16,"min"),extremum(a,16,"max"));
	printf("\n%i %i \n",extremum(b,26,"min"),extremum(b,26,"max"));
	//Заполняем результирующий массив
	//алгоритм оптимизируйте, либо измените
	int st_a=(extremum(a,16,"max")>=extremum(a,16,"min"))?extremum(a,16,"min"):extremum(a,16,"max");
	int e_a=(extremum(a,16,"max")>=extremum(a,16,"min"))?extremum(a,16,"max"):extremum(a,16,"min");
	int st_b=(extremum(b,26,"max")>=extremum(b,26,"min"))?extremum(b,26,"min"):extremum(b,26,"max");
	int e_b=(extremum(b,26,"max")>=extremum(b,26,"min"))?extremum(b,26,"max"):extremum(b,26,"min");
	
	int c[42];
	int i=0;
	for(;i<=e_a-st_a+1;i++)
	{
		*(c+i)=*(a+st_a+i);
	}
	for(int j=0;j<=e_b-st_b;j++)
	{
		*(c+i+j-1)=*(b+st_b+j);
	}

	for(int i=0;i<42;i++)
	{
		printf("%i ",*(c+i));
	}
	//В нём пожалуй не просто разобраться, и он не в общем виде. Перепишите.
	//Задача решена в первом приближении. Проверьте.
	while(1){}
	return 0;
}
...
Рейтинг: 0 / 0
15.04.2014, 13:48
    #38615275
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int extremum(int* a,int power, char* min_or_max)
{
	if (min_or_max=="min")
...
}
...
	printf("\n %i %i",extremum(a,16,"min"),extremum(a,16,"max"));


Так нельзя писать, если это и заработало, то благодаря компилятору, который всем "min" дал один адрес.
В таких случаях делают константы дефайнами
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#define EXTREMUM_MIN 1
#define EXTREMUM_MAX 2

int extremum(int* a,int power, int min_or_max)
{
	if (min_or_max==EXTREMUM_MIN)
}

printf("\n %i %i",extremum(a,16,EXTREMUM_MIN),extremum(a,16,EXTREMUM_MAX));
...
Рейтинг: 0 / 0
15.04.2014, 14:26
    #38615364
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
оу. Теперь понятно зачем нужны #define
Спасибо :)
а почему нельзя ? Неграмотно ?
...
Рейтинг: 0 / 0
15.04.2014, 14:38
    #38615376
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SashaMercuryа почему нельзя ?
Подумай что произойдет при таком использовании твоей функции
Код: plaintext
1.
2.
char oper[] = "max";
extremum(a,16,oper);
...
Рейтинг: 0 / 0
15.04.2014, 14:48
    #38615393
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Понял вроде. По факту я не сравниваю две строки, я сравниваю два адреса в своей программе. Функция вернёт 0.
Не проверял, это мои логические рассуждения.

Да, это очень серьёзная ошибка, особенно учитывая сколько я разбирал strcmp, и зачем она нужна.
...
Рейтинг: 0 / 0
15.04.2014, 15:00
    #38615411
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Проверил, и правда 0 возвращает. Спасибо C:
Переписал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
// SergeyVD.cpp: определяет точку входа для консольного приложения.
//

#include <stdio.h>
#include <stdlib.h>
#define EXTREMUM_MIN 1
#define EXTREMUM_MAX 2
int extremum(int* a,int power, int min_or_max)
{
	int* ex=a;
	int* s_a=a;
	if (min_or_max==EXTREMUM_MIN)
	{
		for(int i=1;i<power;i++)	ex=(*ex<=*(a+i))?ex:(a+i);
	}
	else if (min_or_max==EXTREMUM_MAX)
	{
		for(int i=1;i<power;i++)	ex=(*ex>=*(a+i))?ex:(a+i);
	}
	//добавить обработку исключения
	return ex-s_a;
}


int main(int argc, char* argv[])
{
	int a[16],b[26];
	//Заполняем массивы
	for(int i=0;i<16;i++)
	{
		*(a+i)=rand()%100;
		printf("%i ",*(a+i));
	}
	printf("\n");
	for(int i=0;i<26;i++)
	{
		*(b+i)=rand()%100;
		printf("%i ",*(b+i));
	}
	printf("\n %i %i",extremum(a,16,EXTREMUM_MIN),extremum(a,16,EXTREMUM_MAX));
	printf("\n%i %i \n",extremum(b,26,EXTREMUM_MIN),extremum(b,26,EXTREMUM_MAX));
	//Заполняем результирующий массив
	//алгоритм оптимизируйте, либо измените
	int st_a=(extremum(a,16,EXTREMUM_MAX)>=extremum(a,16,EXTREMUM_MIN))?extremum(a,16,EXTREMUM_MIN):extremum(a,16,EXTREMUM_MAX);
	int e_a=(extremum(a,16,EXTREMUM_MAX)>=extremum(a,16,EXTREMUM_MIN))?extremum(a,16,EXTREMUM_MAX):extremum(a,16,EXTREMUM_MIN);
	int st_b=(extremum(b,26,EXTREMUM_MAX)>=extremum(b,26,EXTREMUM_MIN))?extremum(b,26,EXTREMUM_MIN):extremum(b,26,EXTREMUM_MAX);
	int e_b=(extremum(b,26,EXTREMUM_MAX)>=extremum(b,26,EXTREMUM_MIN))?extremum(b,26,EXTREMUM_MAX):extremum(b,26,EXTREMUM_MIN);
	
	int c[42];
	int i=0;
	for(;i<=e_a-st_a+1;i++)
	{
		*(c+i)=*(a+st_a+i);
	}
	for(int j=0;j<=e_b-st_b;j++)
	{
		*(c+i+j-1)=*(b+st_b+j);
	}

	for(int i=0;i<42;i++)
	{
		printf("%i ",*(c+i));
	}
	//В нём пожалуй не просто разобраться, и он не в общем виде. Перепишите.
	//Задача решена в первом приближении. Проверьте.
	while(1){}
	return 0;
}
...
Рейтинг: 0 / 0
15.04.2014, 15:11
    #38615423
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SashaMercuryПроверил, и правда 0 возвращает. Спасибо C:
Переписал ...
Я бы просто сделал две функции extremum_max() и extremum_min(), тогда не надо будет лишних if(), #define, а главное проверки корректности min_or_max и головоломки что делать если оно некорректно. Это сугубо мое мнение. В том виде как ты написал работать будет.
...
Рейтинг: 0 / 0
15.04.2014, 15:25
    #38615445
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Каждая из этих функций будет работать быстрее, чем одна. Хотя может быть и нет.
Вот интересно, при разработке какого-либо проекта, с точки зрения "грамотности"(я не знаю как правильно назвать то, о чём я думаю) или качества проекта, как лучше было бы поступить ? Подсознательно думаю что две функции, но доказать не могу.
Мне пора идти. Всего доброго )
...
Рейтинг: 0 / 0
15.04.2014, 15:41
    #38615481
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SashaMercuryКаждая из этих функций будет работать быстрее, чем одна. Хотя может быть и нет.
Быстрее будет одна считающая мин и макс за один проход массива :)

SashaMercuryВот интересно, при разработке какого-либо проекта, с точки зрения "грамотности"(я не знаю как правильно назвать то, о чём я думаю) или качества проекта, как лучше было бы поступить ?
Это называется "архитектура приложения", есть другие синонимы. Тут однозначных ответов нет, т.к. одну и туже задачу можно решить по-разному и не всегда главный критерий "чтобы быстрее работала". Есть книги на тему "проектирование приложений", почитай, а дальше сам для себя выводы сделаешь. Только тут на эту тему вопросы не поднимай, будет много мата :)
...
Рейтинг: 0 / 0
15.04.2014, 17:06
    #38615683
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SashaMercury, спасибо большое за помощь, сейчас попробую по аналогии доделать свою программу, ну а если не получится сегодня (время поджимает, к сожалению) возьму ваш вариант.
И спасибо всем, кто откликнулся, помог в решении задачки :)
...
Рейтинг: 0 / 0
15.04.2014, 17:16
    #38615709
SergeyVD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SashaMercury, только в вашей программе какая-то ошибка в вычислении массива С ( я про мистические -85899...)
...
Рейтинг: 0 / 0
15.04.2014, 17:34
    #38615732
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SergeyVDSashaMercury, только в вашей программе какая-то ошибка в вычислении массива С ( я про мистические -85899...)Инициализировать массив не пробовали? Будут заданные вами мистические значения.
...
Рейтинг: 0 / 0
15.04.2014, 18:02
    #38615769
luislom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SergeyVDДобрый вечер

Шмальни так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
#include <iostream>
#include <algorithm>
#define N 800
#define M 1800 

int cmp(int* a, int* b){ return *a<*b; };

int main () {

 int A[N];
 int* Ap[N];
 
int B[M];
 int* Bp[M]; /* Чтоб стек/крышу не сорвало лучше делать malloc, но в треде принято.. */

int i;
int n;
int m;
int* A_p;
int* B_p;

i=N;
 do{ --i; Ap[i]=&A[i]; A[i]=random(); }while(i>0);
i=M;
 do{ --i; Bp[i]=&B[i]; B[i]=random(); }while(i>0);
 
 std::sort(Ap, Ap+N, cmp);
 std::sort(Bp, Bp+M, cmp); /* У кого С-11 могут такую красоту: std::sort(Bp, Bp+M, [](int* a, int* b){ return *a < *b; });*/

  i=0; n=0;

  if((i=Ap[N-1]-Ap[0]-1)<0){ i=Ap[0]-Ap[N-1]-1; A_p=Ap[N-1]; }else{ A_p=Ap[0]; };
  if((n=Bp[M-1]-Bp[0]-1)<0){ n=Bp[0]-Bp[M-1]-1; B_p=Bp[M-1]; }else{ B_p=Bp[0]; }

  m=i+n;

int* C;

try{

 C=new int[m]; /* или int C[m] */

 }catch(std::bad_alloc& c){ std::cout<<"Yob\n"; exit(-1); };

 while(i>0){ --m; --i; C[m]=*(A_p++); };
                                             
while(n>0){ --m; --n; C[m]=*(B_p++); };
/*

..................................................................................

*/
  delete [] C;

};
...
Рейтинг: 0 / 0
15.04.2014, 21:40
    #38615896
luislom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
Пацаны облом.
Вместо

Код: plaintext
1.
2.
3.
 while(i>0){ --m; --i; C[m]=*(A_p++); };
                                             
while(n>0){ --m; --n; C[m]=*(B_p++); };



Делаем по фэн-шую

Код: plaintext
1.
2.
3.
 while(i>0){ --m; --i; C[m]=*(++A_p); };
                                             
while(n>0){ --m; --n; C[m]=*(++B_p); };
...
Рейтинг: 0 / 0
16.04.2014, 02:39
    #38615976
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одномерный массив
SergeyVD, писал что задача решена в первом приближении. Как вам правильно подсказали, это непроинициализированные объекты.
luislom, весёлый, поднимающий настроение код и комментарии :D Только жаль вы использовали #include <algorithm>
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Одномерный массив / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]