c11结构体

1.

面试问题:typedef define 区别是什么?
typedef自定义类型
/C和C++的区别:
//C:空的结构体,大小不确定,报错
//c++:空的结构体,大小为1个字节
typedef int *PP;//==》由这种变量提升为类型

2.联合体

union sample
{
	short i;//2
	char ch;//1
	float f;//4
	union MyUnion
	{
		char ch;
	};
}s;

3.结构体的大小

struct A
{
	char a;//1
	int b;//4
};//8
struct B
{
	char a;//1+1
	short b;//2
	int c;//4
};//8
//向前对齐
struct C
{
	char a;//1+3
	int b;//4
	short c;//2
	double d;//8
};//24
struct D
{
	char a;//1
	char  b;//1
	short c;//2
	int d;//4
};//8
struct  E
{
	char a;//1+1
	short c;//2
	char  b;//1+3
	int d;//4
};//12
//向后对齐
struct F
{
	int a;//4
	char c;//1
	//int d;//4
	struct F *p;//4
};

typedef struct A
{
	char a;
	int b;
	//struct A bb;//在当前结构体内,不能自引用
}Aa;
//   .:是否为变量         ->:是否为指针
struct B
{
	int i;//不能进行赋值
	struct A Aaa;
	struct A *p;
}Bb;

4.用联合体判断大小端??

bool IsLittle() 
{
	union MyUnion
	{
		short a;
		char ch;
	}uu;
	uu.a = 0x1234;

	if(uu.ch == 0x34)
	{
		return true;
	}
	return false;
}

5.输入年月日,得到今天是今年的第几天

typedef struct Day 
{
	int year;
	int month;
	int day;
}Day;

int Today(Day * pdays)
{
	int today = 0;
	int arr[] = {31,28,31,30,31,30,31,31,30,31,30,31};
	if((pdays->year % 4 == 0 && pdays->year %100 != 0)
		|| pdays->year % 400 == 0)
	{
		arr[1] = 29;
	}
	//1,1
	switch(pdays->month) 
	{
	case 12://12
		today += arr[10];
	case 11://
		today += arr[9];
	case 10://
		today += arr[8];
	case 9://
		today += arr[7];
	case 8://
		today += arr[6];
	case 7://
		today += arr[5];
	case 6://
		today += arr[4];
	case 5://
		today += arr[3];
	case 4://
		today += arr[2];
	case 3://
		today += arr[1];
	case 2://
		today += arr[0];
	case 1:
		today += 0;
		break;
	}
	today += pdays->day;
	return today;
}

6.//3、在第一个字符串中 ,删除第二个字符串中所有的字符。

//函数原型:char *DeleteChars(char *str1,char *str2);
//参数str1:“Welcome hello” 参数str2:“come” 结果输出:“Wl hello”

char *DeleteChars(char *str1,const char *str2)
 {
	 assert(str1!=NULL&&str2!=NULL);
	 int brr[256]={0};//ASCII码有256
	 const char *p2=str2;
	 while(*p2!='\0')//我们可以申请一个数组用来代表这256个字符是否存在于第二个字符串中,
	 {
		 brr[*p2]=1;//把要删除的字母赋值为1
		 p2++;
	 }
	 char *pbegin=str1;//如果有,则标记为1,如果没有则标记为0.同理,我们通过查询,对应ASCII值号下,数组是否为1,来判定是否删除
	 char *pend=str1;
	 while(*pend!='\0')
	 {
		if(brr[*pend]!=1)	//判断pend指向的字母是否在brr中,(在的话删除,)不在继续找下一个
		{
			*pbegin=*pend;
			pbegin++;
			pend++;
		}
		else
		{
			pend++;
		}
	 }
	 *pbegin='\0';
	 return str1;
 }

7. 第四题4、筛选法求100以内的素数。即2的倍数大于1的全部置0,3的倍数大于1的全部置0,4的倍数大于1的全部置0…,最后找出不为0的数字

void Screen()
{
	int arr[N+1]={};
	int i;
	for(i=1;i<=N;i++)//将所有数赋值为1
	{
		arr[i]=1;
	}
	//int i,count =2;
	int count =2;
	 while(count<=N/2) //显然:count不会超过N/2,必能使留下的数全为素数。
    {
        for( i=count+1;i<=N;i++)
        {
            if(arr[i]==1&&i%count==0)//判断是否为素数,如果否将这个值赋值为0
            arr[i]=0;
        }
        for(i=count+1;i<=N;i++)
        {
            if(arr[i]==1)//如果是素数,将i的值赋给count,
            {
                count=i;
                break;//结束for循环
            }
		}
	 }
		for(i=2;i<N;i++)
		{
			if(arr[i]==1)
			{
				printf("%3d",i);
			}
		}
}
void Prime(int n)//法二
{
	int *p=(int *)malloc(n*sizeof(int));
	assert(p!=NULL);
	for(int i=0;i<n;i++)
	{
		p[i]=1;//亮灯
	}
	for(int j=2;j<n;j++)//2  -n之间的素数
	{
		for(int num=2;num<j;num++)//3-n之间能否整除判断j是否为素数
		{
			if(j%num==0)//不是素数
			{
				p[j]=0;
			}
		}
	}
	for(int k=2;k<n;k++)
	{
		if(p[k]==1)
		{
			printf("%d ",k);
		}
	}
	printf ("\n");
}
//栈上的内容函数运行完销毁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值