学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-2

简介: (4). 取出内存中的 指数E(三种情况):E全为1指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128,指数是128说明这个值是非常大的。这时,如果 有效数字M 全为0,表示 ±无穷大(正负取决于符号位s)

(4). 取出内存中的 指数E(三种情况):E全为1

指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128指数是128说明这个值是非常大的

这时,如果 有效数字M全为0,表示 ±无穷大正负取决于符号位s

(七). 解释浮点数存储的例子:

#include <stdio.h>
int main()
{
  int n = 9;//4字节
  float* pFloat = (float*)&n;
  //把 n 的地址强制转换为 float类型 赋给指针变量 pFloat
  printf("n的值为:%d\n", n);
  //使用 %d 打印 n
  printf("*pFloat的值为:%f\n", *pFloat);
  //使用 %f 打印 地址中的内容
  *pFloat = 9.0;
  //使用指针变量把 9.0 赋给 n的空间
  printf("num的值为:%d\n", n);
  //使用 %d 打印 赋值后的 n
  printf("*pFloat的值为:%f\n", *pFloat);
  //使用 %f 打印 赋值后的 地址中的内容
  return 0;
}

image.png

(1). 整型存储,以 整型取出 和 浮点数取出:

image.png

(2). 浮点型存储,以 整型取出 和 浮点数取出:

image.png

练习:

                 

1. 有序序列判断:

           

(1). 方法一 -- 先输入数据再判断:

//描述
//输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。
//输入描述:
//第一行输入一个整数N(3≤N≤50)。
//第二行输入N个整数,用空格分隔N个整数。
#include <stdio.h>
int main()
{
  int n = 0;//数组长度
  //输入n:
  scanf("%d", &n);
  int arr[50] = { 0 };
  //输入数组数据:
  int i = 0;
  for (i = 0; i < n; i++)
  {
    scanf("%d", &arr[i]);
  }
  //判断是否有序:升序 降序,
  //有序的情况下 都是大于号 或 都是小于号
  int flag1 = 0; //表示升序,满足升序关系 --> flag1=1
  int flag2 = 0; //表示降序,满足降序关系 --> flag2=1
  //判断过程中,
  //如果 flag1一直为1,flag2一直为0,说明是升序,
  //如果 flag2一直为1,flag1一直为0,说明是降序
  //等于的话,flag1和flag2都是0
  //相邻两个数进行比较,n个数,比较n-1对
  for (i = 0; i < n-1; i++)
  {
    if(arr[i] < arr[i+1]) //前一个数 小于 后一个数
    {
      flag1 = 1;
    }
    else if (arr[i] > arr[i+1]) //前一个数 大于 后一个数
    {
      flag2 = 1;
    }
  }
  //判断完后,看 flag1 和 flag2 的情况来判断有无序
  if (flag1 + flag2 == 2)//说明既有大于又有小于
  {
    printf("unsorted\n");
  }
  else
  //==1的话 说明有序,==0的话,说明都相当,也是有序
  {
    printf("sorted\n");
  }
  return 0;
}

image.png

(2). 方法二 -- 边输入边判断(输入两个数后就可以判断一次大小了):

//描述
//输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。
//输入描述:
//第一行输入一个整数N(3≤N≤50)。
//第二行输入N个整数,用空格分隔N个整数。
#include <stdio.h>
int main()
{
  int n = 0;//数组长度
  //输入n:
  scanf("%d", &n);
  int arr[50] = { 0 };
  //判断是否有序:升序 降序,
  //有序的情况下 都是大于号 或 都是小于号
  int flag1 = 0; //表示升序,满足升序关系 --> flag1=1
  int flag2 = 0; //表示降序,满足降序关系 --> flag2=1
  //判断过程中,
  //如果 flag1一直为1,flag2一直为0,说明是升序,
  //如果 flag2一直为1,flag1一直为0,说明是降序
  //等于的话,flag1和flag2都是0
  //输入数组数据 并 进行判断:
  int i = 0;
  for (i = 0; i < n; i++)
  {
    scanf("%d", &arr[i]);
    //输入进来后就可以判断了
    if (i >= 1)//i大于1说明输入了 arr[0] 和 arr[1]
    {
      if (arr[i] < arr[i - 1]) //一个数 小于 前一个数
      {
        flag1 = 1;
      }
      else if (arr[i] > arr[i + 1]) //一个数 大于 前一个数
      {
        flag2 = 1;
      }
    }
  }
  //判断完后,看 flag1 和 flag2 的情况来判断有无序
  if (flag1 + flag2 == 2)//说明既有大于又有小于
  {
    printf("unsorted\n");
  }
  else
    //==1的话 说明有序,==0的话,说明都相当,也是有序
  {
    printf("sorted\n");
  }
  return 0;
}

bba4afb2e9284459bd9a019548c99394.png

2. 获得月份天数(多组输入)

                 

(1). 方法一 -- 使用switch语句进行日期分类:

(代码:)

//描述
//KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。
//输入描述:
//多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
//输出描述:
//针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。
#include <stdio.h>
//平年:
// 1  2  3  4  5  6  7  8  9  10 11 12
// 31 28 31 30 31 30 31 31 30 31 30 31
// 
//闰年:
// 1  2  3  4  5  6  7  8  9  10 11 12
// -- 29 -- -- -- -- -- -- -- -- -- --
// 1 3 5 7 8 10 12 -- 31天
// 4 6 9 11 -- 30天
// 2月 特殊
int get_days_of_month(int y, int m)
{
  int d = 0; //该年该月天数
  switch (m)
  {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
    {
      d = 31;
      break;
      // 1 3 5 7 8 10 12 -- 31天
    }
    case 4: 
    case 6: 
    case 9: 
    case 11:  
    {
      d = 30;
      break;
      // 4 6 9 11 -- 30天
    }
    case 2://二月特殊,进行判断
    {
      d = 28; //平年
      if ((y%4==0 && y%100!=0) || (y%400==0))
      {
        d += 1; //闰年:29天
      }
    }
  }
  return d;//返回天数
}
int main()
{
  int y = 0;//年
  int m = 0;//月
  //多组输入:
  while (scanf("%d %d", &y, &m) == 2)
  {
    int d = get_days_of_month(y, m);
    //写个函数计算该年该月的日期,
    //参数为 y 和 m
    //返回值为 对于日期
    printf("%d\n", d);
  }
  return 0;
}

(自定义函数部分:)

7f195f4772f6447299b47ac9e66312a2.png

(主函数部分:)

33470c8fee164542b25e7fb5e7917ab2.png

相关文章
|
27天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
27天前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
87 4
|
2月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
102 1
|
2月前
|
存储 Rust C#
内存指针解引用
【10月更文挑战第14天】
43 1
|
2月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
60 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
27天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
211 1
|
17天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。