C程序设计 (第四版) 谭浩强 习题8.4
习题 8.4 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法1:
#include <stdio.h>
#include <stdlib.h>
void sort(int *s, int n, int x); //定义排序函数
int main(){
int n[10], *p, m;
for(p = n, printf("Please enter 10 numbers: "); p< n + 10; scanf("%d", p++)); //输入10个整数
printf("Please enter move number: "); //输入要移动的个数
scanf("%d", &m);
sort(n, 10, m); //调用排序函数
for(p = n, printf("Sort by: "); p < n + 10; printf("%d ", *p++)); //输出排序后的10个整数
printf("\n");
system("pause");
return 0;
}
//排序函数
void sort(int *s, int n, int x){
int *i, j, *k, t[10];
for(i = s + n - x, j = 0; i < s + n; t[j++] = *i++);
for(i = s + n - x - 1, k = s + n - 1; k >= s + x; *k-- = *i--);
for(j = 0; j < x; *s++ = t[j++]);
}
方法2:使用指针,动态分配内存
#include <stdio.h>
#include <stdlib.h>
#define N 10
void initialNum(int **num, int n, int **moveNum){
*num = (int*)malloc(n * sizeof(int));
*moveNum = (int*)malloc(sizeof(int));
}
void inputNum(int *num, int n){
printf("Enter %d numbers: ", n);
for(int i = 0; i < n; i++){
scanf("%d", &num[i]);
}
}
void inputMoveNum(int *moveNum, int n){
printf("\nEnter Move number: ");
scanf("%d", moveNum);
while(*moveNum < 0 || *moveNum > n){
printf("Move number Error! Retry!\nEnter Move number: ");
scanf("%d", moveNum);
}
}
void move(int *num, int n, int *moveNum){
int *temp = (int*)malloc(*moveNum * sizeof(int));
for(int i = 0, j = n - (*moveNum); i < *moveNum; i++, j++){
temp[i] = num[j];
}
for(int i = n - 1, j = n - (*moveNum) - 1; j >= 0; i--, j--){
num[i] = num[j];
}
for(int i = 0; i < *moveNum; i++){
num[i] = temp[i];
}
}
void freeNum(int **num, int **moveNum){
free(*num);
free(*moveNum);
}
void outputNum(int *num, int n){
printf("New sort: ");
for(int i = 0; i < n; i++){
printf("%d ", num[i]);
}
printf("\n");
}
int main(){
int *num = NULL;
int *moveNum = NULL;
initialNum(&num, N, &moveNum);
inputNum(num, N);
inputMoveNum(moveNum, N);
move(num, N, moveNum);
outputNum(num, N);
freeNum(&num, &moveNum);
system("pause");
return 0;
}