VS编程器要使用scanf时要使用一句话才能正常使用(使用scanf_s哪怕不使用这句话也不会出现报错)
#define _CRT_SECURE_NO_WARNINGS 1
使用qsort进行对字符串和数字的排序
qsort为<string.h>文件里的排序文件格式为qsort(指向排列数组的第一个元素的指针,排列数组中有多少元素,一个元素的占位大小,int(*自定义函数)(const void*,const void*)),默认是升序排列
分析:1.数字排序:先将数字放入数组里,用sqort函数进行排列
#include<stdio.h>
#include<string.h>
int shan(const void* m, const void* n) {
if (*(int*)m > *(int*)n) return 1;
else if (*(int*)m < *(int*)n) return -1;
else return 0;
//这里使用的知识是强制类型转化将void型转化为int整型
}
int main()
{
int arr[] = { 0,2,5,4,7,8,6,3,1,9,6,2,5,34 };
//可以填任何数字
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz,sizeof(arr[0]), shan);
for (int i = 0; i <= sz-1; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
注意:这里提醒i<=sz-1不能写成i<=sz因为数组序号是从0开始命名的,如果输出的数据超过数组的大小则会判断成数组越界,-858993460为一个整数值(当数组越界时打印的值是随机出现的)
2.字符串排序:相比来数字排序来说会麻烦一点 ,需要创建一个新函数里面存放你所要使用的东西(当然这是当你要使用多种类型的数据时才创建,如果只是使用一种类型的数据完全没有必要创建新函数)把字符串放入数组中,接下来的操作与整形比较是相等的。
#include<stdio.h>
#include<string.h>
struct renwu
{
char name[20];
};
//首先要设置一个新函数里面存放字符串
int paixu(const void* m, const void* n)
{
return strcmp(((struct renwu*)m)->name, ((struct renwu*)n)->name);
//提示;->和.的含义是一样的都可以取出新函数中所对应的数据
//其中struct renwu*指的是强制转化成我所创建新函数中所对应的类型
}
int main()
{
struct renwu arr[] = { {"zhangsan"},{"lisi"},{"wangwu"} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), paixu);
for (int i = 0; i < sz; i++)
{
printf("%s ", arr[i].name);
//注意:不能使用%d,因为你要打印的是字符串而不是整形
//这里数组后面也需要
}
return 0;
}
注意:这里是使用了创建新函数,并用->和.来引用函数中的数据才会显得比较复杂,实际上的代码长度是与整形比较大致相等的。
得出两个数字的最大公约数
输入两个数字进行循环判断出最大公约数
分析:可以使用while循环进行判断,因为它相当于是三个值不断的进行相除,直到除尽(本题的关键是要懂得欧几里得计算的原理)
#include <stdio.h>
int main() {
int num1, num2, temp, gcd;
// 输入两个整数
printf("请输入两个整数: ");
scanf("%d %d", &num1, &num2);
// 使用欧几里得算法计算最大公约数
while (num2 != 0) {
temp = num2;
num2 = num1 % num2;
num1 = temp;
}
// 此时num1即为最大公约数
gcd = num1;
// 打印结果
printf("最大公约数是: %d\n", gcd);
return 0;
}