总结【C语言】10题,有兴趣的可以看看
- 1.结构体与typedef联系
- 2.结构体中涉及的操作符
- 3.指针数组与数组指针
- 4.数组首元素的作用
- 5.喝汽水问题
- 6.上三角矩阵判定
- 7 矩阵相等判定
- 8.VS调试技巧
- 9.Debug与Release关系
- 10.调整奇数偶数顺序
- 11.有序序列合并
1.结构体与typedef联系
如有以下代码
struct student
{
int num;
char name[32];
float score;
}stu;
则下面的叙述不正确的是:(D )
A.struct 是结构体类型的关键字
B.struct student 是用户定义的结构体类型
C.num, score 都是结构体成员名
D.stu 是用户定义的结构体类型名
D .stu不是结构体类型名,而是结构体定义的变量,如果想让stu变成用户定义的结构体类型名
必须在结构体定义时添加typedef关键字
比如:
typedef struct student
{
int num;
char name[32];
float score;
}stu;//将结构体sturct student 类型名改成stu了
2.结构体中涉及的操作符
结构体访问成员的操作符不包含:(D )
A… 操作符
B.-> 操作符
C.* 解引用操作符
D.sizeof
A.结构体变量在访问结构体时使用 .操作符
B.指向结构体类型变量的指针在访问结构体变量时使用 ->操作符
C.指向结构体类型变量的指针也可以通过*解引用操作符来访问结构体成员,但必须先用 *解引用操作符对指针解引用,再用 .操作符
D sizeof是求结构体类型大小的
3.指针数组与数组指针
下面哪个是指针数组:( A)
A. int* arr[10];
B.int * arr[];
C.int **arr;
D.int (*arr)[10];
指针数组是一个数组,数组元素都是指针
A.定义了一个10个元素的数组,数组元素是int 类型
B.在定义数组时必须要有明确的大小,如果没有大小也必须给出初始化结构
C二级指针,int **类型
D.arr首先与结合成为指针,指针指向一个int[10]数组的,所以这是个数组指针。
4.数组首元素的作用
truct stu
{
int num;
char name[10];
int age;
};
void fun(struct stu *p)
{
printf(“%s\n”,(*p).name);
return;
}
int main()
{
struct stu students[3] = {{9801,"zhang",20},
{9802,"wang",19},
{9803,"zhao",18} };
fun(students + 1);
return 0;
}
结果(C)
A.zhang
B.zhao
C.wang
D.18
定义一个结构体数组,数组元素有3个,而数组名表示首元素地址,+1表示第二个元素的地址,所以将第二个元素的地址传给fun函数,fun用指针接收,先解引用,访问到结构体变量,再用.操作符访问变量元素,wang
5.喝汽水问题
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
图例:
代码:
int main()
{
int money;
scanf("%d", &money);
int total = 0;//总共喝的数量
int empty = 0;//空瓶的数量
total += money;//1块就等于1瓶
empty = money;//一元等于1瓶==一个空瓶
while (empty >= 2)
{
total += empty / 2;//2个空瓶换一个汽水
empty = empty / 2 + empty % 2;//空瓶等于刚刚喝的汽水得到的瓶子,和上次奇数瓶子没有换整数汽水剩下的瓶子。循环
}
printf("%d", total);
return 0;
}
6.上三角矩阵判定
上三角矩阵判定
代码:
int main()
{
int n;
int arr[100][100];
scanf("%d ", &n);
int i;
int j;
int flag = 1;//默认flag=1是上三角矩阵
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < i; j++)
{
if (arr[i][j] != 0)
{
flag = 0;//如果有一个不为0,则不是上三角
goto end;//跳出循环
}
}
}
end://判断
if (flag == 1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
7 矩阵相等判定
矩阵相等判定
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int arr1[10][10];
int arr2[10][10];
int i, j;
int flag = 1;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr1[i][j]);
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr2[i][j]);
if (arr1[i][j] != arr2[i][j])
{
flag = 0;
goto end;
}
}
}
end:
if (flag == 1)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
8.VS调试技巧
关于VS调试快捷键说法错误的是:(A )
A.F5-是开始执行,不调试
B.F10-是逐过程调试,遇到函数不进入函数
C.F11-是逐语句调试,可以观察调试的每个细节
D.F9是设置断点和取消断点
A.F5是开始调试,遇到断点的位置可以停下来,ctrl+F5是开始执行,不调试。
正确,F10遇到函数不会进入函数内部,F11会
F11会进入函数的内部
F9会在光标所在行下断点,如果有断点就会取消断点
9.Debug与Release关系
关于Debug和Release的区别说法错误的是:( )
A.Debug被称为调试版本,程序调试找bug的版本
B.Release被称为发布版本,测试人员测试的就是Release版本
C.Debug版本包含调试信息,不做优化。
D.Release版本也可以调试,只是往往会优化,程序大小和运行速度上效果最优
Debug版本是用来调试的,调试代码都是在Debug模式下进行的
Release版本最终是要发给用户,发给用户的版本是不能有问题的,测试人员就是用的Release版本
C:正确,Debug版本是调试版本,编译器编译时会增加一些调试信息,编译器基本不会对其进行优化
D:错误,Release版本是不能调试的,一般都是在Debug版本下调试的,Release版本一般编译器会进行大量的优化,删除无用的代码,指令的次序调整等,让其速度更快
10.调整奇数偶数顺序
调整数组使奇数全部都位于偶数前面。
题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
思路:
我们可以设置两个下标left,right
1.让left从数组的左边开始遍历,如果找到奇数则跳过去继续往后找,如果找到偶数则停下
2.让right从数组的右边开始遍历,如果找到偶数则跳过去继续往前找,如果找到奇数就停下来
3.如果左边和右边都找到,则进行交换
4.要注意循环的条件,left能超过right吗?
5.还有一个问题:如果全是奇数或者全是偶数,则存在越界问题
代码:
void Move(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
while (left < right)
{
//左边找偶数
while ((left < right)&& ((arr[left] % 2 == 1)))//如果全奇数或者全是偶数,会导致left++或者right--,越界,所以这里还是需要改进一下再加上left<right这个条件
{
left++;//找到奇数++往后找
}
//右边找奇数
while ((left < right)&&((arr[right] % 2 == 0)))
{
right--;//找到偶数--,往前找
}
//交换
// 如果偶数和奇数都找到,交换这两个数据的位置
// 然后继续找,直到两个指针相遇
if(left<right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;//交换完需要跳过去
right--;
}
}
int main()
{
int n;
scanf("%d", &n);
int arr[10];
int sz = sizeof(arr) / sizeof(arr[0]);
int i;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
Move(arr, sz);
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
11.有序序列合并
有序序列合并
思路:
1.两个数列都是有序的
要求合并成有序数列
2.我们可以分别对两个数组遍历,然后将遍历的数按有序放进另一个数组里
3.我们对数组1用i遍历,对数组2用j遍历,用k对数组3进行遍历,在遍历的过程让数组1和数组2中元素进行比较
如果数组1中元素比数组2中元素小,则将数组1中这个元素放进数组3中,数组1中i++,往后走,数组3,下标k也++往后走,然后再与数组2比较,然后将比较的元素中较小的元素放进数组3中,然后下标++。
4.最后如果某个数组先遍历完,则最后直接将剩下的数组的元素全部放进数组3中即可
代码:
int main()
{
int arr1[100];
int arr2[100];
int arr3[200];
int i, j;
int n, m;
scanf("%d %d", &n, &m);
//将数据输入
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
for (i = 0; i < m; i++)
{
scanf("%d", &arr2[i]);
}
//比较两个数组
int i = 0;//需要将i重新赋值0
int k = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
//比较两个数组元素,将小的元素放进数组3中,然后再比较
arr3[k] = arr1[i];
i++;//这个元素放进去后,后面的元素继续与数组2比较
k++;//放进去一个元素++
}
else
{
arr3[k] = arr2[j];
j++;
k++;
}
}
//出了循环肯定有一个数组先遍历完,然后我们就可以直接将剩下一个数组的全部元素直接放进数组3中就可以了
if (i == n)//如果数组1先遍历完
{
arr3[k] = arr2[j];
j++;
k++;
}
else//如果数组2先遍历完
{
arr3[k] = arr1[i];
i++;
k++;
}
//打印
for (k = 0; k < n + m; k++)
{
printf("%d ", arr3[k]);
}
return 0;
}