C语言

21-C语言程序源码

2020-06-10  本文已影响0人  Andy_Livings

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);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读