C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)

简介: C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)

3.5、C语言经典实例15-进制数的转换进制数的转换


在Main.h头文件中声明一个func15函数和trans函数,然后再Main.c源文件中定义func15函数和trans函数,并实现相关的功能。


Main.h头文件添加的代码如下


#define M sizeof(unsigned int)*8
// 实例15:进制数的转换进制数的转换
void func15();
int trans(unsigned n, int d, char s[]);


Main.c源文件添加的代码如下

// 实例15:进制数的转换进制数的转换
void func15()
{
  unsigned int num = 253;
  int scale[] = { 2,3,10,16,1 };
  char str[33];
  int i;
  for (i = 0; i < sizeof(scale) / sizeof(scale[0]); i++)
  {
    if (trans(num, scale[i], str))
    {
      printf("%5d = %s(%d)\n", num, str, scale[i]);
    } 
    else
    {
      printf("%5d => (%d) Error! \n", num, scale[i]);
    }
  }
}
int trans(unsigned n, int d, char s[])
{
  /* 十六进制数字的字符 */
  static char digits[] = "0123456789ABCDEF";
  char buf[M + 1];
  int j, i = M;
  if (d < 2 || d>16)
  {
    s[0] = '\0';  // 不合理的进制,置s为空字符串 
    return 0;   // 不合理的进制,函数返回0 
  }
  buf[i] = '\0';
  do
  {
    buf[--i] = digits[n % d]; // 译出最低位,对应字符存入对应工作数组中
    n /= d;
  } while (n);
  // 将译出在工作数组中的字符串复制到s */
  for (j = 0; (s[j] = buf[i]) != '\0'; j++, i++);
  // 其中控制条件可简写成s[j]=buf[i] 
  return j;
}


然后在main()函数中只调用func15()函数,其调试结果如下


f5db73bb08f943f29fa9fda376b37c08.png


3.6、C语言经典实例16-判断回文数


在Main.h头文件中声明一个func16函数和circle函数,然后再Main.c源文件中定义func16函数和circle函数,并实现相关的功能。

Main.h头文件添加的代码如下

// 实例16:判断回文数
void func16();
int circle(int n, int d);

Main.c源文件添加的代码如下


// 实例16:判断回文数
void func16()
{
    int num[] = { 232,27,851 };
    int scale[] = { 2,10,16 };
    int i, j;
    for (i = 0; i < sizeof(num) / sizeof(num[0]); i++)
    {
        for (j = 0; j < sizeof(scale) / sizeof(scale[0]); j++)
        {
            if (circle(num[i], scale[j]))
            {
                printf("%d -> (%d) 进制是回文数!\n", num[i], scale[j]);
            }
            else
            {
                printf("%d -> (%d) 进制不是回文数!\n", num[i], scale[j]);
            }
        }
    }
}
int circle(int n, int d)
{
    int s = 0, m = n;
    while (m)
    {
        s = s * d + m % d;
        m /= d;
    }
    return s == n;
}

然后在main()函数中只调用func16()函数,其调试结果如下

e351b4ab22864ea488dbb09fcd88acba.png


3.7、C语言经典实例17-找出次大值


在Main.h头文件中声明一个func17函数,然后再Main.c源文件中定义func17函数,并实现相关的功能。


Main.h头文件添加的代码如下


// 实例17:找出次大值
void func17();


Main.c源文件添加的代码如下

// 实例17:找出次大值
void func17()
{
  int n;
  int t;
  int m1 = 0;
  int m2 = 0;
  int k;
  printf("请输入数据的个数:\n");
  scanf_s("%d", &n);
  printf("请输入这些数:\n");
  for (k = 1; k <= n; k++)
  {
    scanf_s("%d", &t);
    if (t > m1)
    {
      m2 = m1;///                                                                                                                                                                
      m1 = t;
    }
    else
    {
      if (t > m2)
        m2 = t;
    }
  }
  printf("这些数的最大值:%d,次大值:%d\n", m1, m2);
}


然后在main()函数中只调用func17()函数,其调试结果如下


7249f93dca6c462abc2f00386a967995.png


3.8、C语言经典实例18-验证哥德巴赫猜想


在Main.h头文件中声明一个func18函数、judgeGDBHArith函数和primeJudge函数,然后再Main.c源文件中定义func18函数、judgeGDBHArith函数和primeJudge函数,并实现相关的功能。

Main.h头文件添加的代码如下

// 实例18:验证哥德巴赫猜想
void func18();
// 否符合哥德巴赫猜想
int judgeGDBHArith(int intNum);
int primeJudge(int n);

Main.c源文件添加的代码如下

// 实例18:验证哥德巴赫猜想
void func18()
{
  int a = 0;
  printf("输入一个大于6的偶数:\n");
  scanf_s("%d", &a);
  int blFlag = judgeGDBHArith(a);       //判断是否符合哥德巴赫猜想
  if (blFlag)
  {
    printf("%d能写成两个素数的和,所以其符合哥德巴赫猜想。\n", a);
  }
}
// 否符合哥德巴赫猜想
int judgeGDBHArith(int intNum)
{
  int blFlag = 0;             //标识是否符合哥德巴赫猜想
  if (intNum % 2 == 0 && intNum > 6)        //对要判断的数字进行判断
  {
    for (int i = 1; i <= intNum / 2; i++)
    {
      int bl1 = primeJudge(i);      //判断i是否为素数
      int bl2 = primeJudge(intNum - i);   //判断intNum-i是否为素数
      if (bl1 & bl2)
      {
        // 符合哥德巴赫猜想 输出等式
        printf("%d = %d+ %d\n", intNum, i, intNum - i);
        blFlag = 1;
      }
    }
  }
  return blFlag;                //返回bool型变量
}
int primeJudge(int n)
{
  int i;
  for (i = 3; i <= n / 2; i += 2)
  {
    if (n % i == 0)
      return 0;
  }
  return 1;
}

然后在main()函数中只调用func18()函数,其调试结果如下


b037e4f84f3346279ffc6e45dfc3f645.png

3.9、C语言经典实例19-学生成绩输出


在Main.h头文件中先定义两个结构体:学生成绩信息表、学生表,然后在声明一个func19和getMember函数,然后再Main.c源文件中定义func19和getMember函数,并实现相关的功能。


Main.h头文件添加的代码如下

// 实例19:学生成绩输出
void func19();
#define STUNEM 5;
// 定义一个学生的成绩表
typedef struct _tagMember
{
    char number[8];         // 学号
    char name[16];          // 名字
    int math;               // 数学分数
    int chinese;            // 语文分数
    int english;            // 英语分数
    int sum;                // 总分
} Member, *pMember;
// 定义学生表
typedef struct _tagTable
{
    pMember men;            // 学生数据指针
    int num;                // 学生数量
} Table, *pTable;           // 获取学生表中的学生指针
pMember getMember(pTable table, int n);


Main.c源文件添加的代码如下

// 实例19:学生成绩输出
void func19()
{
  pTable table = (pTable)malloc(sizeof(Table));
  char i;
  pMember p;
  printf("请输入5个学生的学号、姓名、3门课成绩:\r\n");
  table->num = STUNEM;
  table->men = (pMember)malloc(sizeof(Member) * table->num);
  for (i = 1; i <= table->num; i++)
  {
    p = getMember(table, i);
    scanf_s("%s %s %d %d %d", &p->number, sizeof(p->number), &p->name, sizeof(p->name),
      &p->math, &p->chinese, &p->english);
    p->sum = p->math + p->chinese + p->english;
  }
  printf("-----------------------------------------------成绩表------------------------------------------------\r\n");
  printf("学号\t姓名\t数学\t语文\t英语\t总分\r\n");
  for (i = 1; i <= table->num; i++)
  {
    p = getMember(table, i);
    printf("%s\t%s\t%d\t%d\t%d\t%d\r\n", p->number, p->name, p->math, p->chinese, p->english, p->sum);
  }
  free(table->men);
}
pMember getMember(pTable table, int n)
{
  if (n <= table->num && n > 0)
    return table->men + n - 1;
  else
    return 0;
}

然后在main()函数中只调用func19()函数,其调试结果如下


4e30493b3c834d55a76d20aee562d4fd.png

3.10、C语言经典实例20-重组数组


在Main.h头文件中声明一个func10函数,然后再Main.c源文件中定义func10函数,并实现相关的功能。

Main.h头文件添加的代码如下


// 实例20:重组数组
void func20();
#define MAX 26
#define START 2
int sort_intfun(const void* a, const void* b);

Main.c源文件添加的代码如下


// 实例20:重组数组
void func20()
{
  int i;
  int array[20];
  srand((unsigned)time(NULL));    // 随机数播种函数
  for (i = 0; i < 20; i++)      // 产生十个随机数
    array[i] = rand() % START;    // 设定随机数范围并输出
  for (i = 0; i < 20; i++)      // 产生十个随机数
  {
    if (array[i] == 0)
      array[i] = 65 + rand() % MAX;
    else
      array[i] = 97 + rand() % MAX;
  }
  printf("产生十个随机数是:");
  for (i = 0; i < 20; i++)
    printf("%d ", array[i]);
  printf("\n");
  qsort((void*)array, 20, sizeof(array[0]), sort_intfun);
  printf("\n用qsort重组数组后的数据是:");
  for (i = 0; i < 20; i++)
    printf("%d ", array[i]);
  printf("\n");
}
int sort_intfun(const void* a, const void* b)
{
  return *(int*)a - *(int*)b;
}


然后在main()函数中只调用func20()函数,其调试结果如下


6356b283c5b34b0ba53f1dba3328a686.png


b04e6c1e58d24e0bad16933b61194fc3.jpg

相关文章
|
1月前
|
存储 算法 安全
【C语言程序设计——选择结构程序设计】按从小到大排序三个数(头歌实践教学平台习题)【合集】
本任务要求从键盘输入三个数,并按从小到大的顺序排序后输出。主要内容包括: - **任务描述**:实现三个数的排序并输出。 - **编程要求**:根据提示在编辑器中补充代码。 - **相关知识**: - 选择结构(if、if-else、switch) - 主要语句类型(条件语句) - 比较操作与交换操作 - **测试说明**:提供两组测试数据及预期输出。 - **通关代码**:完整代码示例。 - **测试结果**:展示测试通过的结果。 通过本任务,你将掌握基本的选择结构和排序算法的应用。祝你成功!
36 4
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
63 23
|
2月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
196 14
|
2月前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
208 10
|
3月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
3月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
276 13
|
3月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
111 11
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
37 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
20 2
|
1月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
66 16

热门文章

最新文章