Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си/поменять два элемента массива местами / 25 сообщений из 25, страница 1 из 1
22.04.2016, 18:22
    #39222788
JaCoOps
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
Добрый вечер, собственно что мне нужно описано в название темы, пытался реализовать но как то не очень получилось, меняет только два элемента из всего массива, вот мои попытки задание а ):
Код: 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.
/*laba4v8_3.c - Создать массив из n чисел. И 
 a) поменять местами элементы: a0 c a2, a4 и a6 и тд
 б) удалить из массива последовательности подряд идущих одинаковых элементов, оставить от каждой такой последовательности по одному элементу
 в) сформировать новый массив, состоящий из локальных минимумов первого массива, те таких xi, что xi-1 > xi M xi+1*/
#include <stdio.h>

main()
{
  int i = 0;
  int n;
printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: %c[%d;%dmВведите n =%c[%dm ", 27, 8, 33, 27, 0);
      scanf("%d", &n);
  int mass[n];
//массив
printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: %c[%d;%dmВведите массив:%c[%dm\n", 27, 8, 33, 27, 0);
      for(i = 0; i < n; i++){
	printf("::: a[%d] = ", i);
	  scanf("%d", &mass[i]);
      }
printf(":::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: Входной массив:\t");
      for(i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
      }
    printf("\n::: Обработанный массив:");
      for (i = 0; i < n+1; i++){
	  int temp = mass[i];
	  mass[i] = mass[i + 2];
	  mass[i + 2] = temp;
      for (i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
	}
      }
printf("\n:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
}
...
Рейтинг: 0 / 0
23.04.2016, 03:44
    #39222963
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
JaCoOps,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// вывод элементов до перестановки
// перестановка:
for (i = 2; i < n; i += 3) {
  temp = mass[i - 2];
  mass[i - 2] = mass[i];
  mass[i] = temp;
}
// вывод после
...
Рейтинг: 0 / 0
25.04.2016, 17:13
    #39224062
JaCoOps
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
UsmanJaCoOps,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// вывод элементов до перестановки
// перестановка:
for (i = 2; i < n; i += 3) {
  temp = mass[i - 2];
  mass[i - 2] = mass[i];
  mass[i] = temp;
}
// вывод после



получаются те же самые выходные данные что и были при первом коде

Код: sql
1.
2.
3.
::: [А] :::::::::::::::::::::::::::::::::::::::::::
::: Входной массив:      [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
::: Обработанный массив: [3] [2] [1] [4] [5] [6] [7] [8] [9] [10]
...
Рейтинг: 0 / 0
25.04.2016, 18:04
    #39224103
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
JaCoOps,

Значение n должно быть равно количеству элементов в массиве.
Последний вариант кода в студию! (:
...
Рейтинг: 0 / 0
25.04.2016, 18:09
    #39224105
JaCoOps
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
Проблема решена) поставил вывод массива в цикле // перестановка:
Код: sql
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.
/*laba4v8_3.c - Создать массив из n чисел. И 
 a) поменять местами элементы: a0 c a2, a4 и a6 и тд
 б) удалить из массива последовательности подряд идущих одинаковых элементов, оставить от каждой такой последовательности по одному элементу
 в) сформировать новый массив, состоящий из локальных минимумов первого массива, те таких xi, что xi-1 > xi M xi+1*/
#include <stdio.h>
main(){
  int i = 0;
  int n;
printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: %c[%d;%dmВведите n =%c[%dm ", 27, 8, 33, 27, 0);
      scanf("%d", &n);
  int mass[n];
//массив
printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
    printf("::: %c[%d;%dmВведите массив:%c[%dm\n", 27, 8, 33, 27, 0);
      for(i = 0; i < n; i++){
	printf("::: a[%d] = ", i);
	  scanf("%d", &mass[i]);
      }
printf("::: %c[%d;%dm[А]%c[%dm :::::::::::::::::::::::::::::::::::::::::::\n", 27, 8, 33, 27, 0);
// Задание а)
    printf("::: Входной массив:\t");
      for(i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
      }
    printf("\n::: Обработанный массив:");
// перестановка:
      for (i = 2; i < n; i += 3) {
	int temp = mass[i - 2];
	mass[i - 2] = mass[i];
	mass[i] = temp;
      }
      for(i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
      }
printf("\n::: %c[%d;%dm[Б]%c[%dm :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", 27, 8, 33, 27, 0);
// Задание б)
    printf("\n::: Обработанный массив:");
  int j=0;
      for (i = 0; i < n-1; i++){
	if(mass[i] == mass[i+1]){
	  for(j=i;j<n-2;j++)
	    mass[j]=mass[j+2];
	    n-=2;
	}
	printf(" [%d]", mass[j]);
      }
printf("\n::: %c[%d;%dm[В]%c[%dm :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n", 27, 8, 33, 27, 0);
// Задание в)
    printf("::: Обработанный массив:");
      for(i = 0; i < n; i++){
	printf(" [%d]", mass[i]);
      }    
      printf("\n");
}
...
Рейтинг: 0 / 0
04.05.2016, 04:09
    #39228773
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
JaCoOps,

Код: plaintext
1.
2.
3.
int n;
scanf("%d", &n);
int mass[n];



и этот участок кода у вас компилируется ?
...
Рейтинг: 0 / 0
04.05.2016, 12:53
    #39229042
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
SashaMercuryJaCoOps,

Код: plaintext
1.
2.
3.
int n;
scanf("%d", &n);
int mass[n];



и этот участок кода у вас компилируется ?


теперь можно...
...
Рейтинг: 0 / 0
04.05.2016, 15:50
    #39229225
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
MasterZivтеперь можно...
всего 50 лет с небольшим прошло (Algol, PL/1,....)
...
Рейтинг: 0 / 0
04.05.2016, 16:06
    #39229240
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
MasterZivSashaMercuryJaCoOps,

Код: plaintext
1.
2.
3.
int n;
scanf("%d", &n);
int mass[n];



и этот участок кода у вас компилируется ?


теперь можно...

В последнем стандарте описана такая возможность?
...
Рейтинг: 0 / 0
04.05.2016, 16:08
    #39229243
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
SashaMercuryMasterZivпропущено...



теперь можно...

В последнем стандарте описана такая возможность?С99, вроде
...
Рейтинг: 0 / 0
04.05.2016, 16:11
    #39229248
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
8 лет понадобилось чтобы сделать C-like printf (..) в Java
начиная с JDK 1.0 (23 января 1996) до анонса "Тигра"
J2SE 5.0 (30 сентября 2004).

Мдя... ох уж эти консерваторы.
...
Рейтинг: 0 / 0
04.05.2016, 16:12
    #39229249
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
SashaMercuryMasterZivпропущено...



теперь можно...

В последнем стандарте описана такая возможность?
Вроде как есть в С99
Читай про Variable-length arrays
...
Рейтинг: 0 / 0
04.05.2016, 16:23
    #39229266
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
UsmanSashaMercuryпропущено...


В последнем стандарте описана такая возможность?С99, вроде

И всё-таки, это написано в стандарте или это расширение стандарта? Судя по тому, что я читал ранее в стандарте ISO/IEC 14882:2011 такой возможности не было. В данном случае n должна быть константой. Может быть что-то путаю конечно. Меня поправят. Но вообще, если это было в стандарте 99 года, не факт что это сохранилось в стандарте 11 года.


Если я ошибаюсь тогда, судя по тому, что написано по той ссылке, на стеке выделяется некий сегмент на момент декларации. Наверняка не маленький. А как быть в том случае, если потребуется создать массив размером MAX_VALUE_SIZE_T(здесь псевдомакроимя)? Или выделяется максимально возможный размер сегмента? Чем не угодили указатели? Неужели из-за безопасности?
...
Рейтинг: 0 / 0
04.05.2016, 16:27
    #39229273
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
SashaMercuryА как быть в том случае, если потребуется создать массив размером MAX_VALUE_SIZE_T
а кто сказал, что на стеке?
кто сказал, что стек один и является непрерывной областью памяти?
кто сказал, что у стека имеется аппаратная поддержка?
...
Рейтинг: 0 / 0
04.05.2016, 16:32
    #39229277
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
Изопропила кто сказал, что на стеке?
http://www.cplusplus.com/articles/iz3hAqkS/ Variable-length arrays
The variable-length arrays (or VLA's) are arrays that can be declared by using a variable, instead of a compile-time constant, for their size. They do not have variable length as in being able to resize.

VLA's are infamous because they're allocated on the stack and not the heap. The stack area is used for local variables, and is more limited in size than the heap. If the size of the VLA is too big, a stack overflow will occur, resulting in a crash.
...
Рейтинг: 0 / 0
04.05.2016, 16:37
    #39229284
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
SashaMercuryЕсли я ошибаюсь тогда, судя по тому, что написано по той ссылке, на стеке выделяется некий сегмент на момент декларации. Наверняка не маленький. А как быть в том случае, если потребуется создать массив размером MAX_VALUE_SIZE_T(здесь псевдомакроимя)? Или выделяется максимально возможный размер сегмента? Чем не угодили указатели? Неужели из-за безопасности?
Думаю просто правится вершина стэка.

ИМХУ Сделали для удобства, т.к. часто бывает надо объявить локальный массив, размер которого заранее не известен.

Безопасность тут ни при чем, точнее она даже страдает из-за того что можно случайно переполнение стэка устроить.
...
Рейтинг: 0 / 0
04.05.2016, 16:44
    #39229287
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
SashaMercuryНо вообще, если это было в стандарте 99 года, не факт что это сохранилось в стандарте 11 года.В C11 ее вынесли как необязательную языковую фичу. Для "подключения" использовать макрос __STDC_NO_VLA__

см. https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features
...
Рейтинг: 0 / 0
04.05.2016, 16:49
    #39229291
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
SashaMercuryЕсли я ошибаюсь тогда, судя по тому, что написано по той ссылке, на стеке выделяется некий сегмент на момент декларации. Наверняка не маленький. А как быть в том случае, если потребуется создать массив размером MAX_VALUE_SIZE_T(здесь псевдомакроимя)? Или выделяется максимально возможный размер сегмента?см. https://en.wikipedia.org/wiki/Variable-length_array
см. alloca (еще тынц )
SashaMercuryЧем не угодили указатели? Неужели из-за безопасности? malloc() видать поднадоел (:
...
Рейтинг: 0 / 0
04.05.2016, 16:53
    #39229294
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
Usmanсм. alloca
Интересно что на языке Гавайцев аллоха означает и "привет
и "прощай".... что как-бе говорит нам..
...
Рейтинг: 0 / 0
04.05.2016, 16:56
    #39229298
Гость123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
UsmanВ C11 ее вынесли как необязательную языковую фичу. Для "подключения" использовать макрос __STDC_NO_VLA__


Не для подключения, а для определения поддерживает компилятор или нет.
C11 draft n1570__STDC_NO_VLA_ _ The integer constant 1, intended to indicate that the implementation does not support variable length arrays or variably modified types.
...
Рейтинг: 0 / 0
04.05.2016, 17:00
    #39229302
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
Гость123,

Да, ашыпся (:
Спасибо.

P.S.
Кто Вы? Не узнаю Вас в гримме
...
Рейтинг: 0 / 0
05.05.2016, 00:29
    #39229511
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
SashaMercuryСудя по тому, что я читал ранее в стандарте ISO/IEC 14882:2011 такой возможности не было.так это стандарт С++, а в треде речь о С идёт.
...
Рейтинг: 0 / 0
05.05.2016, 01:59
    #39229529
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
UsmanSSЧем не угодили указатели? Неужели из-за безопасности? malloc() видать поднадоел (:

Свежо придание да верится с трудом. Usman, спасибо вам за ссылки на w, однако доверять им нельзя, это ни в коем случае не достоверный источник

egorych так это стандарт С++, а в треде речь о С идёт.

В ISO/IEC 9899:2011 не встречал такого, сейчас проверю ещё раз
...
Рейтинг: 0 / 0
05.05.2016, 02:11
    #39229531
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
UsmanSashaMercuryНо вообще, если это было в стандарте 99 года, не факт что это сохранилось в стандарте 11 года.В C11 ее вынесли как необязательную языковую фичу. Для "подключения" использовать макрос __STDC_NO_VLA__

см. https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features

Доступ к элементу массиву с использованием оператора [] - 'необязательная языковая фича', а это существенная возможность языка. На мой взгляд, ничего хорошего в такой возможности нет
...
Рейтинг: 0 / 0
05.05.2016, 02:34
    #39229533
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Си/поменять два элемента массива местами
ISO/IEC 9899:2011 If the size is not present, the array type is an incomplete type. If the size is * instead of
being an expression, the array type is a variable length array type of unspecified size,
which can only be used in declarations or type names with function prototype scope;143)
such arrays are nonetheless complete types. If the size is an integer constant expression
and the element type has a known constant size, the array type is not a variable length
array type; otherwise, the array type is a variable length array type. (Variable length
arrays are a conditional feature that implementations need not support; see 6.10.8.3.)


143) Thus, * can be used only in function declarations that are not definitions (see 6.7.6.3).


ISO/IEC 9899:2011, p.132, example
Код: plaintext
1.
void fvla(int m, int C[m][m]); // valid: VLA with prototype scope
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си/поменять два элемента массива местами / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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