1、请简述gcc的编译步骤
预处理:展开头文件、删除注释、替换宏
编译:检查语法正确性,生成汇编文件
汇编:把汇编语言转换为二进制文件,生成目标文件
链接:把多个目标文件链接为可执行文件
2、C语言中基本数据类型有哪些,占用多少字节?
有无符号整行 int/unsigned int 4字节
有无符号字节型 char/unsigned char 1字节
短整型 short 2字节
有无符号长整型 long/unsigned long (32位4字节)64位8字节
单精度浮点型 float 4字节
双精度浮点型 double 8字节
3、C语言的存储类型有哪些?
auto:自动类型,局部变量默认不写存储类型就是auto
static:静态存储类型,延长生命周期
register:寄存器类型
extern:外部变量
修饰词:
const:修饰的变量特点不可以改变值
volatile:防止内存优化,保存内存的可见性
4、大小端存储的区别,判断大小端存储的方法
大端存储:地址高位存储数据低位,地址低位存储数据高位。大型网络
小端存储:地址高位存储数据高位,地址低位存储数据低位。计算机存储
int main(int argc, const char *argv[])
{
int a = 0x12345678;
printf("a = %d\n",a);
short b = a;
if(b == 0x1234)
{
printf("big\n");
}
else if(b == 0x5678)
{
printf("small\n");
}
return 0;
}
union
{
char a;
int b;
}u;
int main()
{
u.b = 0x12345678;
if(u.a == 0x12)
{
printf("big\n");
}
else if(u.a == 0x78)
{
printf("small\n");
}
return 0;
}
int main()
{
int a = 0x12345678;
char *p = (char *)&a;
if(*p == 0x12)
{
printf("big\n");
}
else if(*p == 0x78)
{
printf("small\n");
}
return 0;
}
5、给定一个无序数组,使用冒泡排序或者选择排序使其形成一个有序序列
void show(int arr[10])
{
for(int i = 0;i < 10;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void maopao(int arr[10])
{
for(int i = 1;i < 10;i++)
{
for(int j = 0;j < 10-i;j++)
{
if(arr[j+1] < arr[j])
{
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
printf("冒泡排序结果如下:");
show(arr);
}
void sselect(int arr[10])
{
for(int i = 0;i < 9;i++)
{
int max = arr[i];
for(int j = i+1;j < 10;j++)
{
if(arr[j] > max)
{
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
}
printf("简单选择排序后结果如下:");
show(arr);
}
int main(int argc, const char *argv[])
{
int arr[10] = {19,11,32,67,44,4,92,44,6,10};
maopao(arr);
sselect(arr);
return 0;
}
6、实现strcpy函数
char *mystrcpy(char *dts,char *src)
{
int i = 0;
while(*(src+i) != '\0')
{
*(dts+i) = *(src+i);
i++;
}
*(dts+i) = '\0';
return dts;
}
7、实现strcat函数
char *mystrcat(char *dts,char *src)
{
int i = 0;
int j = 0;
while(*(dts+i) != '\0')
{
i++;
}
while(*(src+j) != '\0')
{
*(dts+i) = *(src+j);
i++;
j++;
}
*(dts+i) == '\0';
return dts;
}
8、实现strcmp函数
int mystrcmp(char *str1,char *str2)
{
int i = 0;
while(*(str1+i) != '\0' && *(str2+i) != '\0')
{
if(*(str1+i) != *(str2+i))
{
return *(str1+i)-*(str2+i);
}
i++;
}
return 0;
}
9、实现字符串逆置
#include <myhd.h>
int main(int argc, const char *argv[])
{
char a[20] = "hello";
int i = 0;
int j = 0;
while(*(a+j) != '\0')
{
j++;
}
j--;
while(i<j)
{
char t = *(a+i);
*(a+i) = *(a+j);
*(a+j) = t;
i++;
j--;
}
printf("a = %s\n",a);
return 0;
}
10、写一个宏函数,判断两数大小
#define MAX(a,b) ((a<b?a:b))
11、以下程序的运行结果是什么
int fun(int a,int b)
{
return ((a&b) + (a|3));
}
int main(int argc, const char *argv[])
{
int a = 10;
int b = 20;
int s = fun(a,b);
printf("%d\n",s);
return 0;
}
答案:11
12、下面代码的输出结果什么是
void main( )
{
unsigned char ucNum;
for (ucNum = 0; ucNum < 500; ucNum++)
{
}
printf(“%d”, ucNum);
}
答案:无输出
13、输入一个数,判断是否为完数
int main(int argc, const char *argv[])
{
int n;
int sum;
scanf("%d",&n);
for(int i = 1;i < n;i++)
{
if(n%i == 0)
{
sum+=i;
}
}
if(summ == n)
{
printf("ok");
}
else
{
printf("no");
}
return 0;
}
14、打印下面图形
_
__F
___FE
____FED
_____FEDC
______FEDCB
_______FEDCBA
for(int i=1;i<=7;i++)
{
for(int j=1;j<=i;j++)
{
printf("_");
}
char ch='G';
for(int j=1;j<=i-1;j++)
{
printf("%c",ch-j);
}
printf("\n");
}
15、打印九九乘法表
for(int i=1;i<=9;i++)
{
for(int j=1;j<=i;j++)
{
printf("%d*%d=%-4d",j,i,j*i);
}
printf("\n");
}
16、循环输入10个数,计算最大差max-min
int max,min;
for(int i=1;i<=10;i++)
{
printf("please enter %d num:",i);
scanf("%d",&num);
if(i==1)
max=min=num;
if(max <num)
max=num;
if(min >num)
min=num;
}
printf("max-min=%d\n",max-min);
17、计算二维数组的最大值和最小值
int main(int argc, const char *argv[])
{
int m,n;
printf("please enter m,n:");
scanf("%d %d",&m,&n);
int arr[m][n];
int max,min;
//循环输入
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
max=min=arr[0][0];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(max<arr[i][j])
max=arr[i][j];
if(min>arr[i][j])
min=arr[i][j];
}
}
printf("max=%d min=%d\n",max,min);
return 0;
}
18、循环输入一维数组,交换最小值,和第二大值{不允许使用排序}
int arr[]={12,34,54,76,6,76,34,2};
int n=sizeof(arr)/sizeof(arr[0]);
//计算最大值和最小值
int first_max=arr[0],first_min=arr[0];
int first_maxi=0,first_mini=0;
for(int i=0;i<n;i++)
{
if(first_max<arr[i])
{
first_max=arr[i];
first_maxi=i;
}
if(first_min>arr[i])
{
first_min=arr[i];
first_mini=i;
}
}
//计算第二大
int second_max=first_min;
int second_maxi=0;
for(int i=0;i<n;i++)
{
if(i==first_maxi)
continue;
if(second_max<arr[i])
{
second_max=arr[i];
second_maxi=i;
}
}
arr[first_mini]=second_max;
arr[second_maxi]=first_min;
for(int i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
19、输入一个年月日,判断平年闰年,并确定是该年哪一天
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int year = 0;
int month = 0;
int day = 0;
int i = 1;
int sum = 0;
printf("请输入年 月 日:");
scanf("%d%d%d",&year,&month,&day);
if(month>=13||month<=0)
{
printf("错误的月份\n");
}
else if((month==1||3||5||7||8||10||12) && (day>31||day<0))
{
printf("该日不存在\n");
}
else if(((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))&&(month==4||6||9||11)&&(day>30||day<0))
{
printf("该日不存在\n");
}
else if((~(year%4==0&&year%100!=0)||(year%100==0&&year%400==0))&&(month==2)&&(day>28||day<0))
{
printf("该日不存在\n");
}
else if(((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))&&(month==2)&&(day>29||day<0))
{
printf("该日不存在\n");
}
else
{
if(year%4==0&&year%100!=0||year%100==0&&year%400==0)
{
printf("%d是闰年\n",year);
switch
sum = day+max(month,1)*31+max(month,2)*29+max(month,3)*31+max(month,4)*30+max(month,5)*31+max(month,6)*30+max(month,7)*31+max(month,8)*31+max(month,9)*30+max(month,10)*31+max(month,11)*30;
printf("%d年%d月%d日是今年的第%d天\n",year,month,day,sum);
}
else
{
printf("%d是平年\n",year);
sum = day+max(month,1)*31+max(month,2)*28+max(month,3)*31+max(month,4)*30+max(month,5)*31+max(month,6)*30+max(month,7)*31+max(month,8)*31+max(month,9)*30+max(month,10)*31+max(month,11)*30;
printf("%d年%d月%d日是今年的第%d天\n",year,month,day,sum);
}
}
return 0;
}
20、输入4个整数,判断最大值和最小值
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int a=0,b=0,c=0,d=0;
int max = 0;
printf("请输入四个数:");
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a>b)
{
max=a;
}
else
{
max=b;
}
if(max>c)
{
max=max;
}
else
{
max=c;
}
if(max>d)
{
max=max;
}
else
{
max=d;
}
printf("max=%d\n",max);
return 0;
}