指针基础练习

1.冒泡排序

#include<stdio.h>
#define MAXN 10
void swap(int* px, int* py) {
	int t;
	t = *px;
	*px = *py;
	*py = t;
}

void bubble(int a[], int n) /*n是数组a中待排序的元素的数量*/
{
	int i, j;
	for (i = 1; i < n; i++) {
		for (j = 0; j < n - i; j++) {
			if (a[j] > a[j + 1]) {
				swap(&a[j], &a[j + 1]);/*要通过函数调用来改变主调函数中某个变量的值,可以把指 针作为函数的参数。在主调函数中,将该变量的地址或者指向该变量的指针作为实参。在被调函数中,用指针类型形参接收该变量的地址,并改变形参所指向的变量的值。*/
			}
		}
	}
}

int main() {

	int i, n,a[MAXN];

	printf("enter n:");
	scanf("%d", &n);
	printf("enter %d numbers:",n);
	for (i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	bubble(a, n);/*声明的函数里的形参是数组,则在调用该函数是,传入的参数就填数组名*/
	printf("after sorted:");
	for (i = 0; i < n; i++) {
		printf("%d", a[i]);
	}
	return 0;
}

2.选择排序

#include<stdio.h>

void swap(int* px, int* py) {
	int t;
	t = *px;
	*px = *py;
	*py = t;
}

void select(int a[],int n) {
	int i, j, min;
	for (i = 0; i < n-1; i++) {
		min = i;
		for (j = i+1; j < n; j++) {
			if (a[j] < a[min]) {
				min = j;
			}
		}
		swap(&a[i], &a[min]);
	}
}

int main() {

	int n,i;
	int a[10];

	printf("enter n:");
	scanf("%d", &n);
	printf("enter numbers:");
	for (i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}

	select(a, n);
	printf("after sorted:");
	for (i = 0; i < n; i++) {
		printf("%d", a[i]);
	}

	return 0;
}

3.二分查找法 。设已有一个n(1<=n<=10)个元素的整型数组a,且按值从小到大有序排列。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则输出“not found”。

#include<stdio.h>

int half_found(int *s,int t,int n) {
	int mid, low, high;
	low = 0;
	high = n - 1;
	while (low <= high) { /*当low>high时,退出循环*/
		mid = (low + high);
		if (t == s[mid]) {
			return mid;
		}
		else if (t < s[mid]) {
			high = mid - 1;
		}
		else {
			low = mid + 1;
		}
	}
	if (low > high) {
		return 0;
	}
}

int main() {

	int s[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int t;

	printf("enter t:");
	scanf("%d", &t);

	if (half_found(s, t, 10) == 0) {
		printf("not found");
	}
	else {
		printf("%d", half_found(s, t, 10));/*用printf()输出函数的实参实现函数调用*/
	}


	return 0;
}

运行结果:

找到

未找到

易错提示:

对于实现计算功能的函数,函数调用通常有两种情况(以radius(int r,int h)为例):

(1)赋值语句

volume=cylinder(radius,height);

(2)输出函数的实参

printf("%f",cylinder(radius,height));

r和h是形参,主调函数的参数radius,height是实参。

4.计算两个数的和与差

#include<stdio.h>

void sum_diff(double op1, double op2, double* psum, double* pdiff) {
	*psum = op1 + op2;
	*pdiff = op1 - op2;
}

int main() {
	double n1, n2;
	double sum, diff;
	printf("enter 2 numbers:");
	scanf("%lf%lf", &n1, &n2);
	sum_diff(n1, n2, &sum, &diff);
	printf("the summery is:%lf, the difference is:%lf", sum,diff);
	return 0;
}

错误注意:

5.使用函数实现字符串复制:输入一个字符串t和一个正整数m,将字符串t中从第m个字符开始的全部字符复制到字符串s中,再输出字符串s。要求自定义并调用函数void strmcpy(char *s, char *t, int m)

#include<stdio.h>

void strmcpy(char* s, char* t, int m) {
	int i;
	for (i = 0; t[m + i] != '\0'; i++) {
		s[i] = t[m + i];
	}
	s[i] = '\0';
}

int main() {

	char t[100], s[100];
	int m;

	printf("enter t:\n");
	scanf("%s", t);/*格式控制字符串中使用格式控制说明%s,输入参数必须是字符型数组名。该函数遇回车或空格输入结束,并自动将输入的数据和字符串结束符'\0'送入数组中*/
	printf("enter m:\n");
	scanf("%d", &m);

	strmcpy(s, t, m - 1);
	printf("%s", s);/*格式控制字符串中相应的格式控制说明用%s,输出参数可以是字符数组名或字符串常量。输出遇'\0'结束。*/


	return 0;
}

易错提示:

(1)格式控制字符串中使用格式控制说明%s,输入参数必须是字符型数组名。该函数遇回车或空格输入结束,并自动将输入的数据和字符串结束符'\0'送入数组中;

(2)格式控制字符串中相】应的格式控制说明用%s,输出参数可以是字符数组名或字符串常量。输出遇'\0'结束。

6.删除字符:输入一个字符串,再输入一个字符ch,将字符串中所有的ch字符删除后输出该字符。要求定义和调用函数delchar(s,c),该函数将字符串s中出现的所有c字符删除,试编写相应程序。

#include<stdio.h>

void delchar(char* s, char c) {
	int i, j = 0;
	for (i = 0; s[i] != '\0'; i++) {
		if (s[i] != c) {
			s[j] = s[i];
			j++;
		}
	}
	s[j] = '\0';
}

int main() {

	char s[10];
	char c;

	printf("enter s:");
	scanf("%s", s);
	printf("enter c:");
	getchar();/*当需要连续使用scanf()函数进行输入操作时,特别是当输入的数据类型不同(如整数和字符)时,可能需要在两个scanf()之间插入getchar()函数,以确保正确地清空输入缓冲区,从而避免潜在的问题。*/
	scanf("%c", &c);

	delchar(s, c);

	printf("after deleted:%s",s);

	return 0;
}

 运行结果:

易错提示:

当需要连续使用scanf()函数进行输入操作时,特别是当输入的数据类型不同(如整数和字符)时,可能需要在两个scanf()之间插入getchar()函数,以确保正确地清空输入缓冲区,从而避免潜在的问题。

7.判断回文:判断输入的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。

#include<stdio.h>
#include<string.h>

int is_palindrome(char* s) {
	int i,len;
	len = strlen(s);/*strlen(s)中的参数s可以是字符数组名或字符串常量。函数strlen()返回字符串s的'\0'之前的字符个数。即字符串有效字符的个数(不包括结束符'\0')*/
	for (i = 0; i < len / 2; i++) {
		if (s[i] != s[len - 1 - i]) {
			return 0;
		}
	}
	return 1;
}

int main() {
	char s[100];
	printf("enter a string:");
	scanf("%s", s);
	if (is_palindrome(s) == 1) {
		printf("yes");
	}
	else {
		printf("no");
	}

	return 0;
}

易错提示:

strlen(s)中的参数s可以是字符数组名或字符串常量。函数strlen()返回字符串s的'\0'之前的字符个数。即字符串有效字符串的个数(不包括结束符'\0')。

8.分类统计字符个数:输入一行文字,统计其中的大写字母、小写字母、空格、数字以及其他字符各有多少。

#include<stdio.h>
#include<ctype.h>

void count_char(char *s) {

	int i,upper=0,lower=0,space=0,digit=0,others=0;

	for (i = 0; s[i] != '\0'; i++) {
		if (isupper(s[i])) {
			upper++;
		}
		else if (islower(s[i])) {
			lower++;
		}
		else if (isspace(s[i])) {
			space++;
		}
		else if (isdigit(s[i])) {
			digit++;
		}
		else {
			others++;
		}
	}
	printf("big letter:%d\n", upper);
	printf("small letter:%d\n", lower);
	printf("blank space:%d\n", space);
	printf("digital number:%d\n", digit);
	printf("other characters:%d\n", others);
}

int main() {

	char s[30];
	printf("enter a string:");
	fgets(s,sizeof(s),stdin);
	count_char(s);

	return 0;
}

9.循环后移:有n个整数,使前面各数顺序向后移m个位置,移出的数再从开头移入。编写一个函数实现以上功能,在主函数中输入n个整数并输出调整后的n个数。

#include<stdio.h>
#define MAXN 10

void move_elements(int a[], int n, int m) {
	int temp, i, j;
	for (i = 0; i < m; i++) {
		temp = a[n - 1];
		for (j = n - 1; j > 0; j--){
			a[j] = a[j - 1];
		}
		a[0] = temp;
	}
}

int main() {

	int a[MAXN];
	int m, n, i;

	printf("enter m,n:");
	scanf("%d %d", &m, &n);

	printf("enter numbers:");
	for (i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}

	move_elements(a, n, m);

	printf("after move:");
	for (i = 0; i < n; i++) {
		printf("%d", a[i]);
	}
	
	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值