1. 程式人生 > >指標習題4(樓主力薦)

指標習題4(樓主力薦)

4,有n個整數,使前面個數順序向後移m個位置,最後m個數變成最前面m個數,見下圖。寫一函式實現以上功能,在主函式中輸入n個整數和輸出調整後的n個整數。
在這裡插入圖片描述

最好自己嘗試一下。。。要用指標實現,,,

本體樓主耗費不少精力,但是當代碼執行成功的那一刻,就一個字 爽
不多比比了
先看看樓主的程式碼

#include<stdio.h>
#include<string.h>
int n;
int main()
{int a[80],i=0,m;
void process (int*a,int m);
 printf("please input integers:\n");
 do
 {scanf("%d",&a[i]);
  i++;
 }while(getchar()!='\n');
 n=i;
 printf("please input m:\n");
 scanf("%d",&m);
 process(a,m);
 printf("the sorted integers:\n");
 for(i=0;i<n;i++)
 {printf("%d ",a[i]);
 }
  return 0;
}
void process(int*a,int m)
{int b[80],i,j,k;
 memcpy(b,a,sizeof(int)*n);
  k=m;
	for(i=n-1;k>0;i--,k--)
	{
	 a[k-1]=b[i];	
	}
	for(i=m,j=0;i<n;i++,j++)
	{
	 a[i]=b[j];
	}	
}

執行結果

在這裡插入圖片描述

看不懂沒關係,且聽本樓主一一道來,
最重要的核心部分是process函式,也就是本題的關鍵,
樓主是將問題分為兩個部分
一,是將原陣列中前n-m個數放到新陣列的後面,
二,將原陣列後面m個數放到新陣列的前面
看看思路還是很清晰的,

這裡引用了個b陣列,b陣列和a陣列的是相等的,
用了個memcpy函式,可以自行百度,也可以看看樓主的上一篇文章,(再自行百度)

 memcpy(b,a,sizeof(int)*n);

注:memcpy函式包含在標頭檔案<string.h>中
樓主實現第一步是下面幾行程式碼

for(i=n-1;k>0;i--,k--)
	{
	 a[k-1]=b[i];	
	}

如果不引入b陣列的話,問題會複雜很多,(樓主開始就是卡在這了。。。現在還不知道答案怎麼寫的,如果沒引用新的陣列,樓主一定要膜拜。。。)
我們接著說。。這裡的k的值和m的值是相等的,但因為m在之後還要再次用到,所以用一個變數存一下m的值。還要注意陣列是從0開始計的。所以是k-1,利用a[k-1]=b[i]; 實際上是從倒著賦值的

實現第二步:

for(i=m,j=0;i<n;i++,j++)
	{
	 a[i]=b[j];
	}	

因為上一步給新陣列的前m項都賦好值了
這步就是從第m+1項開始給新陣列賦值,應該不難理解。。。
p.s.主函式裡輸入任意n個整數,
就是

do
 {scanf("%d",&a[i]);
  i++;
 }while(getchar()!='\n');

樓主在第一篇已經有講過了,看不懂的可以去看一下。
好吧,這篇已經有點長了,下一篇將會把答案的方法放出來,讓我們一起期待吧。。。