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;
}
相关推荐
bai_lan_ya2 小时前
嵌入式linux学习--makefile的使用以及通用解析
开发语言·前端·javascript
waves浪游2 小时前
库制作与原理(上)
linux·运维·服务器·开发语言·c++
闻缺陷则喜何志丹2 小时前
【差分数组】P9166 [省选联考 2023] 火车站|普及+
数据结构·c++·洛谷·差分数组
27669582922 小时前
微博评论采集
开发语言·python·微博·微博评论·微博评论采集
山北雨夜漫步2 小时前
MQ消息队列
java·开发语言
wjs20242 小时前
Maven 项目模板
开发语言
爱学习的小可爱卢2 小时前
JavaSE基础-Java字符串转整数与拼接实战指南
java·开发语言
重生之我是Java开发战士2 小时前
【优选算法】链表:两数相加,两两交换节点,重排链表,合并K个升序链表,K个一组反转链表
数据结构·算法·链表