C语言练习(3) | 初学者经典练习汇总

目录

1、喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水

2、实现一个函数来调整该数组中数字的顺怀

3、在屏幕上打印杨辉三角

4、根据供词猜凶手

5、5位运动员参加了10米台跳水比赛预测比赛结果

6、实现一个计算器,加减乘除

7、写一个冒泡排序

8、写一个通用方式的冒泡排序

9、给一个结构体排序

10、杨氏矩阵查找一个数

11、实现一个函数,可以左旋字符串中的k个字符。

12、字符串旋转结果

13、模拟实现strlen库函数

14、模拟实现strcat库函数

15、模拟实现strcmp库函数

16、模拟实现strstr函数(*)

17、写代码实现输入任意的字符

18、模拟实现memcpy函数

19、模拟实现memmove函数


1、喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水

要求:给20元,可以多少汽水 (编程实现)

int main()
{
	int money = 0;
	scanf("%d",&money);

	int total = money;
	int empty = money;
	while(empty >= 2)
	{
		total += empty/2;
		empty = empty/2 + empty%2;
	}
	printf("%d\n",total);
	return 0;
}

2、实现一个函数来调整该数组中数字的顺怀

要求:使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

void move(int arr[],int sz)
{
	int left = 0;
	int right = sz-1;
	while(left<right)
	{
		//从前找一个偶数
		while((left<right)&&(arr[left]%2 == 1))
		{
			left++;
		}

		//从后找一个奇数
		while((left<right)&&(arr[right]%2 == 0))
		{
			right--;
		}
		if(left<right)
		{
			int tmp = 0;
			tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int sz = sizeof(arr) / sizeof(arr[0]);
	move(arr,sz);
	int i = 0;
	for(i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}

	return 0;
}

3、在屏幕上打印杨辉三角

 代码:

int main()
{
	int arr[10][10] = {0};
	int i = 0;
	int j = 0;
	for(i=0;i<10;i++)
	{
		for(j=0;j<=i;j++)
		{
			if(j == 0)
			{
				arr[i][j]=1;
			}
			if(i == j)
			{
				arr[i][j]=1;
			}
			if(i>=2&&j>=1)
			{
				arr[i][j] = arr[i-1][j-1]+arr[i-1][j];
			}
		}
	}
	for(int i =0;i<=10;i++)
	{
		for(int j =0;j<i;j++)
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

4、根据供词猜凶手

题目内容:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个
以下为4个嫌疑犯的供词:

  • A说:不是我。
  • B说:是C。
  • C说:是D
  • D说:C在胡说

已知3个人说了真话,1个人说的是假活

int main()
{
	char killer = 0;
	for(killer = 'A';killer <= 'D';killer++)
	{
	if((killer != 'A')+(killer == 'C')+(killer == 'D')+(killer != 'D') == 3)
	{
		printf("killer=%c\n",killer);
	}
	}

	return 0;
}

5、5位运动员参加了10米台跳水比赛预测比赛结果

  • A选手说: B第二,我第三;
  • B选手说: 我第二,E第四;
  • C选手说: 我第一,D第二;
  • D选手说: C最后,我第三;
  • E选手说: 我第四,A第一;

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次

int main()
{
	int a,b,c,d,e = 0;
	for(a=1;a<=5;a++)
	{
		for(b=1;b<=5;b++)
		{
			for(c=1;c<=5;c++)
			{
				for(d=1;d<=5;d++)
				{
					for(e=1;e<=5;e++)
					{
						if((((b==2)+(a==3))==1)
							&&((b==2)+(e==4)==1)
							&&((c==1)+(d==2)==1)
							&&((c==5)+(d==3)==1)
							&&((e==4)+(a==1)==1)
							)
						{
							if(a*b*c*d*e == 120)
							{
								printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
							}
						}
					}
				}
			}
		}
	}

	return 0;
}

6、实现一个计算器,加减乘除

要求:用两种方法,不用函数指针数组和用函数指针数组

不用函数指针数组:

int Add(int x,int y)
{
	return x + y;
}
int Sub(int x,int y)
{
	return x - y;
}
int Mul(int x,int y)
{
	return x * y;
}
int Div(int x,int y)
{
	return x / y;
}
void menu()
{
	printf("****************************\n");
	printf("**  1.Add   ***  2.Sub  ****\n");
	printf("**  3.Mul   ***  4.Div  ****\n");
	printf("********   0.exit  *********\n");
	printf("****************************\n");
}
int main()
{
	int input = 0;
	do
	{
		int a = 0;
		int b = 0;
		menu();
		printf("请输入:>");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
			printf("请输入两个数:>\n");
			scanf("%d %d",&a,&b);
			printf("%d\n",Add(a,b));
			break;
		case 2:
			printf("请输入两个数:>\n");
			scanf("%d %d",&a,&b);
			printf("%d\n",Sub(a,b));
			break;
		case 3:
			printf("请输入两个数:>\n");
			scanf("%d %d",&a,&b);
			printf("%d\n",Mul(a,b));
			break;
		case 4:
			printf("请输入两个数:>\n");
			scanf("%d %d",&a,&b);
			printf("%d\n",Div(a,b));
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("输入错误,请重新输入:>\n");
			break;
		}
	}while(input);

	return 0;
}

用函数指针数组

int Add(int x,int y)
{
	return x + y;
}
int Sub(int x,int y)
{
	return x - y;
}
int Mul(int x,int y)
{
	return x * y;
}
int Div(int x,int y)
{
	return x / y;
}
void menu()
{
	printf("****************************\n");
	printf("**  1.Add   ***  2.Sub  ****\n");
	printf("**  3.Mul   ***  4.Div  ****\n");
	printf("********   0.exit  *********\n");
	printf("****************************\n");
}
int main()
{
	int input = 0;
	do
	{
		int (*pfarr[5])(int,int) = {NULL,Add,Sub,Mul,Div};
		int a = 0;
		int b = 0;
		menu();
		printf("请输入:>");\
		scanf("%d",&input);
		if(input >=1 && input <= 4)
		{
			printf("请输入两个数:>\n");
			scanf("%d %d",&a,&b);
			printf("%d\n",(pfarr[input])(a,b));
		}
		else if(input ==0)
		{
			printf("退出程序\n");
			break;
		}
		else
		{
			printf("输入错误,请重新输入:>\n");
		}
		
	}while(input);

	return 0;
}

7、写一个冒泡排序

void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for(i=0; i<sz-1; i++)
	{
		int j = 0;
		for(j=0; j<sz-1-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
	}
}
void print(int arr[],int sz)
{
	int i = 0;
	for(i=0;i<sz-1;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = {0,1,2,3,4,5,6,7,8,9};
	int sz =sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);
	print(arr,sz);

	return 0;
}

8、写一个通用方式的冒泡排序

void print(int arr[],int sz)
{
	int i = 0;
	for(i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
void Swap(char* buf1,char* buf2,int wideth)
{
	int i = 0;
	for(i=0; i<wideth; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}   
}
void bubble_sort(void* base,
				int sz,
				int wideth,
				int (*cmp)(const void* e1,const void* e2)
				)
{
	int i = 0;
	for(i=0; i<sz-1;i++)        //趟数
	{
		int j = 0;
		for(j=0; j<sz-1-i; j++) //一趟的排序
		{
			if(cmp((char*)base+j*wideth,(char*)base+(j+1)*wideth)>0)         //比较两个元素的
			{
				Swap((char*)base+j*wideth,(char*)base+(j+1)*wideth,wideth);
			}
		}
	}
}
int cmp_int(const void* e1,const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[] = {0,1,9,3,4,5,6,2,8,7};
	int sz =sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
	print(arr,sz);

	return 0;
}

9、给一个结构体排序

要求:用到qsort函数:
void qsort(void* base,size_t num,size_t size,int(*cmp)(const void* e1,const void* e2))

#include<stdlib.h>
#include<string.h>
struct Stu
{
	char name[20];
	int age;
};
int sort_by_name(const void* e1,const void* e2)
{
	return strcmp(((struct Stu*)e1)->age,((struct Stu*)e2)->age);
}
void test()
{
	struct Stu s[3] = {
   
   {"zhangsan",30},{"lise",23},{"wangwu",33}};
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s,sz,sizeof(s[0]),sort_by_name);
}
int main()
{
	test();

	return 0;
}

10、杨氏矩阵查找一个数

要求:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

int find_num(int arr[3][3],int r,int c,int k)
{
	int x = 0;
	int y = c-1;
	while(x<r && y>=0)
	{
		if(arr[x][y]<k)
		{
			x++;
		}
		else if(arr[x][y]>k)
		{
			y--;
		}
		else
		{
			printf("在第%d行,第%d列\n",x+1,y+1);
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = {1,2,3,4,5,6,7,8,9};
	int k = 7;
	int ret = find_num(arr,3,3,k);
	if(ret == 1)
	{
		printf("找到了\n");
	}
	else
	{
		printf("找不到\n");
	}
	return 0;	
}

 在函数里不打印,怎么返回来行和列的值

int find_num(int arr[3][3],int* r,int* c,int k)
{
	int x = 0;
	int y = *c-1;
	while(x<*r && y>=0)
	{
		if(arr[x][y]<k)
		{
			x++;
		}
		else if(arr[x][y]>k)
		{
			y--;
		}
		else
		{
			*r = x;
			*c = y;
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = {1,2,3,4,5,6,7,8,9};
	int k = 7;
	int x = 3;
	int y = 3;
	int ret = find_num(arr,&x,&y,k);
	if(ret == 1)
	{
		printf("找到了,下标为:%d %d\n",x,y);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;	
}

11、实现一个函数,可以左旋字符串中的k个字符。

例如:ABCD左旋一个字符得到BCDA
        ABCD左旋两个字符得到CDAB

#include<string.h>
void left_move(char* str,int k)
{
	int len = strlen(str);
	int i = 0;
	for(i=0; i<k; i++)
	{
		char tmp = *str;
		int j = 0;
		for(j=0; j<len-1; j++)
		{
			*(str+j) = *(str+j+1);
		}
		*(str+len-1) = tmp;
	}
}
int main()
{
	char arr[10] = "abcdef";
	int k = 2;
	left_move(arr,k);
	printf("%s\n",arr);
	return 0;
}

利用散布翻转法

#include<string.h>
void reverse(char *start,char* end)
{
	while(start<end)
	{
		char tmp = *start;
		*start = *end;
		*end = tmp;
		start++;
		end--;
	}
	
}
void left_move(char* str,int k)
{
	int len = strlen(str);
	reverse(str,str+k-1);
	reverse(str+k,str+len-1);
	reverse(str,str+len-1);
}
int main()
{
	char arr[10] = "abcdef";
	int k = 2;
	left_move(arr,k);
	printf("%s\n",arr);
	return 0;
}

12、字符串旋转结果

题目内容:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串
例如:
给定s1 = PABCD和s2 = BCDAA,返回1
给定s1 = abcd和s2 = ACBD,返回0.

#include<string.h>
int is_left_move(char arr1[],char arr2[])
{
	int n = strlen(arr1);
	int  i = 0;
	for(i=0; i<n-1; i++)
	{
		int tmp = *arr1;               //每次左旋转一个字符
		int j = 0; 
		for(j=0; j<n-1; j++)           //后面的n-1一个字符往前挪
		{
			*(arr1+j) = *(arr1+j+1);
		}
		*(arr1+n-1) = tmp;             //tmp放在最后面
		if(strcmp(arr1,arr2) == 0)
		{
			return 1;
		}
	}
	return 0;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1,arr2);
	if(ret == 1)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

方法二(用strncat和strstr库函数)

#include<string.h>
int is_left_move(char* str1,char* str2)
{
	if(strlen(str1) != strlen(str2))  //长度不相等,肯定不是旋转得来的
	{
		return 0;
	}
	int len = strlen(str1);
	strncat(str1,str2,len);           //str1字符串的后面追加一个str1
	char* ret = strstr(str1,str2);    //判断str2是否为str1的字符串
	return ret != NULL;
}
int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1,arr2);
	if(ret == 1)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

13、模拟实现strlen库函数

#include<assert.h>
int my_strlen(const char* str)
{
	assert(str != NULL);
	int count = 0;
	while(*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "abc";
	printf("%d\n",my_strlen(arr));

	return 0;
}

14、模拟实现strcat库函数

#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while(*dest)                  //找到目标字符串的\0
	{
		dest++;
	}
	while(*dest++ = *src++)       //追加字符串,包括\0
	{
		;
	}
	return ret;					  //返回目标空间的起始位置
}
int main()
{
	char arr[20] = "bit ";
	char arr1[] = "hello";
	printf("%s\n",my_strcat(arr,arr1));

	return 0;
}

15、模拟实现strcmp库函数

int my_strcmp(char* s1,char* s2)
{
	while(*s1 == *s2)
	{
		if(*s1 == '\0')
		{
			return 0;
		}
		s1++;
		s2++;
	}
	if(*s1>*s2)
	{
		return 1;
	}
	else
	{
		return -1;
	}
}
int main()
{
	char* p = "abcd";
	char* q = "abca";
	int ret = my_strcmp(p,q);
	if(ret > 0)
	{
		printf("p>q\n");
	}
	else if(ret < 0)
	{
		printf("p<q\n");
	}
	else
	{
		printf("p=q\n");
	}

	return 0;
}

16、模拟实现strstr函数(*)

#include<assert.h>
char* my_strstr(const char* str1,const char* str2)
{
	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;

	if(*str2 == '\0')
	{
		return (char*)str1;
	}
	while(*cp)
	{
		s1 = cp;
		s2 = str2;
		while(*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if(*s2 == '\0')
		{
			return (char*)cp;
		}
		cp++;
	}
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "bcd";
	char* ret = my_strstr(arr1,arr2);
	if(ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了:%s\n",ret);
	}
	return 0;
}

17、写代码实现输入任意的字符

要求:输入任意的字符,输出的都是小写

#include<ctype.h>
int main()
{
	char arr[10] = {0};
	scanf("%s",&arr);
	int i = 0;
	while(arr[i] != '\0')
	{
		if(isupper(arr[i]))
		{
			arr[i] = tolower(arr[i]);
		}
		printf("%c ",arr[i]);
		i++;
	}

	return 0;
}

18、模拟实现memcpy函数

#include<assert.h>
void* my_memcpy(void* dest,const void* src,size_t num)
{
	assert(dest && src);
	void* ret = dest;
	while(num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}	
int main()
{
	int arr1[] = {1,2,3,4,5,6,7,8,9};  
	int arr2[20] = {0};
	my_memcpy(arr2,arr1,20);

	return 0;
}

19、模拟实现memmove函数

#include<assert.h>
void* my_memmove(void* dest,const void* src,size_t num)
{
	assert(dest && src);
	void* ret = dest;
	if(dest<src)   //从前先后拷贝
	{
		while(num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else          //从后向前拷贝
	{
		while(num--)
		{

			*((char*)dest+num) = *((char*)src+num);
		}
	}
	return ret;
}
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9};

	my_memmove(arr+3,arr,20);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43313333/article/details/129358736