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

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

0、前言

学习C语言最好的方式是练习C语言的经典实例,小编带领大家,通过本文的“C语言经典实例:11-20例“的手把手教会你使用VS2019创建C语言项目、一步一步编写C语的过程,最后达到我们学习C语言各种知识点的目的:C语言基础、C语言for、while循环的运用、相同类型的多变量采用数组存放,指针的运用、malloc函数为指针开辟内存的运用、混乱类型的数据类型:结构体的运行、结构体指针的运用等。

1、程序的编写工具

本C语言的实例:11-20例程序,使用Visual Studio 2019软件进行编写。

2、项目的创建

1、在“C语言经典实例:1-10例”中创建的“C语言经典实例”的空白解决方案中新建一个名为“C语言经典实例11-20”的C语言项目。
2、将C语言经典实例11-20项目设置为启动项目
如下所示
在这里插入图片描述

2、新建一个Main.h头文件和Main.c源文件。
工程项目和文件如下所示。
在这里插入图片描述

3、C语言经典实例11-20编写的过程

3.1、C语言经典实例11-求二维数组最大最小值

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

#ifndef MAIN_H
#define MAIN_H

//包含相应的系统头文件
#include <stdio.h>
#include <stdlib.h>

#define MAXN 20
int a[MAXN][MAXN];

// 函数的声明
// 实例11:求二维数组最大最小值
void func11();

#endif

Main.c源文件中的代码如下

#include "Main.h"

int main()
{
    
    
	system("color 3E");

	// 实例11:求二维数组最大最小值
	func11();

	system("pause");
	return 0;
}

// 实例11:求二维数组最大最小值
void func11()
{
    
    
    int min, max;
    int row, col, n;

    /* 输入方阵的阶次 */
    printf("Please input the order of the matrix:\n");
    scanf_s("%d", &n);

    printf("Please input the elements of the matrix,\n from a[0][0] to a[%d][%d]:\n", n - 1, n - 1);
    for (row = 0; row < n; row++)
    {
    
    
        for (col = 0; col < n; col++)
        {
    
    
            scanf_s("%d", &a[row][col]);
        }
    }

    for (min = a[0][0], row = 0; row < n; row++)
    {
    
    
        for (max = a[row][0], col = 1; col < n; col++) /*从 row 行选出大数 */
        {
    
    
            if (max < a[row][col])
            {
    
    
                max = a[row][col];
            }      
        }
               
        /* 保存至 row 行的小数 */
        if (min > max)
        {
    
    
            min = max;
        }
    }
    printf("The minimum of maximum number is %d\n", min);
    for (max = a[0][0], row = 0; row < n; row++)
    {
    
    
        /* 从 row 行选出小数 */
        for (min = a[row][0], col = 1; col < n; col++)
        {
    
    
            if (min > a[row][col])
            {
    
    
                min = a[row][col];
            }
        }
            
        /*保存至 row 行的大数 */
        if (max < min)
        {
    
    
            max = min;
        }
    }

    printf("The maximum of minimum numbers is %d\n", max);
}

调试结果如下
在这里插入图片描述

3.2、C语言经典实例12-数组求素数

在Main.h头文件中声明一个func12函数和primeJudge函数,然后再Main.c源文件中定义func12函数和rimeJudge函数,并实现相关的功能。
Main.h头文件添加的代码如下

// 实例12:数组求素数
void func12();
int primeJudge(int n);

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

// 实例12:数组求素数
void func12()
{
    
    
	int s = 0;
	int a[100], b[100] = {
    
     0 };
	int primeIndex = 0;

	for (int i = 1750, j = 0; j < 100; i++, j++)
	{
    
    
		a[j] = i;
	}

	for (int i = 0; i < 100; i++)
	{
    
    
		if (primeJudge(a[i]))
		{
    
    
			b[primeIndex] = a[i];
			s += a[i];
			primeIndex++;
		}
	}

	printf("1750到1850之间的素数有\n");
	for (int i = 0; i < primeIndex; i++)
	{
    
    
		printf("%d\t", b[i]);
	}
	printf("\n1750到1850之间的素数和为:%d\n", s);
}

int primeJudge(int n)
{
    
    
	int i;
	for (i = 3; i <= n / 2; i += 2)
	{
    
    
		if (n % i == 0)
			return 0;
	}
	return 1;
}

然后在main()函数中只调用func12()函数,如下所示

int main()
{
    
    
	system("color 3E");					// 改变控制台输出的颜色

	// 实例1:两个实数比较大小
	//func1();

	// 实例2:字符输出
	func2();

	system("pause");					// 使程序暂停
	return 0;							// 程序返回
}

其调试结果如下
在这里插入图片描述

3.3、C语言经典实例13-编制万年历

在Main.h头文件中声明一个func13函数和judgeLeapYear函数,然后再Main.c源文件中定义func13函数和judgeLeapYear函数,并实现相关的功能。
Main.h头文件添加的代码如下

// 实例13:编制万年历
void func13();
// 闰年判断
int judgeLeapYear(int y);

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

// 实例13:编制万年历
void func13()
{
    
    
	int y;
	int i, j, sum = 0;
	int begin, week;
	int days[12] = {
    
     31,28,31,30,31,30,31,31,30,31,30,31 };
	
	printf("请输入年份:");
	scanf_s("%d", &y);

	for (i = 1; i < y; i++)
		sum += judgeLeapYear(i);
	
	week = (sum + 1) % 7;		//表示该年1月1日为星期几	
	if (judgeLeapYear(y) == 366)
		days[1] = 29;
	
	printf("\n%d年日历如下:\n\n", y);
	for (i = 0; i < 12; i++)
	{
    
    
		printf("       %d月          \n", i + 1);
		printf("  7  1  2  3  4  5  6\n");
		printf("=====================\n");
		begin = 1;
		for (j = 0; j < week; j++)
			printf("   ");
		while (begin <= days[i])
		{
    
    
			printf("%3d", begin);
			begin++;
			week = (week + 1) % 7;
			if (week % 7 == 0)
				printf("\n");
		}
		printf("\n\n");
	}
}

// 闰年判断
int judgeLeapYear(int y)
{
    
    
	if ((y % 4 == 0) && (y % 100 != 0) || y % 400 == 0)
		return 366;
	else
		return 365;
}

然后在main()函数中只调用func13()函数,其调试结果如下
在这里插入图片描述

3.4、C语言经典实例14-数组元素排序

在Main.h头文件中声明一个func14函数,然后再Main.c源文件中定义func14函数,并实现相关的功能。
Main.h头文件添加的代码如下

// 实例14:数组元素排序
void func14();

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

// 实例4:自增自减运算
// 实例14:数组元素排序
void func14()
{
    
    
	int a[10] = {
    
     10,2,3,4,5,6,9,18,7,12 };

	int i, j, t;

	printf("原数组为: ");
	for (i = 0; i < 10; i++)
	{
    
    
		printf("%d ", a[i]);
	}

	for (j = 0; j < 10; j++)
	{
    
    
		for (i = 0; i < 9 - j; i++)
		{
    
    
			if (a[i] > a[i + 1])
			{
    
    
				t = a[i];
				a[i] = a[i + 1];
				a[i + 1] = t;
			}
		}
	}

	printf("\n排序的数组为: ");
	for (i = 0; i < 10; i++)
	{
    
    
		printf("%d ", a[i]);
	}
	printf("\n");
}

然后在main()函数中只调用func4()函数,其调试结果如下
在这里插入图片描述

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()函数,其调试结果如下
在这里插入图片描述

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()函数,其调试结果如下
在这里插入图片描述

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()函数,其调试结果如下
在这里插入图片描述

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()函数,其调试结果如下
在这里插入图片描述

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()函数,其调试结果如下
在这里插入图片描述

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()函数,其调试结果如下
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_47419053/article/details/125799312
今日推荐