【C语言】10题相关讲解+总结----有用的知识1

简介: 指向结构体类型变量的指针也可以通过*解引用操作符来访问结构体成员,但必须先用 *解引用操作符对指针解引用,再用 .操作符

总结【C语言】10题,有兴趣的可以看看


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元,可以多少汽水(编程实现)。


图例:


0b0192fe14db44e1bd3f1bb9d061ec09.png


代码:


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

1d03bf00915f4058bd66beb9dfa60cb0.png


6.上三角矩阵判定


上三角矩阵判定


9633d22b7f2d46888242755a03f151d5.png


代码:


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;
}
相关文章
|
存储 弹性计算 人工智能
2024年3月阿里云服务器优惠活动「开年采购」可领百万采购礼包
2024年3月阿里云服务器优惠活动「开年采购」可领百万采购礼包,99计划云服务器99元一年起、免费领取上云扶持优惠券,不只是云服务器、云数据库、存储、云电脑、域名等均有活动,阿里云百科整理阿里云开年采购上云无忧活动入口、优惠价格表和优惠券领取详细说明
|
监控 数据库
短剧CPS分销返佣平台系统开发介绍
聚合CPS系统是指将多个CPS(Cost Per Sale,按销售付费)广告合并在一起,通过一个平台进行管理和推广的系统。
|
存储 人工智能 算法
YOLOv8界面-目标检测+语义分割+追踪+姿态识别(姿态估计)+界面DeepSort/ByteTrack-PyQt-GUI
YOLOv8界面-目标检测+语义分割+追踪+姿态识别(姿态估计)+界面DeepSort/ByteTrack-PyQt-GUI
|
存储 关系型数据库 MySQL
MySQL 的核心技术有哪些?
MySQL 是一种广泛使用的关系型数据库管理系统,以下是一些 MySQL 的核心技术: 1. **存储引擎**:MySQL 支持多种存储引擎,如 InnoDB、MyISAM 等。存储引擎负责数据库的存储和检索,不同的存储引擎具有不同的特点和适用场景。 2. **索引技术**:索引是提高数据库查询性能的重要手段。MySQL 支持多种类型的索引,如 B-Tree 索引、哈希索引等,通过合理地创建和使用索引,可以大大提高查询的速度。 3. **事务处理**:MySQL 提供了事务处理的功能,保证了数据库操作的原子性、一致性、隔离性和持久性。事务可以确保一组相关操作要么全部成功,要么全部失败,从而保证
498 0
|
SQL 关系型数据库 MySQL
【MySQL异常解决】MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
【MySQL异常解决】MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
1488 0
|
11月前
|
API 索引
鸿蒙开发:实现一个超简单的网格拖拽
实现拖拽,最重要的三个方法就是,打开编辑状态editMode,实现onItemDragStart和onItemDrop,设置拖拽移动动画和交换数据,如果想到开启补位动画,还需要实现supportAnimation方法。
309 13
鸿蒙开发:实现一个超简单的网格拖拽
|
数据可视化 数据挖掘 API
NumPy 在科学计算中的角色
【8月更文第30天】NumPy 是 Python 中用于科学计算的核心库之一,它为 Python 提供了高效的数组处理能力。由于其强大的性能和简洁的 API,NumPy 成为了物理学、工程学以及其他科学领域进行数值计算的标准工具。本文将探讨 NumPy 在这些领域的应用,并通过具体的代码示例来展示 NumPy 的强大功能。
291 1
|
机器学习/深度学习 自然语言处理 搜索推荐
探索深度学习与自然语言处理(NLP)在智能客服系统中的创新应用
探索深度学习与自然语言处理(NLP)在智能客服系统中的创新应用
856 1
|
SQL 监控 数据库
SQL语句性能分析技巧与方法
在数据库管理中,分析SQL语句的性能是优化数据库查询、提升系统响应速度的重要步骤
|
机器学习/深度学习 数据可视化 数据挖掘
数据降维 | MATLAB实现T-SNE降维特征可视化
数据降维 | MATLAB实现T-SNE降维特征可视化