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");
}
//栈上的内容函数运行完销毁