美文网首页C语言
21-C语言程序源码

21-C语言程序源码

作者: Andy_Livings | 来源:发表于2020-06-10 17:38 被阅读0次
    • 这里是C语言程序的一些实现源码,希望可以对您的编程有一些帮助。
    • 由于内容比较多,就不一一划分了,需要的朋友可以根据下面的.h文件和程序里面的注释慢慢查找自己需要的部分内容。

    01-.h文件

    #include <stdio.h>
    
    /// 打印输出*_01
    void high_quality_print_star_01(int n);
    
    /// 打印输出*_02
    void high_quality_print_star_02(int n);
    
    /// 基本库函数的使用
    void high_quality_uses_of_basic_library_functions(void);
    
    /// 质数_01
    void high_quality_prime_numbers_01(int num);
    
    /// 质数_02
    void high_quality_prime_numbers_02(int num);
    
    /// 质数_03
    void high_quality_prime_numbers_03(void);
    
    /// 输入一个整数,判断它是几位数
    void high_quality_determine_digits(void);
    
    /// 猜数赢大奖
    void high_quality_guess_number(void);
    
    /// 下一秒
    void high_quality_next_second(void);
    
    /// 字符排序
    void high_quality_sorted_character(void);
    
    /// 水仙花数
    void high_quality_daffodi_number(void);
    
    /// 输入输出区间数
    void high_quality_inout_interval_number(void);
    
    /// 计算字符个数
    void high_quality_calculate_number_characters(void);
    
    /// 求最大公约数_01
    void high_quality_greatest_common_divisor_01(void);
    
    /// 求最大公约数_02
    void high_quality_greatest_common_divisor_02(void);
    
    /// 求最小公倍数
    void high_quality_least_common_multiple(void);
    
    /// 分解质因数
    void high_quality_prime_factors(void);
    
    /// 求回文数
    void high_quality_palindrome(void);
    
    /// 输入学生年龄,求平均年龄和年龄总和
    void high_quality_average_age(void);
    
    /// 学生成绩的查找
    void high_quality_student_achievement_to_find(void);
    
    /// 数组元素的输入与输出
    void high_quality_in_output_array_elements(void);
    
    /// 逆序输出数组元素
    void high_quality_reverse_output_array_elements(void);
    
    /// 字符输入输出处理
    void high_quality_character_input_or_output_processing(void);
    
    /// 大小写字符统计
    void high_quality_case_character_statistics(void);
    
    /// 数组的最值与下标_01
    void high_quality_most_value_and_subscript_arrays_01(void);
    
    /// 数组的最值与下标_02
    void high_quality_most_value_and_subscript_arrays_02(void);
    
    /// 数组排序_01
    void high_quality_sort_array_01(void);
    
    /// 数组排序_02
    void high_quality_sort_array_02(void);
    
    /// 输入任意多数求最值
    void high_quality_enter_any_most_get_most_value(void);
    
    /// 输入一个数逆序
    void high_quality_enter_number_reverse_order(void);
    
    /// F1加F2问题
    void high_quality_f1_f2_problem(void);
    
    /// 二维数组的输出与最值
    void high_quality_output_dimensional_array_and_most_value(void);
    
    /// 递归函数
    int high_quality_f(int n);
    
    /// 选择排序
    void high_quality_selection_sort(void);
    
    /// 冒泡排序
    void high_quality_bubble_sort(void);
    
    /// 输入指定元素个数求最值
    void high_quality_most_value_input_number_elements(void);
    
    /// 字符逆序输出_01
    void high_quality_reverse_output_characters_01(void);
    
    /// 字符逆序输出_02
    void high_quality_reverse_output_characters_02(void);
    
    /// 函数实现排序
    void high_quality_sort_array_fuction(void);
    
    /// 从终端输入字符串进行拷贝_01
    void high_quality_input_string_to_copy_from_terminal_01(void);
    
    /// 从终端输入字符串进行拷贝_02
    void high_quality_input_string_to_copy_from_terminal_02(void);
    
    /// 查找字串_01
    void high_quality_find_string_01(void);
    
    /// 查找字串_02
    void high_quality_find_string_02(void);
    
    /// 账号密码登录
    void high_quality_login_with_account_and_password(void);
    
    /// 字符串链接
    void high_quality_string_link(void);
    
    /// 求字符串长度
    int high_quality_string_length(char *p);
    
    /// 字符串拷贝
    void high_quality_string_copy(void);
    
    /// 字符串比较
    void high_quality_string_comparison(void);
    

    02-.c文件

    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    void high_quality_print_line(void) {
        
        printf("------------------------------\n");
    }
    
    #pragma mark --- 打印输出*_01
    void high_quality_print_star_01(int n) {
        
        int i, j;
        for (i = 0; i < n; i++) {
            for (j = 0; j < i; j++) {
                printf(" ");
            }
            
            for (j = 0; j < n - i; j++) {
                printf("*");
            }
            printf("\n");
        }
    }
    
    #pragma mark --- 打印输出*_02
    void high_quality_print_star_02(int n) {
        
        int i, j;
        for (i = 0; i < n; i++) {
            for (j = 0; j < (n - 1) - i; j++) {
                printf(" ");
            }
            
            for (j = 0; j <= i; j++) {
                printf("*");
            }
            printf("\n");
        }
    }
    
    #pragma mark --- 基本库函数的使用
    void high_quality_uses_of_basic_library_functions(void) {
        
        int a = -5;
        printf("a:%d\n",abs(a));
        
        int student = arc4random()%50 + 1;
        printf("student:%i\n",student);
        
        double di = 12.0,zhi = 2;
        double pf = pow(di, zhi);
        printf("pf:%f\n",pf);
        
        double value = 144.0;
        double gen = sqrt(value);
        printf("gen:%f\n",gen);
    }
    
    #pragma mark --- 质数_01
    void high_quality_prime_numbers_01(int num) {
        
        int i = 2, j;
        while(i <= num) {
            j = 2;  //每次初始为2
            while(j < i) {
                if(i % j == 0) {
                    break;
                }
                j++;
            }
            if(i == j) {
                printf("%d是质数\n",i);
            }
            i++;
        }
    }
    
    #pragma mark --- 质数_02
    void high_quality_prime_numbers_02(int num) {
        
        int i, j;
        for(i = 2; i <= num; i++) {
            for(j = 2; j < i; j++) { // 第2个循环,判断2到100的数从2开始整除,看能否找到公约数
                if(i % j == 0) { // 如果是找到了除1和本身外的其他公约数,直接退出
                    break;
                }
            }
            
            if(i == j) { // 如果找到的公约数只有自己
                printf("%d是质数\n",i);
            }
        }
    }
    
    #pragma mark --- 质数_03
    void high_quality_prime_numbers_03(void) {
        
        int m, n, i, j;
        printf("请输入一个范围,m到n: \n");
        scanf("%d%d",&m,&n);
        high_quality_print_line();
        for(i = m; i <= n; i++) {
            for(j = 2; j < i; j++) {
                if( i% j == 0) {  // 找到公约数,不是质数
                    break;
                }
            }
            if(i == j) { // 第2个循环一直到最后都没找到公约数,也就是没有进入到break,那么是质数
                printf("%d是质数\n", i);
            }
        }
    }
    
    #pragma mark --- 输入一个整数,判断它是几位数
    void high_quality_determine_digits(void) {
        
        int n, index = 0;
        printf("请输入一个整数:\n");
        scanf("%d",&n);
        high_quality_print_line();
        while(n > 0) {
            index++;  // 判断位数
            n /= 10;  // 判断位数后数据少一位
        }
        printf("位数是%d\n",index);
    }
    
    #pragma mark --- 猜数赢大奖
    void high_quality_guess_number(void) {
        
        int daan = arc4random() % 1000 + 1;
        int num, max = 1000, min = 1;
        
        do {
            printf("请输入一个(%d~%d)的中奖号码:", min, max);
            scanf("%d",&num);
            
            if(num > max || num < min) { // 如果你输入的数不在系统设置的范围,重新输入
                printf("你短路啦\n");
                continue;  // 跳出当次循环,不影响下一次循环的执行
            }
            
            if(num > daan) {
                max = num;
                printf("大了\n");
            } else if(num < daan) {
                min = num;
                printf("小了\n");
            }
        } while(num != daan);
        printf("恭喜你,中大奖,记得请吃饭喔!\n");
    }
    
    #pragma mark --- 下一秒
    void high_quality_next_second(void) {
        
        int h, m, s;
        printf("请输入时、分、秒(输入样式为10:55:12):\n");
        scanf("%d:%d:%d", &h, &m, &s);
        high_quality_print_line();
        
        if (h > 24 || m > 60 || s > 60) {
            
            printf("请输入正确的时间\n");
            return;
        }
        
        s++;   // 先求秒+1
        if(s == 60)  // 如果秒钟正好为60
        {
            s = 0;       // 秒钟附值为0
            m += 1;    // 分钟要加1
            if(m == 60)  // 判断如果分钟为60
            {
                m = 0;    // 分钟附值为0
                h++;    // 小时+1
                if(h == 24)   // 如果小时=24
                {
                    h = 0;    // 回到凌晨
                }
            }
        }
        printf("下一秒为: %02d:%02d:%02d\n", h, m, s);
    }
    
    #pragma mark --- 字符排序
    void high_quality_sorted_character(void) {
        
        int i, j, num;
        char ch;
        
        printf("请输入一个范围在1~26内的整数:\n");
        scanf("%d",&num);
        high_quality_print_line();
        if (num > 26) {
            printf("请重新输入\n");
            return;
        }
        
        for(i = 0; i < num; i++) {
            ch = 'A';   // 注意这行必须放在这里,用于,打印行时,每次从A开始
            for(j = 0;j <= i; j++) {
                printf("%c",ch++);
            }
            printf("\n");
        }
    }
    
    #pragma mark --- 水仙花数
    void high_quality_daffodi_number(void) {
        
        int i, bai, shi, ge, sum;
        
        for(i = 100; i <= 999; i++) {
            
            bai = i / 100;  // 求出百位数
            shi = i / 10 % 10;   // 求出十位数
            ge  = i % 10;    // 求出个位数
            
            sum = bai*bai*bai + shi*shi*shi + ge*ge*ge;
            
            if(sum == i) {
                printf("%d是水仙花数\n",i);
            }
        }
    }
    
    #pragma mark --- 输入输出区间数
    void high_quality_inout_interval_number(void) {
        
        int num1, num2, i;
        
        printf("请输入两个整数:\n");
        scanf("%d%d",&num1,&num2);
        high_quality_print_line();
        
        int max = num1 > num2 ? num1 : num2;
        int min = num1 < num2 ? num1 : num2;
        
        for(i = min; i <= max; i++) {
            printf("%d ",i);
        }
        printf("\n");
    }
    
    #pragma mark --- 计算字符个数
    void high_quality_calculate_number_characters(void) {
        
        char ch;
        int zimu = 0, num = 0, spc = 0, other = 0;
        
        printf("请输入一系列字符:\n");
        
        while(1) {
            
            scanf("%c", &ch);
            
            if(ch == '\n') {
                break;
            } else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
                zimu++;
            } else if (ch >= '0' && ch <= '9') {
                num++;
            } else if (ch == ' ') {
                spc++;
            } else {
                other++;
            }
        }
        
        printf("字母个数:%d,数字个数:%d,空格个数:%d,其他个数:%d\n", zimu, num, spc, other);
    }
    
    #pragma mark --- 求最大公约数_01
    void high_quality_greatest_common_divisor_01(void) {
        
        int num1, num2;
        printf("请输入两个整数:\n");
        
        scanf("%d%d", &num1, &num2);
        int max = num1 > num2 ? num1 : num2; // 条件运算符,关键在于找关系
        int min = num1 < num2 ? num1 : num2;
        
        int i;  // 假设我输入的两个数min=30, max=60
        for(i = min; i >= 2; i--) // 从min开始,也就是最大公约数的最大取值为min
        {
            if(min % i == 0 && max % i == 0) // 假设max能整除,min也能整除,则这个值就是最大公约数
            {
                break;
            }
        }
        printf("最大公约数为:%d\n",i);
    }
    
    #pragma mark --- 求最大公约数_02
    void high_quality_greatest_common_divisor_02(void) {
        
        int num1, num2, gongyue = 1;
        printf("请输入两个整数:\n");
        scanf("%d%d", &num1, &num2);
        int i;
        
        for(i = 2; i <= (num1 < num2 ? num1 : num2); i++) // 条件表达式放入关系判断中,目的就是一直变
        {
            if(num1 % i == 0 && num2 % i == 0) // 假设找到一个公约数,进入判断语句中
            {
                gongyue *= i;  // 找到后,公约数提取
                num1 /= i;     // 提取后去除该公约数,
                num2 /= i;     // 提取后去除该公约数
                i--;           // 目的是从当前数开始,继续去循环查找公约数
            }
        }
        printf("最大公约数为:%d\n",gongyue);
    }
    
    #pragma mark --- 求最小公倍数
    void high_quality_least_common_multiple(void) {
        
        int num1, num2, i, gongbei = 0;
        printf("请输入两个整数:\n");
        scanf("%d%d", &num1, &num2);
        int max = num1 > num2 ? num1 : num2;
        int min = num1 < num2 ? num1 : num2;
        
        for(i = max; i <= min * max; i++) // 从最大值开始一直到两数的乘积,这个范围就是最小公倍数的范围
        {
            if(i % max == 0 && i % min == 0) // 如果能够找到一个能整除两个数的数,则为最小公倍数
            {
                gongbei = i;   // 取到最小公倍数,退出
                break;
            }
        }
        printf("最小公倍数为%d\n",gongbei);
    }
    
    #pragma mark --- 分解质因数
    void high_quality_prime_factors(void) {
        
        int num;
        printf("请输入一个整数:\n");
        scanf("%d", &num);
        int i;
        high_quality_print_line();
        printf("%d = ", num);
        
        for(i = 2; i < num; i++)  // 假设num=6
        {
            if(num % i == 0) // 6%2,成立,那么说明2为6的质因数
            {
                printf("%d * ", i);
                num /= i;   // 6/2==3,找到一个质因数,然后除去质因数,继续找
                i--;  // 找到一个质因数后,还是从当前数开始找质因数,而不是从下一次开始找
            }
        }
        printf("%d\n", i); // 打印最后一个质因数
    }
    
    #pragma mark --- 求回文数
    void high_quality_palindrome(void) {
        
        int i, ge, shi, qian, wan;
        
        for(i = 10000; i <= 99999; i++) {
            
            ge = i % 10;  // 12345%10  = 5
            shi = i % 100 / 10;  // 12345%100 = 45/10 = 4
            qian = i / 1000 % 10;  // 12345/1000 = 12%10 = 2
            wan = i / 10000;    // 12345/10000 = 1
            if(ge == wan && shi == qian) {
                printf("%d是回文数\n",i);
            }
        }
    }
    
    #pragma mark --- 输入学生年龄,求平均年龄和年龄总和
    void high_quality_average_age(void) {
        
        int a[5], sum = 0;
        float avg;
        printf("请输入5个学生的年龄信息:\n");
        int i;
        
        for(i = 0; i < 5; i++) {
            scanf("%d",&a[i]);
        }
        high_quality_print_line();
        
        for(i = 0; i < 5; i++) {
            printf("%d ", a[i]);  // 循环打印数组元素
            sum += a[i];
        }
        avg = (float)sum/5;  // 记住:(float)(sum/5)则是整体取整再强转
        printf("\nsum = %d\navg = %g\n", sum, avg);   // 求和与求平均值
    }
    
    #pragma mark --- 学生成绩的查找
    void high_quality_student_achievement_to_find(void) {
        
        int score[6] = {98, 67, 82, 60, 68, 77};
        int i, num, flag = -1;  // flog=-1为一个标记
        
        for(i = 0; i < 6; i++) {
            printf("%d ",score[i]);
        }
        
        printf("\n请输入一个数:\n");
        scanf("%d",&num);
        
        for(i = 0; i < 6; i++) {
            if(num == score[i])  // 判断有没有找到匹配的成绩
            {
                flag = i;   // 找到了,进行标记
                break;
            }
        }
        
        if(flag == -1)  // 如果这个标记值没有被改变
        {
            printf("没有找到学生的成绩\n");
        } else {
            printf("第%d名学生的成绩为:%d\n", flag+1, num);
        }
    }
    
    #pragma mark --- 数组元素的输入与输出
    void high_quality_in_output_array_elements(void) {
        
        int a[10] = {};
        int i = 0, len = 0;
        printf("请输入10个以内的数组元素:\n");
        
        for(i = 0; i < 10; i++) {
            scanf("%d", &a[i]);
            len++;
            if(getchar() == '\n')  // 获取字符,如果为回车,跳出循环
            {
                break;
            }
        }
        high_quality_print_line();
        
        for(i = 0; i < len; i++) {
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    
    #pragma mark --- 逆序输出数组元素
    void high_quality_reverse_output_array_elements(void) {
        
        int a[10] = {};
        int i, len = 0, t;
        printf("请输入10个内的不定长元素:\n");
        
        for(i = 0; i < 10; i++) // 第一个for求不定长
        {
            scanf("%d", &a[i]);
            len++;
            if(getchar() == '\n')  // getchar()为获取字符的函数
            {
                break;
            }
        }
        
        //逆序,交换元素
        for(i = 0; i < len / 2; i++)  // 交换一半次数,否则还原了
        {
            t = a[i];      // 数组的首位元素交换
            a[i] = a[len - i - 1];
            a[len - i - 1] = t;
        }
        
        printf("逆序后:");
        for(i = 0; i < len; i++) {
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    
    #pragma mark --- 字符输入输出处理
    void high_quality_character_input_or_output_processing(void) {
        
        char a[30] = {};
        printf("请输入一系列字符:\n");
        int i, len = 0;
        
        for(i = 0; i < 30; i++) {
            scanf("%c", &a[i]);
            
            if(a[i] == '\n')  // 一个一个字符输出,若判断为‘\n’则退出
            {
                break;
            }
            len++;   // 获取到不定长度
        }
        
        for(i = 0; i < len; i++)  // 在不定长数组中遍历元素
        {
            if(a[i] >= 'A' && a[i] <= 'Z') {
                a[i] += 32;   // 大写转小写
            }
            printf("%c",a[i]);
        }
        printf("\n");
    }
    
    #pragma mark --- 大小写字符统计
    void high_quality_case_character_statistics(void) {
        
        char a[30] = {};
        printf("请输入一系列字符(30个字符以内):\n");
        int i, small = 0, big = 0;
        
        for(i = 0; i < 30; i++) {
            scanf("%c", &a[i]);
            if(a[i] == '\n')  // 一个一个字符输出,若判断为‘\n’则退出
            {
                break;
            } else if (a[i] >= 'a' && a[i] <= 'z') {
                small++;
            } else if (a[i] >= 'A' && a[i] <='Z') {
                big++;
            }
        }
        printf("大写字母:%d个,小写字母:%d个\n",big,small);
    }
    
    #pragma mark --- 数组的最值与下标_01
    void high_quality_most_value_and_subscript_arrays_01(void) {
        
        int a[] = {50, 70, 80, 49, 55, 111, 23, 34, 90};
        int len = sizeof(a) / sizeof(int); // 习惯使用求长度的方法
        int i, index = 0;   // 假设最大值元素的下标是0
        int max = a[0];  // 假设第一个元素就是最大值
        
        for(i = 0; i < len; i++) {
            printf("%d ", a[i]);
            if(max < a[i])  // 遍历数组,然后判断最大值,如果比指定最大值大
            {
                index = i;  // 记录最大值的下标
                max = a[i];  // 把最大值附值给指定的max
            }
        }
        printf("\n最大值为%d,下标为%d\n", max, index);
    }
    
    #pragma mark --- 数组的最值与下标_02
    void high_quality_most_value_and_subscript_arrays_02(void) {
        
        int a[6] = {};
        int len = sizeof(a) / sizeof(int);
        printf("请输入6个整数:\n");
        int i;
        
        for(i = 0; i < len; i++) {
            scanf("%d", &a[i]);
        }
        high_quality_print_line();
        
        int min = a[0];
        int index = 0;
        for(i = 1; i < len; i++) {
            if(min > a[i]) {
                min = a[i];
                index = i;
            }
        }
        printf("最小值为:%d,下标为:%d\n", min, index);
    }
    
    #pragma mark --- 数组排序_01
    void high_quality_sort_array_01(void) {
        
        int a[] = {67, 90, 78, 80, 89, 98};
        int i, j, min, index, t;
        
        int len = sizeof(a) / sizeof(int); // 求元素个数
        
        for(i = 0; i < len - 1; i++)  // 循环比较次数
        {
            min = a[i];  // 第一次假设第1个值为最小,依此类推
            index = i;   // 第一次假设下标0为最小,依此类推
            for(j = i + 1; j < len; j++) // 第一次比较时,与第二个位置值开始比较,一直比较到后面
            {
                if(min > a[j])  // 判断有比假设的值最小,把该元素设置为最小值
                {
                    min = a[j];   // 最小值附值给min,
                    index = j;   // 记录最小下标值
                }
            }
            t = a[i];          // 交换假设最小元素值与找到的最小元素值
            a[i] = a[index];
            a[index] = t;
        }
        for(i = 0; i < len; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    
    #pragma mark --- #pragma mark --- 数组排序_02
    void high_quality_sort_array_02(void) {
        
        int a[] = {98, 90, 67, 78, 80, 89};
        int len = sizeof(a) / sizeof(int);
        int i, j, t;
        
        for(i = 0; i < len - 1; i++)  // 比较len-1次
        {
            for(j = 0; j < len - i - 1; j++) // len-i-1,如果不-1的话,会溢出
            {
                if(a[j] > a[j + 1]) // 如果第一个元素与第二个元素大,交换,永远保证右边的大
                {
                    t = a[j];   // 交换比较后的第一个元素与第二个元素
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }
        
        for(i = 0; i < len; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    
    #pragma mark --- 输入任意多数求最值
    void high_quality_enter_any_most_get_most_value(void) {
        
        int max = 0, num;
        printf("请输入任意多数(输入0结束):\n");
        scanf("%d", &num);
        
        while(num != 0) {
            max = max > num ? max : num;   // 求最大值
            scanf("%d", &num);        // 循环输入
        }
        printf("最大值为:%d\n", max);
    }
    
    #pragma mark --- 输入一个数逆序
    void high_quality_enter_number_reverse_order(void) {
        
        int num;
        printf("请输入一个数:\n");
        scanf("%d", &num);
        
        while(num) {
            printf("%d", num % 10);   // 求出个位数
            num /= 10;       // 把十位数变位个位数,循环判断是否为0
        }
        printf("\n");
    }
    
    #pragma mark --- F1加F2问题
    void high_quality_f1_f2_problem(void) {
        
        int num, a = 1, b = 1, c = 0;
        
        printf("请输入一个数:\n");
        scanf("%d", &num);
        
        int i;
        
        for(i = 1; i <= num; i++) {
            if(i == 1 || i == 2) {
                printf("%d ",a);
            } else {
                c = a + b;   // 求出第三项值=第一项+第二项
                printf("%d ",c);
                a = b;    // 为循环做准备,当前第2项附给下一次的第1项
                b = c;    // 当前第3项,附给下一次的第2项
            }
        }
        printf("\n");
    }
    
    #pragma mark --- 二维数组的输出与最值
    void high_quality_output_dimensional_array_and_most_value(void) {
        
        int a[3][3] = {2, 5, 4, 3, 6, 4, 7};
        int i,j;
        
        for(i = 0; i < 3; i++) {
            for(j = 0; j < 3; j++) {
                printf("%d ", a[i][j]);
            }
            printf("\n");
        }
        
        int max = a[0][0];
        int row = 0;
        int col = 0;
        
        for(i = 0; i < 3; i++) {
            for(j = 0; j < 3; j++) {
                if(max < a[i][j]) {
                    max = a[i][j];
                    row = i;
                    col = j;
                }
            }
        }
        printf("\n最大值为:%d,该行下标为:%d,列下标为:%d\n", a[row][col], row, col);
    }
    
    #pragma mark --- 递归函数
    int high_quality_f(int n) {
        
        if(n == 1) {
            return 1;
        } else {
            return high_quality_f(n - 1) * n;
        }
    }
    
    #pragma mark --- 选择排序
    void high_quality_selection_sort(void) {
        
        char a[] = {'a', 's', 'd', 'f', 'g'};
        int len = sizeof(a) / sizeof(char);
        int min;
        int index;
        int i, j, t;
        
        for(i = 0; i < len - 1; i++)  // 判断len-1次
        {
            min = a[i];   // 第一次假设第一个元素为最小,依此类推
            index = i;    // 第一次假设下标值0为最小元素,依此类推
            for(j = i + 1; j < len; j++) // 每一次将最小值与后面的元素做比较
            {
                if(min > a[j])  // 如果遍历时,有元素比定义值还小,将该元素值附给min
                {
                    min = a[j];  // 将最小元素附给min
                    index = j;   // 记录最小值的下标
                }
            }
            t = a[i];          // 交换假设最小元素值与找到的最小下标值
            a[i] = a[index];
            a[index] = t;
        }
        
        for(i = 0; i < len; i++)
        {
            printf("%c ", a[i]);
        }
        printf("\n");
    }
    
    #pragma mark --- 冒泡排序
    void high_quality_bubble_sort(void) {
        
        //冒泡排序
        char a[] = {'a', 's', 'd', 'f', 'g'};
        int len = sizeof(a) / sizeof(char);
        int i, j, t;
        
        for(i = 0; i < len - 1; i++)  // 比较len-1次
        {
            for(j = 0; j < len - i - 1; j++)  // 记住:len-i-1,一定要-1,否则溢出
            {
                if(a[j] > a[j + 1])  // 最大值永远在右边,如果不在,交换
                {
                    t = a[j];    // 交换相邻两个数的值
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }
        
        for(i = 0; i < len; i++) {
            printf("%c ",a[i]);
        }
        printf("\n");
    }
    
    #pragma mark --- 输入指定元素个数求最值
    void high_quality_most_value_input_number_elements(void) {
        
        int a[10] = {};
        printf("请输入10个元素:\n");
        int i;
        
        for(i = 0; i < 10; i++) {
            scanf("%d", &a[i]);
        }
        high_quality_print_line();
        
        int max = a[0]; // 假设第一个元素为最大
        int index = 0;  // 假设最大值的下标是0
        for(i = 0; i < 10; i++) {
            if(max < a[i])   // 判断如果遍历数组元素能找到比max要大
            {
                max = a[i];   // 把最大值附给max
                index = i;    // 记录下标
            }
        }
        printf("数组的最大值为:%d,下标为:%d\n", max, index);
    }
    
    #pragma mark --- 字符逆序输出_01
    void high_quality_reverse_output_characters_01(void) {
        
        char a[10] = {};
        int len = sizeof(a) / sizeof(char);
        int i, t;
        printf("请输入10个字符,以空格隔开:\n");
        for(i = 0; i < len; i++)  //输入10个字符
        {
            scanf("%c", &a[i]);
            getchar();  //读取1个字符
        }
        high_quality_print_line();
        
        for(i = 0; i < len / 2; i++)  //交换元素
        {
            t = a[i];
            a[i] = a[len - i - 1];
            a[len - i - 1] = t;
        }
        
        for(i = 0; i < len; i++) {
            printf("%c ", a[i]);
        }
        printf("\n");
    }
    
    #pragma mark --- 字符逆序输出_02
    void high_quality_reverse(char *p, long len) {
        int i, t;
        for(i = 0; i < len / 2; i++)  // 通过指针指向数组实现逆序交换
        {
            t = p[i];  // 指针的逆序相当于是实参a的逆序
            p[i] = p[len - i - 1];
            p[len - i - 1] = t;
        }
    }
    
    void high_quality_printArr(char *p, long len) {
        
        int i;
        printf("逆序后:");
        for(i = 0; i < len; i++) {
            printf("%c", p[i]);
        }
        printf("\n");
    }
    void high_quality_reverse_output_characters_02(void) {
        
        char s[] = "zhang san li si";
        long len = strlen(s);
        
        printf("逆序前:%s\n", s);
        high_quality_print_line();
        
        high_quality_reverse(s, len);
        high_quality_printArr(s, len);
    }
    
    #pragma mark --- 函数实现排序
    void high_quality_sort_array(char p[], long len) {
        
        long i, j, t;
        
        for(i = 0; i < len - 1; i++) {
            for(j = 0; j < len - i - 1; j++) {
                if(p[j] > p[j + 1]) {
                    
                    t = p[j];
                    p[j] = p[j + 1];
                    p[j + 1] = t;
                }
            }
        }
    }
    
    void high_quality_print_array(char p[], long len) {
        
        long i;
        printf("排序后:");
        
        for(i = 0; i < len; i++) {
            printf("%c ", p[i]);
        }
        printf("\n");
    }
    
    void high_quality_sort_array_fuction(void) {
        
        char s[] = "fbacdz";
        long len = sizeof(s) / sizeof(char);
        
        printf("排序前:%s\n", s);
        high_quality_print_line();
        
        high_quality_sort_array(s, len);
        high_quality_print_array(s, len);
    }
    
    #pragma mark --- 从终端输入字符串进行拷贝_01
    void high_quality_input_string_to_copy_from_terminal_01(void) {
        
        char str1[30] = {};
        char str2[30] = {};
        printf("从终端输入字符串:\n");
        scanf("%[^\n]", str2);
        long len = strlen(str2);
        if (len > 30) {
            printf("不要超过30个字符\n");
            return;
        }
        high_quality_print_line();
        strcpy(str1, str2);  //带着‘\0’一起拷贝
        printf("copy后:%s\n", str1);
    }
    
    #pragma mark --- 从终端输入字符串进行拷贝_02
    void high_quality_input_string_to_copy_from_terminal_02(void) {
        
        char str1[50] = {};
        char str2[50] = {};
        int n;
        printf("请输入字符串:\n");
        scanf("%[^\n]", str2);
        long len = strlen(str2);
        if (len > 50) {
            printf("不要超过50个字符\n");
            return;
        }
        printf("请输入要拷贝的字符串个数:\n");
        scanf("%d", &n);
        high_quality_print_line();
        strncpy(str1, str2, n);  // 拷贝个数后面不加‘\0’
        str1[n] = '\0';     //最后一位手动‘\0’
        printf("%s\n", str1);
    }
    
    #pragma mark --- 查找字串_01
    void high_quality_find_string_01(void) {
        
        char a[] = "when i was young";
        char b[10];
        printf("%s\n请输入一个子串:\n", a);
        scanf("%s", b);
        // char *p = strstr(a, b);  // 在字符串中查找子串函数,区分大小写
        char *p = strcasestr(a, b);  // 在字符串中查找子串函数,不区分大小写
        if(p) {
            printf("%s\n", p);
        } else {
            printf("没找到\n");
        }
    }
    
    #pragma mark --- 查找字串_02
    void high_quality_find_string_02(void) {
        
        char a[] = "ababadabababc";
        char b[] = "aba";
        char *p = strstr(a, b);  // 查找子串,如果找到返回找到子串的地址
        int index = 0;
        while(p)  // 如果找到了,进入循环
        {
            index++;   // 记录找到次数
            p++;      // 找到一次后,字符串偏移一位
            p = strstr(p, b);  // 再在偏移后的字符串中找子串
        }
        printf("%s出现的次数为:%d\n", b, index);
    }
    
    #pragma mark --- 账号密码登录
    void high_quality_login_with_account_and_password(void) {
        
        char *user = "xiaoqiang";
        char *pass = "123";
        char us[40] = {};
        char pa[40] = {};
        printf("输入用户名:");
        scanf("%[^\n]",us);
        getchar();
        printf("输入密码:");
        scanf("%[^\n]",pa);
        
        int userVal = strcmp(user, us); // 从前往后,比较字符串的ascii值
        int passVal = strcmp(pass, pa); // 如果ascii值相同返回0,不同返回比较字符的差值
        
        if(userVal ==0 && passVal == 0) {
            printf("登录成功\n");
        } else {
            printf("用户名或密码错误,userVal = %d, passVal = %d\n", userVal, passVal);
        }
    }
    
    #pragma mark --- 字符串链接
    void high_quality_string_link(void) {
        
        char a[50] = "xiaoqiang";
        char b[] = " nihao!";
        strcat(a, b);  // 链接后,原始a中的‘\0’变为‘ ’,注意字符串a必须要由足够空间存放链接后的字符串
        printf("%s\n", a);
    }
    
    #pragma mark --- 求字符串长度
    int high_quality_string_length(char *p) {
        
        int index = 0;
        while(*p != '\0')  // 判断元素值是否为‘\0’,*p从首元素开始
        {
            index++;  // 判断一个,记录一个字符的个数
            p++;      // 判断完一个偏移一位地址
        }
        return index;
    }
    
    #pragma mark --- 字符串拷贝
    char *stringCopy(char *dst,char *src) {
        
        char *tmp = dst;  // 先记录指针的首地址
        while(*src != '\0') // 判断指针的取值不为‘\0’,进入循环
        {
            *dst = *src;  // 将指针的取值附值给另一个数组,第一次循环就把第一个元素值附值给另一个数组;
            src++;    // 原指针偏移一位
            dst++;    // 目标指针偏移一位
        }
        *dst = '\0';   // 目标指针的最后一位为‘\0’
        return tmp; // 虽然dst偏移走了,但tmp仍然指向首元素地址
        //    printf("dst = %s\n", dst); // 指针已经偏移到指向‘\0’的地址
    }
    void high_quality_string_copy(void) {
        
        char a[]="hello world";
        char b[20];
        char *p = stringCopy(b,a);
        printf("p = %s\n", p);
    }
    
    #pragma mark --- 字符串比较
    int stringComparison(char *p, char *q) {
        
        while(*p != '\0' && *q != '\0') {
            if(*p == *q)  //判断指针指向的元素,如果相等,则q、q要移动一位再比
            {
                p++;  //指针偏移一位
                q++;  //指针偏移一位
            } else {
                return *p - *q;  //如果不相等,则返回不相等的ascii值
            }
        }
        return *p - *q;  //字符串比较结束后,返回
    }
    void high_quality_string_comparison(void) {
        
        char a[] = "hello";
        char b[20];
        
        printf("%s\n请输入字符串:", a);
        scanf("%s", b);
        high_quality_print_line();
        
        int val = stringComparison(a, b);
        
        if(val == 0) {
        printf("字符串相同\n");
        } else {
        printf("字符串不相同,val = %d\n", val);
        }
    }
    

    相关文章

      网友评论

        本文标题:21-C语言程序源码

        本文链接:https://www.haomeiwen.com/subject/gwvptktx.html