C语言-编程实例

1,表达式求值

2,写一个函数返回参数二进制中的1的个数

3,两个整数的二进制表达中,有多少个(bit)位不同

4,打印整数二进制的奇数位和偶数位

5,全局变量与局部变量默认值

6,打印X型图案

7,获得月份天数

8,模拟string函数

9,const修饰指针变量

1,表达式求值

复制代码
#include<stdio.h>
int main() {
	int a, b, c;
	a = 5;
	c = ++a;//c=6  a=6
	b = ++c, c++, ++a, a++;//注意:有逗号表达式    c=8  b=7  a=8
	b += a++ + c;//a=9 b=23
	printf("a = %d b = %d c = %d\n", a, b, c);
	//9 23 8
	return 0;
}

2,写一个函数返回参数二进制中的1的个数

复制代码
#include<stdio.h>
//写一个函数返回参数二进制中的1的个数
// 方法一
//int count_num_of_1(int n) {
//	int count = 0;
//	while (n) {
//		if ((n%2)==1)
//		{
//			count++;
//		}
//		n /= 2;
//	}
//	return count;
//}
//注意  -1   
//1000000000000000000000000000000000000000000001
//1111111111111111111111111111111111111111111110
//1111111111111111111111111111111111111111111111   -1的补码
//对上述代码做了一点修改 
//int count_num_of_1(unsigned int n) {
//	int count = 0;
//	while (n) {
//		if ((n % 2) == 1)
//		{
//			count++;
//		}
//		n /= 2;
//	}
//	return count;
//}
//方法二(效率不高,循环32次)
//int count_num_of_1(int n) {
//	int i = 0;
//	int count = 0;
//	for ( i = 0; i < 32; i++)
//	{
//		if (((n>>i)&1)==1)
//		{
//			count++;
//		}
//	}
//	return count;
//}
//方法三(不容易想,但是非常牛)
//n=15
//n=n&(n-1)
//1111  n
//1110  n-1
//1110  n
//1101  n-1
//1100  n
//1011  n-1
//1000  n
//0111  n-1
//0000  n
int count_num_of_1(int n) {
	int count = 0;
	while (n) {
		n = n & (n - 1);
		count++;
	}
	return count;
}

int main() {
	int num = 0;
	scanf("%d", &num);
	int n = count_num_of_1(num);
	printf("%d\n", n);
	return 0;
}

3,两个整数的二进制表达中,有多少个(bit)位不同

复制代码
#include<stdio.h>
//两个整数的二进制表达中,有多少个(bit)位不同
//方法一
//int count_diff_bit(int m,int n) {
//	int count = 0;
//	int i = 0;
//	for ( i = 0; i < 32; i++)
//	{
//		if (((m>>i)&1)!=((n>>i)&1))
//		{
//			count++;
//		}
//	}
//	return count;
//}
////方法二(异或操作符)
int count_diff_bit(int m, int n) {
	int count = 0;
	// ^ 异或操作符
	//相同为0,相异为1
	int ret = m ^ n;
	//统计一下ret中的二进制位有几个
	while (ret) {
		ret = ret & (ret - 1);
		count++;
	}
	return count;
}
int main() {
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	int ret = count_diff_bit(m, n);
	printf("%d\n", ret);
	return 0;
}

4,打印整数二进制的奇数位和偶数位

复制代码
#include<stdio.h>
//打印整数二进制的奇数位和偶数位
//题目:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二机制序列
//
//10
//00000000000000000000000000001010
int main() {
	int i = 0;
	int num = 0;
	scanf("%d", &num);
	//获取奇数位的数字
	for ( i = 30; i >= 0; i-=2)
	{
		printf("%d ", (num >> i) & 1);
	}
	printf("\n");

	//获取偶数位的数字
	for ( i = 31; i >=1; i-=2)
	{
		printf("%d ", (num >> i) & 1);
	}
	return 0;
}

5,全局变量与局部变量默认值

复制代码
#include<stdio.h>
//全局变量,静态变量都是放在静态区
//全局变量,静态变量不初始化的时候,默认会被初始化为0
//局部变量,是放在栈区的,不初始化,默认值是随机值
//int i;//全局变量 0
int main() {
	i--;//-1
	printf("%d\n", i);
	//sizeof这个操作符计算返回的结果是size_t类型的,是无符号整型的
	//1000000000000000000000000000000000000000001   -1
	//1111111111111111111111111111111111111111110
	//1111111111111111111111111111111111111111111   -1的补码,在内存中的存储形式,(也是无符号数)
	if (i > sizeof(i))  //-1  >  4 
	{
		//printf("%d\n", sizeof(i));

		printf(">\n");
	}
	else
	{
		printf("<\n");

	}
	return 0;
}

6,打印X型图案

复制代码
#include<stdio.h>
//打印X型图案
//描述:输入一个整数,表示输出的行数,也表示组成"X"的反斜线和正斜线的长度
//针对每行输入,输出用"*"组成的x型图案
//eg:   *   *  
//       * *
//        *
//       * *
//      *   *
int main() {
	int n = 0;
	while (scanf("%d",&n)==1) {
		int i = 0;
		int j = 0;
		for ( i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++) {
				if (i==j)
				{
					printf("*");
				}
				else if (i+j==n-1)
				{
					printf("*");

				}
				else
				{
					printf(" ");

				}
			}
			printf("\n");

		}
	}
	return 0;
}

7,获得月份天数

复制代码
#include<stdio.h>
//获得月份天数
//输入年份和月份,计算这一年的这一月有多少天
int is_leap_year(int y) {
	return (((y % 4 == 0) && (y % 100 != 0)) || ((y % 400) == 0));
}
int main() {
	int y = 0;
	int m = 0;
	int d = 0;
	int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	               //  1  2  3 ...
	while(scanf("%d%d",&y,&m)==2) {
		int d = days[m];
		if ( (is_leap_year(y)==1)&&(m==2))
		{
			d++;
		}
		printf("%d\n", d);
	}
	return 0;
}

8,模拟string函数

复制代码
#include<stdio.h>
//模拟string函数
#include<string.h>
//void my_strcpy(char* dest, char* src) {
//	while (*src!='\0') {
//		*dest = *src;
//		dest++;
//		src++;
//	}
//	*dest = *src;
//}
//上述代码的改进版本
//#include<assert.h>
//void my_strcpy(char* dest, char* src) {
//
//	//断言
//	assert(src != NULL);
//
//		while (*dest++ = *src++) {
//			;
//
//		}
//	}
//int main() {
//	char arr1[20] = "xxxxxxxxxxxxxx";
//	char arr2[] = "hello bit";
//	//strcpy在拷贝字符串的时候,会把源字符串中的\0也拷贝进去
//	my_strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

//上面代码的完美版本
//strcpy返回值是char*   是目标空间的地址
#include<assert.h>
char* my_strcpy(char* dest, char* src) {
	char* ret = dest;
	//断言
	assert(src != NULL);
	assert(dest != NULL);


		while (*dest++ = *src++) {
			;

		}
		return ret;
	}
int main() {
	char arr1[20] = "xxxxxxxxxxxxxx";
	char arr2[] = "hello bit";
	//strcpy在拷贝字符串的时候,会把源字符串中的\0也拷贝进去
	//my_strcpy(arr1, arr2);
	printf("%s\n", my_strcpy(arr1, arr2));
	return 0;
}

9,const修饰指针变量

复制代码
#include<stdio.h>
int main() {
	const int num = 10;//常变量
	
	//const修饰指针变量
	//1.const 放在*的左边
	const int* p = &num;
	//意思是:p指向的对象不能通过p来改变了,但是p变量本身的值是可以改变的
	//2,const 放在*右边
	//意思是:p指向的对象是可以通过p来改变的,但是不能修改p变量本身的值
	int* const p = &num;
	return 0;
}
相关推荐
hixiong1231 天前
C# OpenvinoSharp使用RAD进行缺陷检测
开发语言·人工智能·c#·openvino
小浪花a1 天前
计算机二级python-jieba库
开发语言·python
骇客野人1 天前
自己手搓磁盘清理工具(JAVA版)
java·开发语言
清风徐来QCQ1 天前
Java笔试总结一
java·开发语言
lly2024061 天前
《jEasyUI 转换 HTML 表格为数据网格》
开发语言
小付同学呀1 天前
C语言学习(八)——C判断(switch语句)
c语言·学习·算法
萧曵 丶1 天前
LangChain Model IO 提示词模版(Python版)
开发语言·python·langchain
Elastic 中国社区官方博客1 天前
Elastic 为什么捐赠其 OpenTelemetry PHP 发行版
大数据·开发语言·elasticsearch·搜索引擎·信息可视化·全文检索·php
10Eugene1 天前
C++/Qt自制八股文
java·开发语言·c++
冰暮流星1 天前
javascript如何实现删除数组里面的重复元素
开发语言·前端·javascript