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

目录

1、编写一个程序从1到100中,所有出现9的个数

2、分数求和

3、10个整形数字中选出最大值

4、打印9*9的乘法口诀

5、字符串逆序

6、计算一个数的每位之和(递归实现)

7、递归实现n的K次方

8、写个冒泡排序,把一个整形数组变成升序。

9、二进制位移位

10、实现数组的逆序、初始化、打印

扫描二维码关注公众号,回复: 14728772 查看本文章

11、模拟实现strcpy函数

12、写一个函数Numberof1求出一个数二进制1的个数

13、求两个书的最大公倍数

14、将一句话的单词进行倒置,标点不倒置

15、设计一个程序判断是大端存储还是小端存储

16、由a组成前n项之和 - 不考虑溢出

17、使用指针打印数组内容

18、列出100000以内的水仙花数

19、写一个函数交换字符串的每个字符

20、用C语言在屏幕上输出以下图案


1、编写一个程序从1到100中,所有出现9的个数

int main()
{
	int i = 0;
	int count = 0;
	for(i=0; i<=100; i++)
	{
		if(i%10 == 9)
		{
			count++;
		}
		if(i/10 ==9)

		{
			count++;
		}
	}
	printf("%d\n",count);

	return 0;
}

2、分数求和

        计算1/1-1/2+1/3-1/4+1/5...... + 1/99 - 1/100 的值,打印出结果

int main()
{
	int i = 0;
	double sum = 0.0;
	int flag = 1;
	for(i=1; i<=100; i++)
	{
		sum += flag*1.0/i;
		flag = -flag;
	}
	printf("%lf\n",sum);

	return 0;
}

3、10个整形数字中选出最大值

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int i = 0;
	int max = arr[0];
	for(i=1; i<10; i++)
	{
		max = (max>arr[i]?max:arr[i]);
		
	}
	printf("%d\n",max);
	return 0;
}

4、打印9*9的乘法口诀

int main()
{
	int i = 0;
	int j = 0;
	for(i=1; i<=9; i++)
	{
		for(j=1; j<=i; j++)
		{
			printf("%d*%d=%-2d ",i,j,i*j);
		}
		printf("\n");
	}

	return 0;
}

5、字符串逆序

        编写一个函数reverse_string(char* string)
        实现:将参数字符串中的字符反向排列,不是逆序打印。
        要求:不能使用C函数库中的字符串操作函数

int my_strlen(char* str)
{
	int i = 0;
	int count = 0;
	while(str[i] != '\0')
	{
		str++;
		count++;
	}
	return count;
}
void reverse_string(char* arr)
{
	int left = 0;
	int right = my_strlen(arr)-1;
	int tmp = 0;
	while(left<right)
	{
		tmp = arr[left];
		arr[left]=arr[right];
		arr[right]=tmp;
		right--;
		left++;
	}
}
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s\n",arr);

	return 0;
}

6、计算一个数的每位之和(递归实现)

        题目内容:写一个递归函数Digitsum(n),输入一个非负整数,返回组成它的数字之和。
        例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19输入:1729,输出: 19

int DigiSum(int num)
{
	if(num>9)
	{
		return num%10+DigiSum(num/10);
	}
	else
		return num;
}
int main()
{
	int num = 1729;
	printf("%d\n",DigiSum(num));

	return 0;
}

7、递归实现n的K次方

        题目内容:
        编写一个函数实现n的K次方,使用递归实现。

double que(int n,int k)
{
	if(k == 0)
	{
		return 1.0;
	}
	else if(k>0)
	{
		return n*que(n,k-1);
	}
	else
		return 1.0/(n*que(n,-k));
}
int main()
{
	int k = 0;
	int n = 0;
	scanf("%d %d",&n,&k);
	printf("%lf\n",que(n,k));

	return 0;
}

8、写个冒泡排序,把一个整形数组变成升序。

        要求:写一个函数bubble_sort为冒泡排序
        例如:arr[] = {9,8,7,6,5,4,3,2,1};变成:arr[] = {1,2,3,4,5,6,7,8,9};

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;
			}
		}
		
	}
}
int main()
{
	int arr[] = {9,8,7,6,5,4,3,2,1};
	int sz = sizeof(arr)/sizeof(arr[0]);
	int  i = 0;
	bubble_sort(arr,sz);
	for(i=0; i<sz; i++)
	{
		printf("%d ",arr[i]);
	}

	return 0;
}

         或者        

void bubble_sort(int arr[],int sz)
{
	int i =0;
	int flat = 1;
	//确定趟数
	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;
				flat = 0;
			}
		}
		if(flat == 1)
		{
			break;
		}
	}
}
int main()
{
	int arr[] = {9,8,7,6,5,4,3,2,1};
	int sz = sizeof(arr)/sizeof(arr[0]);
	int  i = 0;
	bubble_sort(arr,sz);
	for(i=0; i<sz; i++)
	{
		printf("%d ",arr[i]);
	}

	return 0;
}

9、二进制位移位

        要求:1.把a的二进制中的第5位置成1
                   2.把a的二进制中的第5位置成0

int main()
{
	int a = 13;
	//把a的二进制中的第5位置位1
	a = a | (1<<4);
	printf("%d\n",a);

	//把a的二进制中的第5位置位0
	a = a & ~(1<<4);
	printf("%d\n",a);

	return 0;
}

10、实现数组的逆序、初始化、打印

要求:数组{1,2,3,4,5,6,7,8,9}

  • 写一个函数完成数组的逆序;
  • 写一个函数打印数组的每一位元素
  • 写一个函数完成数组全为0
void reverse(int arr[],int sz)
{
	int left = 0;
	int right = sz - 1;
	while(left<right)
	{
		int tmp = 0;
		tmp = arr[right];
		arr[right] = arr[left];
		arr[left] = tmp;
		left++;
		right--;
	}
}
void init(int arr[],int sz)
{
	int i = 0;
	for(i=0; i<sz; i++)
	{
		arr[i] = 0;
	}
}
void print(int arr[],int sz)
{
	int i = 0;
	for(i=0; i<sz; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9};
	int sz = sizeof(arr) / sizeof(arr[0]);
	reverse(arr,sz);
	print(arr,sz);
	init(arr,sz);
	print(arr,sz);
	
	return 0;
}

11、模拟实现strcpy函数

要求:

  • 写一个函数my_strcpy模拟实现strcpy函数
  • 例如:把arr1[] = "hello"拷贝到arr[20] = "xxxxxxxxx"中

 简单实现:

void my_strcpy(char* dest,char* src)
{

	while(*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
}
int main()
{
	char arr[20] = "xxxxxxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr,arr2);
	printf("%s\n",arr);

	return 0;
}

通过改进为:

#include<assert.h>
void my_strcpy(char* dest,const char* src) //const修饰不会把src改掉
{
	assert(src != NULL); //断言,如果是NULL会有报错信息
	while(*dest++ = *src++) // 不仅可以实现把每个字符拷贝进去,而且还可以把‘\0’也拷贝过去
	{
		;
	}
}
int main()
{
	char arr[20] = "xxxxxxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr,arr2);
	printf("%s\n",arr);

	return 0;
}

再改进:

#include<assert.h>
char* my_strcpy(char* dest,const char* src) //const修饰不会把src改掉
{
	assert(src != NULL); //断言,如果是NULL会有报错信息
	char* ret = dest;
	while(*dest++ = *src++) // 不仅可以实现把每个字符拷贝进去,而且还可以把‘\0’也拷贝过去
	{
		;
	}
	return ret;
}
int main()
{
	char arr[20] = "xxxxxxxxxxxxxx";
	char arr2[] = "hello";
	;
	printf("%s\n",my_strcpy(arr,arr2));

	return 0;
}

12、写一个函数Numberof1求出一个数二进制1的个数

int Numberof1(int n)
{
	int count = 0;
	while(n)
	{
		if(n%2 == 1)
		{
			count++;
		}
		n /= 2;
	}
	return count;
}
int main()
{
	int n = 15;
	printf("%d\n",Numberof1(n));

	return 0;
}

以上的代码没有办法求负数,改进后下面代码

int Numberof1(int n)
{
	int count = 0;
	int  i = 0;
	for(i=0; i<32; i++)
	{
		if((n >> i) & 1 == 1)
		{
			count++;
		}
	}
	return count;
}
int main()
{
	int n = -1;
	printf("%d\n",Numberof1(n));

	return 0;
}

13、求两个书的最大公倍数

要求:输入a和b,求出最大公倍数m

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int m = a>b?a:b;
	while(1)
	{
		if((m%a == 0) && (m%b == 0))
		{
			printf("%d\n",m);
			break;
		}
		else
		{
			m++;
		}
	}
	return 0;
}

14、将一句话的单词进行倒置,标点不倒置

要求:输入:I like beijing. 经过函数变为:beijing. like I

#include<string.h>
void reverse(char* left,char* right)
{
	while(left<right)
	{
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[100] = {0};
	gets(arr);
	//三布翻转法
	int len = strlen(arr);
	reverse(arr,arr+len-1);  //先整体翻转

	                         //每个单词翻转
	char* start = arr;
	while(*start)
	{
		char* end = start;
		while(*end != ' ' && *end !='\0')
		{
			end++;
		}
		reverse(start,end-1);
		if(*end == ' ')
		{
			start = end + 1;
		}
		else
			start = end;

	}
	printf("%s\n",arr);

	return 0;
}

15、设计一个程序判断是大端存储还是小端存储

什么大端小端:

  • 大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
  • 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
int main()
{
	int a = 1;
	char* pa = (char*)&a;
	if(*pa == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}

	return 0;
}

或者写成一个函数

int check_sys()
{
	int a = 1;
	char* pa = (char*)&a;
	return *pa;//返回1表示小端,返回0表示大端
}
int main()
{
	int ret = check_sys();
	if(ret == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}

	return 0;
}

16、由a组成前n项之和 - 不考虑溢出

int main()
{
	int a = 0;
	int n = 0;
	scanf("%d %d",&a,&n);
	int i = 0;
	int sum = 0;
	int ret = 0;
	for(i=0; i<n; i++)
	{
		ret = ret*10 + a;
		sum = sum + ret;
	}
	printf("%d\n",sum);

	return 0;
}

17、使用指针打印数组内容

        题目内容:

  •         写一个函数打印ar数组的内容,不使用数组下标,使用指针。
  •         arr是一个整形一维数组
  •         用两种方法
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int *p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for(i=0; i<sz; i++)
	{
		printf("%d ",*(p+i));
	}

	return 0;

}

第二种方法

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int *p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int *pend = arr+sz-1;
	while(p<=pend)
	{
		printf("%d ",*p);
		p++;
	}

	return 0;

}

18、列出100000以内的水仙花数

水仙花数是:指一个n位数,其各位数字的n次方之和等于该数本身,如:153=1^3+5^3+3^3

#include<math.h>
int main()
{
	int i = 0;
	for(i=0; i<=100000; i++)
	{
		//计算i的位数
		int n = 0;
		int tmp = i;
		while(tmp/10)
		{
			n++;
			tmp = tmp/10;
		}
		//计算i的每一位的n次方和
		tmp = i;
		int sum = 0;
		while(tmp)
		{
			//pow是用来求每一位的n次方的
			sum += pow( tmp % 10, n);
			tmp = tmp / 10;
		}
		if(sum == i)
		{
			printf("%d ",i);
		}
	}

	return 0;
}

19、写一个函数交换字符串的每个字符

要求:分别用指针下标引用符和*指针的方式

指针下标引用符

#include<string.h>
void reverse(char arr[])
{
	int len = strlen(arr);
	int left = 0;
	int right = len-1;
	while(left<right)
	{
		char tmp = 0;
		tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "hello word";	
	reverse(arr);
	printf("%s\n",arr);	

	return 0;
}

*指针的方式

#include<assert.h>
#include<string.h>
void reverse(char *arr)
{
	assert(arr !=NULL);
	int len = strlen(arr);
	char* left = arr;
	char* right = arr+len-1;
	while(left<right)
	{
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "hello word";	
	reverse(arr);
	printf("%s\n",arr);	

	return 0;
}

20、用C语言在屏幕上输出以下图案

要求:输入n=7行时候,打印如下图

7
      *
     ***
    *****
   *******
  *********
 ***********
*************
 ***********
  *********
   *******
    *****
     ***
      *
请按任意键继续. . .

代码为:

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

	//打印上半部分
	for(i=0;i<line;i++)
	{
		//打印前半段空格
		int j = 0;
		for(j=0;j<line-1-i;j++)
		{
			printf(" ");			
		}

		//打印后半段*
		for(j=0;j<2*i+1;j++)
		{
			printf("*");
		}
		printf("\n");
	}

	//打印下半部分
	for(i=0;i<line-1;i++)
	{
		int j = 0;
		for(j=0;j<=i;j++)
		{
			printf(" ");
		}
		for(j=0;j<2*(line-1-i)-1;j++)
		{
			printf("*");
		}
		printf("\n");
	}

	return 0;
}

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

C语言初识(2) | 变量和常量

C语言初识(3) | 字符串 | 转译字符

C语言初识(4) | 顺序 | 选择 | 循环

C语言初识(5) | 函数 | 数组 | 操作符

C语言初识(6) | 关键字

C语言初识(7) | 指针| 结构体 | define

C语言初阶(8) | 选择结构 | if_else | switch

C语言初阶(9) | while | break | continue | getchar

C语言初阶(10) | 初识for循环 | 入门

猜你喜欢

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