编程珠玑真是一本让人感觉到眼前一亮的书,虽然书不厚,但是里面的知识很贴近实际应用,也很有启发性,如果能真正的消化里面的内容,对程序的理解肯定会上一个档次。
本文给出的是第二章习题的第五题的大概程序!
#include<iostream> using namespace std; void move(int * arr, int arrsize,int n);//将数组arr的前n个元素左移 void show(int * arr,int arrsize); void reverse(int * arr, int n, int m); void move_re(int * arr, int arrsize, int n); void move_re_twodif(int * arr, int arrsize, int n, int m);//把数组的前n个元素和后m个元素交换位置 int main() { int arr[] = { 20, 15, 26, 302, 150, 264, 154, 284 }; show(arr, 8); cout << endl; move_re(arr,8, 6); show(arr,8); move_re_twodif(arr, 8, 5, 3); show(arr, 8); return 0; } void move(int * arr,int arrsize, int n) { int i = 0; int k = n%arrsize; for (; i <k; ++i) { int temp = arr[i]; int m = i+k; while ( m < arrsize) { arr[m-k] = arr[m]; m+= k; } //if (m>=arrsize) arr[m-k] = arr[m%arrsize]; show(arr, arrsize); } } void show(int * arr,int arrsize) { int n = 0; while (n<arrsize) { cout << *(arr+n) << "\t"; ++n; } cout<<endl; } void reverse(int * arr, int n, int m) { if (n >= m)return; int i = n; int j = m; for (; i < j;) { int temp = arr[i]; arr[i++] = arr[j]; arr[j--] = temp; } } void move_re(int * arr, int arrsize, int n) { int k = n%arrsize; reverse(arr, 0, k - 1); reverse(arr, k, arrsize - 1); reverse(arr, 0, arrsize - 1); } void move_re_twodif(int * arr, int arrsize, int n, int m)//把数组的前n个元素和后m个元素交换位置 { if ((arrsize - m) < n)return;//如果后半段数据和前半段数据重叠就停止交换 reverse(arr, 0, n - 1); reverse(arr, n, arrsize-m-1); reverse(arr, arrsize - m, arrsize - 1); reverse(arr, 0, arrsize - 1); }
如有转载请说明出处!
时间: 2024-12-17 13:25:36