下面部分地方使用指針,也有地方不使用指針。
(或許這裡我都應該使用指針來讓大家理解一下,但是一些時候指針不是必需品,當然,如果你要向硬件方面發展,那還是得學習指針的)
要學習指針可以看一下這裡:(其他資料請自行檢索)
一直流浪:C語言重點——指針篇(一篇讓你完全搞懂指針)4693 贊同 · 205 評論文章
題目66
題目:輸入3個數a,b,c,按大小順序輸出。
程序分析:用指針實現
#include<cstdio>
void sswap(int *p1,int *p2)
{
//*有取值的作用
int p = *p1;
*p1 = *p2;
*p2 = p;
}
int main()
{
int x,y,z;
int *p1,*p2,*p3;
scanf("%d%d%d",&x,&y,&z);
p1 = &x;// 指針指向地址
p2 = &y;
p3 = &z;
//不運行看看這裡是按什麼順序輸出
if(x > y) sswap(p1,p2);
if(x > z) sswap(p1,p3);
if(y > z) sswap(p2,p3);
printf("%d %d %d",x,y,z);
}
題目:輸入數組,最大的與第一個元素交換,最小的與最後一個元素交換,輸出數組。
這裡給出兩種實現方式,指針和非指針:
非指針方式:
#include<cstdio>
#define R register
// 本人不太喜歡使用指針,指針部分代碼後給出。
int a[11];
// 不加&還有什麼解決辦法?
// 這裡函數的作用是尋找數組中最大、最小的兩個數的位置
void max_min_num_pos(int &pos_max,int &pos_min)
//可以想想要是想傳入數組a怎麼辦
{
//這個函數達成的目的是返回最大數的位置與最小數的位置
//這裡默認知道數組長度
//其實在OI中一般是已知的(
int maxx = -1;//找最大的要設置小的,為什麼?
int minn = 2147483641;//對應
for(R int i = 1;i <= 10;i )
{
if(a[i] > maxx)
maxx = a[i],pos_max = i;
if(a[i] < minn)
minn = a[i],pos_min = i;
}
}
void sswap(int &x,int &y)
{
int t = x;
x = y;
y = t;
}
int main()
{
for(R int i = 1;i <= 10;i )
scanf("%d",&a[i]);
int pos_max, pos_min;
max_min_num_pos(pos_max,pos_min);
// printf("%d %d",pos_max,pos_min);
sswap(a[1],a[pos_max]);
sswap(a[10],a[pos_min]);
for(R int i = 1;i <= 10;i )
printf("%d ",a[i]);
}
// in:20 4 3 9 1 33 2 6 0 3
// out:
指針方式
#include<cstdio>
#define R register
//這裡代碼不打算過分解釋,應該都能看懂
// 不理解的地方大家可以查閱一下資料,深入探讨一下
int num[11];
void input(int *a)
{
for(R int i = 1;i <= 10;i )
scanf("%d",&a[i]);
}
void max_min(int *a)
{
int *max,*min;
int *p,*a_end;
a_end = a 10;//為啥加10?
max = min = a 2;
for(p = a 2; p <= a_end;p )
{
if(*p > *max) max = p;
if(*p < *min) min = p;
}
// 這裡的p有什麼作用,與上面一樣嗎
*p = a[1]; a[1] = *max; *max = *p;
*p = a[10];a[10] = *min; *min = *p;
}
void print(int *a)
{
int *p;
for(p = a 1 ; p <= a 10;p )
printf("%d ",*p);
// a 1等價于 a[1]嗎?
//自己動手試一試,這裡不是很難看出來
}
//in:20 4 3 9 1 33 2 6 0 3
int main()
{
// 三個函數的形式會讓主函數顯得很簡潔
input(num);
max_min(num);
print(num);
}
題目:有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面的m個數
#include<cstdio>
#define R register
// 看看是否能自己看懂
int n,m;//n代表數組長度,m代表位置(
int a[15];
void do_work(int *a,int len,int mm)
{
int idx = len - mm;
for(R int i = 1;i <= mm;i )
{
int *p = a idx i;
int tmp = *p;
for(R int j = idx i; j > i ;j--)
{
*p = *(p-1);
p--;
}
*(a i) = tmp;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(R int i = 1;i <= n;i )
scanf("%d",&a[i]);
do_work(a,n,m);
for(R int i = 1;i <= n;i )
printf("%d ",a[i]);
}
題目:有n個人圍成一圈,順序排号。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾号的那位。
#include<cstdio>
int n,left,pos = 0,num,m;
int in[111];
// 這裡實際上是約瑟夫環問題,直接拿來用了
/*
n 個人圍成一圈,從第一個人開始報數,數到 m 的人出列,
再由下一個人重新從 1 開始報數,數到 m 的人再出圈,
依次類推,直到所有的人都出圈,請輸出依次出圈人的編号。*/
int main()
{
scanf("%d%d",&n,&m);
// n個人報數,報到m的出圈
left = n;//留在裡面的最開始有n個
//在圈裡是 0,不在圈裡是1
while(1)
{
pos = pos % n 1; //環
while(in[pos]) pos = pos % n 1;
num ;
if(num % m == 0)
{
in[pos] = 1,left--;//出圈
printf("%d ",pos);
}
if(left == 1)break;
}
for(int i = 1;i <= n;i )
if(!in[i]){
printf("%d",i);
break;
}
}
// 其實可以數學推導出最後一個出圈的人是序号幾,可查一下資料
// 有時間可能補充一下推導
題目:寫一個函數,求一個字符串的長度,在main函數中輸入字符串,并輸出其長度。
#include<cstdio>
#include<cstring>
#define R register
// 其實有現成的計算字符串長度的函數strlen(),調用cstring
char s[20];
int len(char *s)
{
int cnt = 0;
for(R int i = 0;;i )
{
if(s[i] == '\0')break;
cnt ;
}
return cnt;
}
int main()
{
scanf("%s",s);//用%s輸入,注意這樣子的寫法從s[0]存儲
printf("%d\n",len(s));
// printf("%d\n",strlen(s));
}
其實上面swap也有現成的函數,可以調用iostream庫來使用
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!