ページ 11

配列の入れ替え方

Posted: 2015年11月28日(土) 20:45
by momon
配列に格納されている隣同士の値を入れ替えるプログラムを作りたいのですが、入れ替え方が全く見当が付きません。
例えば、
入れ替え前
1 2 3 4 5 6
入れ替え後
2 1 4 3 6 5

お手伝いをお願いします。

コード:

#include<stdio.h>
#define A 6

void irekae(int x, int *y);

int main(void)
{
	int d[A] = {1,2,3,4,5,6 };
	int i, j;

	for (i = 0; i < A; i++){
		printf("%2d", d[i]);
	}

	irekae(int j, int *d);


	return 0;
}

void irekae(int x, int *y)
{



}

Re: 配列の入れ替え方

Posted: 2015年11月28日(土) 20:54
by みけCAT
素直に2個ずつ入れ替えればいいでしょう。

コード:

#include<stdio.h>
#define A 6

void irekae(int x, int *y);

int main(void)
{
	int d[A] = {1,2,3,4,5,6 };
	int i;

	for (i = 0; i < A; i++){
		printf("%2d", d[i]);
	}
	putchar('\n');

	irekae(A, d);

	for (i = 0; i < A; i++){
		printf("%2d", d[i]);
	}
	putchar('\n');

	return 0;
}

void irekae(int x, int *y)
{
	int i;
	for(i = 1; i < x; i += 2){
		int tmp;
		tmp = y[i - 1];
		y[i - 1] = y[i];
		y[i] = tmp;
	}
}

Re: 配列の入れ替え方

Posted: 2015年11月28日(土) 23:07
by box
C以外で書くと、意外と簡単に書けたりする。

コード:

def print(a)
  a.size.times do |i|
    printf("%d%s", a[i], i == a.size - 1 ? "\n" : " ")
  end
end

def irekae(a)
  0.step(a.size - 2, 2) do |i|
    a[i], a[i + 1] = a[i + 1], a[i]
  end
end

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
puts "before"
print(a)

irekae(a)

puts "after"
print(a)

Re: 配列の入れ替え方

Posted: 2015年11月29日(日) 06:08
by かずま
参考にはならない謎のプログラム

コード:

void irekae(int x, int *y)
{
    int z = *y;
    x && (x&1 && (y[-1] = z), irekae(x-1, y+1), x&1 || (y[1] = z));
}

Re: 配列の入れ替え方

Posted: 2015年11月29日(日) 16:57
by ISLe
別の方面から攻めてみました

コード:

void irekae(int x, int *y)
{
	int i;
	for(i = 1; i < x; i += 2) {
		y[i-1] ^= y[i] ^= y[i-1] ^= y[i];
	}
}

Re: 配列の入れ替え方

Posted: 2015年11月30日(月) 17:38
by みけCAT
ISLe さんが書きました:別の方面から攻めてみました

コード:

void irekae(int x, int *y)
{
	int i;
	for(i = 1; i < x; i += 2) {
		y[i-1] ^= y[i] ^= y[i-1] ^= y[i];
	}
}
これはsequence pointの間でy[i-1]が複数回書き換えられているのでundefined behaviorであり、Wandboxで正常に動作しませんでした。
http://melpon.org/wandbox/permlink/XPGN64Gk9hbKCxyT

以下、N1256より引用
4. Conformance さんが書きました: 2 If a ‘‘shall’’ or ‘‘shall not’’ requirement that appears outside of a constraint is violated, the
behavior is undefined.
6.5 Expressions さんが書きました: 2 Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.

Re: 配列の入れ替え方

Posted: 2015年11月30日(月) 18:16
by ISLe
みけCAT さんが書きました:
ISLe さんが書きました:別の方面から攻めてみました

コード:

void irekae(int x, int *y)
{
	int i;
	for(i = 1; i < x; i += 2) {
		y[i-1] ^= y[i] ^= y[i-1] ^= y[i];
	}
}
これはsequence pointの間でy[i-1]が複数回書き換えられているのでundefined behaviorであり、Wandboxで正常に動作しませんでした。
http://melpon.org/wandbox/permlink/XPGN64Gk9hbKCxyT

以下、N1256より引用
4. Conformance さんが書きました: 2 If a ‘‘shall’’ or ‘‘shall not’’ requirement that appears outside of a constraint is violated, the
behavior is undefined.
6.5 Expressions さんが書きました: 2 Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.
申し訳ない。

コード:

void irekae(int x, int *y)
{
	int i;
	for(i = 1; i < x; i += 2) {
		y[i-1] ^= y[i];
		y[i] ^= y[i-1];
		y[i-1] ^= y[i];
	}
}
と訂正します。

Re: 配列の入れ替え方

Posted: 2015年12月01日(火) 20:43
by ZORO

コード:

#include<stdio.h>
#define SIZE 6
 
void irekae(int s[], int max);
 
int main(void)
{
    int array[SIZE] = {1, 2, 3, 4, 5, 6};
    int i;
 	
	printf("Array before arranged:");
    for(i = 0; i < SIZE; i++) 
		printf("%2d", array[i]);
	putchar('\n');
	irekae(array,SIZE);
	printf("Array after arranged: ");
    for(i = 0; i < SIZE; i++) 
		printf("%2d", array[i]);
	 putchar('\n');
    return 0;
}
 
void irekae(int s[], int max) {
	void swap(int *a, int *b);	
	int i;
	
	for(i = 0; i < max; i += 2)
		swap(&s[i], &s[i+1]);
}

void swap(int *a, int *b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
参考になればいいなと思います。