C语言入门——第十课

目录

一、布隆过滤器

二、伪随机 

三、作业

1.设计一个计算器程序

 2.输入年月日,输出这是这一年第几天

3.输入年月日,输出这是几几年几几月的星期几

4.冒泡排序

5.不允许重复的随机值


一、布隆过滤器

用来判断某个元素是否在集合内,具有运行快,内存占用小的特点。

它只能得出两个结论:在集合中或者可能在集合内。

例如:下面的例子我们把Frandy和Eli分别通过HASH函数映射到集合内,对应位置填上1。现在我们需要查询Tom,我们的做法就是将Tom使用HASH函数,看是否映射在了集合位为1的位置,如果没有,得出Tom不在集合中;我们查询Lily,通过HASH函数,我们发现有个别位置为1,所以我们可以得出,它可能在集合中。

 视频讲解:什么是布隆过滤器_哔哩哔哩_bilibili

文档说明:5 分钟搞懂布隆过滤器,亿级数据过滤算法你值得拥有! - 知乎 (zhihu.com) 

二、随机函数 

定义一个包含10个整型元素的数组,数组的值为随机值。

int main()
{
	const int n = 10;
	int ar[n];
	for (int i = 0; i < n; i++)
	{
		ar[i] = rand() % 100;
	}
	for (int i = 0; i < n; i++)
	{
		printf("%5d", ar[i]);
	}

}

此时的输出结果每次运行都是如下:伪随机

Q:如何使得随机值每一次都随机呢? 

A:改变随机因子scrand。

令scrand(2);

 令srand(1);

 我们发现,改变了随即因子,随机值每次都会发生改变,但是为了避免每次都手动更改,所以我们使用time。time代表的就是从1970到现在的秒数 。因为每一秒都不一样,使用它作为随机因子,可以自动改变每一次执行的随机结果。

三、作业

1.设计一个计算器程序

要求:使用多文件结构,实现加、减、乘、除运算。

分析:读入两个操作数和运算符,根据运算符完成相应运算。

Counter.h

#include <stdio.h>
#ifndef COUNTER_H
#define COUNTER_H

//函数的声明
extern int Add_Int(int a,int b);
extern int Sub_Int(int a, int b);
extern int Mul_Int(int a, int b);
extern int Div_Int(int a, int b);
void Show_Sum(int a,int b,char op,int sum);
void Counter(int a,int b,char op);
#endif // !COUNTER.H

Counter.cpp 

#include <stdio.h>
#include "Counter.h"

int Add_Int(int a, int b)
{
	int sum = 0;
	sum = a + b;
	return sum;
}
int Sub_Int(int a, int b)
{
	int sum = 0;
	sum = a - b;
	return sum;
}
int Mul_Int(int a, int b)
{
	int sum = 0;
	sum = a * b;
	return sum;
}
int Div_Int(int a, int b)
{
	int sum = 0;
	sum = a / b;
	return sum;
}
void Show_Sum(int a, int b, char op, int sum)
{
	printf("%d %c %d = %d", a, op, b, sum);
}
void Counter(int a, int b, char op)
{

	int sum;
	bool flag = true;
	switch (op)
	{
	case '+':
		sum = Add_Int(a, b);
		break;
	case '-':
		sum = Sub_Int(a, b);
		break;
	case '*':
		sum = Mul_Int(a, b);
		break;
	case '/':
		if (b != 0)
		{
			sum = Div_Int(a, b);
		}
		else
		{
			printf("除数不能为0");
		}
		break;
	default:
		printf("运算符错误!");
		flag = false;
		break;
	}
	if (flag)
	{
		Show_Sum(a, b, op, sum);
	}
}

test_cpp(主函数)

#include<stdio.h>
#include"Counter.h"

int main()
{
	int a;
	int b;
	char op;
	scanf("%d %c %d", &a,&op,&b);
	Counter(a, b, op);

}

 2.输入年月日,输出这是这一年第几天

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

bool Is_Leap(int year)
{
	return(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int GetDateToDay(int year,int month,int days)
{
	int day[] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };
	if (Is_Leap(year) && (month == 2))
	{
		month = 0;
	}
	for (int i = 0; i < month- 1; i++)
	{
		 days =days + day[i];
	}
	return days;
}
int main()
{
	int year;
	int month;
	int days;
	scanf("%d %d %d", &year, &month, &days);
	if (year < 1)
	{
		return -1;
	}
	if (month < 1 || month>12)
	{
		return -2;
	}
	if (!Is_Leap(year)&&(month==2))
	{
		if (days < 1 || days>28)
		{
			return -3;
		}
	}
	if (Is_Leap(year) && (month == 2))
	{
		if (days < 1 || days>29)
		{
			return -4;
		}
	}
	days = GetDateToDay(year, month, days);
	printf("这是%d年第%d天",year,days);
	return 0;
}

3.输入年月日,输出这是几几年几几月的星期几

查数学家的公式~

蔡勒公式:星期几=(日期+2*月份+3*(月份+1)/5+年份+年份/4-年份/100+年份/400)/7。

result=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

bool Is_Leap(int year)
{
	return(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int GetDateToDay(int year, int month, int days)
{
	int day[] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };
	if (Is_Leap(year) && (month == 2))
	{
		month = 0;
	}
	for (int i = 0; i < month - 1; i++)
	{
		days = days + day[i];
	}
	return days;
}
int main()
{
	int year;
	int month;
	int day;
	int days;
	int result;
	scanf("%d %d %d", &year, &month, &day);
	if (year < 1)
	{
		return -1;
	}
	if (month < 1 || month>12)
	{
		return -2;
	}
	if (!Is_Leap(year) && (month == 2))
	{
		if (day < 1 || day>28)
		{
			return -3;
		}
	}
	if (Is_Leap(year) && (month == 2))
	{
		if (day < 1 || day>29)
		{
			return -4;
		}
	}
	days = GetDateToDay(year, month, day);
	result = (year - 1 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + days) % 7;
	printf("这是%d年%d月%d日星期%d", year,month,day,result);
	return 0;
}

4.冒泡排序

定义大小为100的整型数组,使用随机函数给数组元素赋值,数值范围为1…100,并且排序,使用冒泡排序实现。

冒泡排序详解:排序算法之冒泡排序(图解)_Sueko的博客-CSDN博客

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void bubbleSort(int array[], int size)
{
	//第一个for循环代表遍历多少遍
	for (int i = 0; i < size - 1; i++)
	{
		//第二个for循环代表每次遍历多少个元素
		for (int j = 0; j < size - i - 1; j++)
		{
			if (array[j + 1] > array[j])
			{
				int temp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = temp;
			}
		}
	}
}
void showArray(int array[],int size)
{
	for (int i = 0; i < size; i++) 
	{
		printf("%d ", array[i]);
	}
	printf("\n");
}
int main()
{
	const int size = 100;
	int arr[size];
	srand(time(NULL));
	for (int i = 0; i < size; i++)
	{
		arr[i] = rand() % 100 + 1;
	}
	bubbleSort(arr, size);
	printf("Sorted Array in Ascending Order:\n");
	showArray(arr, size);
}

5.不允许重复的随机值

定义大小为100的整型数组,使用随机函数给数组元素赋值,数值范围是1…100,且不容许重复。

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void showArray(int array[], int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", array[i]);
	}
	printf("\n");
}
int main()
{
	const int size = 100;
	int arr[size];
	int count = 0;
	int isNotInclude = 1;
	srand(time(NULL));
	while (count<size)
	{
		int num = rand() % 100 + 1;
		for (int i = 0; i < count; i++)
		{
			if (num == arr[count])
			{
				isNotInclude = 0;
				break;
			}
		}

		if (isNotInclude)
		{
			arr[count] = num;
			count++;
		}
	}
	showArray(arr, size);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值