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()函数,其调试结果如下