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;
}