C语言练习题(持续更新)

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 C语言练习题(持续更新),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

冒泡排序

/**
 * 冒泡排序
 */
void bubbleSort(int * arr,int len) {
    int temp = 0;
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

选择排序

/**
 * 选择排序
 */
void SelectSort(int * arr,int len) {
    for (int i = 0; i < len; ++i) {
        int minIndex = i;
        // 假定最小的第一个数
        int min = arr[i];
        for (int j = i + 1; j < len; ++j) {
            // 假定的不是最小
            if (min > arr[j]) {
                // 更新最小值
                min = arr[j];
                minIndex = j;
            }
        }
        if (minIndex != i) {
            arr[minIndex] = arr[i];
            arr[i] = min;
        }
    }
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
}

插入排序

/**
 * 插入排序
 */
void insertSort(int * arr,int len) {
    for (int i = 0; i < len; ++i) {
        int insertValue = arr[i];
        int insertIndex = i - 1;
        while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex--;
        }
        if (insertIndex + 1 != i) {
            arr[insertIndex + 1] = insertValue;
        }
    }
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}
int main(void) {
    int arr[5] = {3, 9, -1, 10, 2};
    int len = sizeof(arr) / sizeof(arr[0]);
    insertSort(arr,len);
    bubbleSort(arr,len);
    SelectSort(arr,len);
    return 0;
}

二维数组计算成绩

void main() {
    int l;
    int i, j;
    int v[3];
    int s;
    float sum;
    int score[5][3] = {80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 5; j++) {
            s = s + score[j][i];
        }
        v[i] = s / 5;
        s = 0;
    }
    l = (v[0] + v[1] + v[2]) / 3;
    printf("Math:%d\nC:%d\nENG:%d\n", v[0], v[1], v[2]);
    printf("total:%d\n", l);
    int a = score[0][0] + score[0][1] + score[0][2];
    printf("%d\n", a);
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 3; j++) {
            sum += score[i][j];
        }
        printf("第%d学生平均成绩是%f\n", i + 1, sum / 3);
        sum = 0;
    }
}

求二维数组(三行三列的对角线元素的和)

/**
 * 求二维数组(三行三列的对角线元素的和)  00 11 22 02 11 20
 */
void test01() {
    int arr[3][3] = {{80, 75, 92},
                     {71, 59, 63},
                     {87, 90, 76}};
    int row = sizeof(arr) / sizeof(arr[0]);
    int col = sizeof(arr[0]) / sizeof(arr[0][0]);
    int sum = 0;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if ((i == j) || (i + j == row - 1)) {
                if (i == 1 && j == 1) {
                    sum += arr[i][j] * 2;
                } else {
                    sum += arr[i][j];
                }
            }
        }
    }
    printf("对角线的和为:%d\n", sum);
}

求二位数组(五行五列)中最大的元素及其行列号

/**
 * 求二位数组(五行五列)中最大的元素及其行列号
 */
void test02() {
    int arr[5][5] = {{80,  75,  92,  61,  65},
                     {71,  59,  63,  70,  85},
                     {87,  90,  76,  77,  85},
                     {66,  44,  58,  35,  69},
                     {182, 414, 158, 135, 69}};
    // 定义max
    int max = 0;
    int hang, lie;
    int row = sizeof(arr) / sizeof(arr[0]);
    int col = sizeof(arr[0]) / sizeof(arr[0][0]);
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; ++j) {
            if (max < arr[i][j]) {
                max = arr[i][j];
                hang = i;
                lie = j;
            }
        }
    }
    printf("最大的元素是%d\n", max);
    printf("位置是arr[%d][%d]\n", hang, lie);

}

打印杨辉三角

/**
 * 打印杨辉三角
 */
void test03() {
    int arr[10][10];
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < i + 1; j++) {
            if (j == 0 || j == i) {
                arr[i][j] = 1;
            } else {
                arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
            }
        }
    }
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < i + 1; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

找出一个矩阵中的鞍点,即该位置元素的该行上最大,该列上最小,一个矩阵可能没有鞍点,如果没有输出对应的信息,如果有,则输出鞍点位置和值

/**
 * 找出一个矩阵中的鞍点,即该位置元素的该行上最大,该列上最小,一个矩阵可能没有鞍点,如果没有输出对应的信息,如果有,则输出鞍点位置和值
 */
void test04() {
    int arr[3][3] = {{15, 30, 92},
                     {71, 59, 100},
                     {87, 90, 120}};
    int row = sizeof(arr) / sizeof(arr[0]);
    int col = sizeof(arr[0]) / sizeof(arr[0][0]);
    // 记录坐标
    int a = 0;
    int b = 0;
    int num;
    // 行最大
    int max = 0;
    // 列最小
    int min = 0;
    for (int i = 0; i < row; i++) {
        max = arr[i][0];
        for (int j = 0; j < col; j++) {
            if (arr[i][j] > max) {  // 行内最大
                max = arr[i][j];
                b = j;  //i 行最大的数在j列,那么现在去第j列找最小的数,如果找到的数的行数为i,便是;
            }
        }
        min = arr[i][b];  // 设目前最小为i行b列
        a = i;  // 假设
        for (int k = 0; k < row; k++) {
            if (arr[k][b] < min) {  // 列内最小
                min = arr[k][b];
                a = k;  // 如果有更小的,那么a就变化
            }
        }
        if (a == i) {
            num = 0;
            printf("本数组的鞍点为:arr[%d][%d] = %d\n", a, b, min);
        }
    }
    if (num) {
        printf("本数组不存在鞍点");
    }
}

字符练习

void test() {
    char str[30];
    scanf("%s", str);
    printf("%s", str);
}

void test02() {
    char c = 'a';
    char t[] = "you and me";
    int n, k, j;
    n = strlen(t);
    for (k = 0; k < n; k++)
        if (t[k] == c) {
            j = k;
            break;
        } else j = -1;
    printf("%d", j);
}

void test03() {
    char a[4][10] = {"11", "22", "33", "44"};
    puts(strcat(a[1], a[3]));
    puts(strcpy(a[0], a[2]));

    char str[2][10] = {"abc", "ABC"};
    printf("%c\n", str[1]);
    printf("%c\n", str[0]);
    printf("%d\n", strcmp(str[1], str[0]));
    printf("%d\n", strcmp(strlwr(str[1]), str[0]));
}

void test04() {
    char s[3][20] = {"2345", "123456", "2347"};
    int i, k;
    for (k = 0, i = 1; i < 3; i++) {
        printf("%s\n", s[k]);
        printf("%s\n", s[i]);
        if ((strcmp(s[k], s[i])) < 0) {
            k = i;
        }
    }
    puts(s[k]);
}

编写一个程序,将字符数组a中的全部字符复制到字符数组b中。不要使用strcpy函数。

/**
 * 1.编写一个程序,将字符数组a中的全部字符复制到字符数组b中。不要使用strcpy函数。
 */
void test06() {
    char a[50] = {'1', '3', '5', '6', '8'};
    char b[50] = {};
    for (int i = 0; i < strlen(a); ++i) {
        b[i] = a[i];
    }
    puts(b);
}

有5个国家名,要求按字母先后顺序排列,并按序输出。

/**
 * 交换字符串
 * @param c1  字符串1
 * @param c2  字符串2
 */
void swap(char *c1, char *c2) {
    char temp[20];
    strcpy(temp, c1);
    strcpy(c1, c2);
    strcpy(c2, temp);
}

/**
 * 2. 有5个国家名,要求按字母先后顺序排列,并按序输出。
 */
void test07() {
    char arr[5][10];
    for (int i = 0; i < 5; ++i) {
        gets(arr[i]);
    }
    printf("排序前数组\n");
    for (int m = 0; m < 5; ++m) {
        puts(arr[m]);
    }
    // 排序 冒泡排序
    for (int i = 0; i < 4; ++i) {
        for (int j = 1; j < 4 - i; ++j) {
            // 比较字符串
            if (strcmp(arr[j], arr[j - 1]) < 0) {
                swap(arr[j], arr[j - 1]);
            }
        }
    }
    printf("排序后数组\n");
    for (int k = 0; k < 5; ++k) {
        puts(arr[k]);
    }
}

有一行文字,要求删去某个字符,此行文字和要删的字符均由键盘输入

/**
 *3. 有一行文字,要求删去某个字符,此行文字和要删的字符均由键盘输入
 */
void test08() {
    int i, j, flag = 1;
    char str[80], c;
    printf("请输入一行字符:\n");
    gets(str);
    printf("请输入要删出的字符:\n");
    scanf("%c", &c);
    printf("删除之前: \n");
    puts(str);
    while (flag) {
        flag = 0;
        for (i = 0; str[i] != '\0'; i++)
            if (str[i] == c) {
                flag = 1;
                break;
            }
        for (j = i + 1; str[j] != '\0'; j++) str[j - 1] = str[j];
        str[j - 1] = str[j];
    }
    printf("删除之后: \n");
    puts(str);

}

给定三个数字从小到大输出(指针法)

#include "stdio.h"

void compare(int *a, int *b, int *c);

int main(void) {
    int a, b, c;
    printf("输入三个整数(空格分割):");
    scanf("%d %d %d", &a, &b, &c);
    compare(&a, &b, &c);
    printf("%d %d %d", a,b,c);
    return 0;
}

void compare(int *a, int *b, int *c) {
    int temp = 0;
    if (*a > *b) {
        temp = *b;
        *b = *a;
        *a = temp;
    } else if (*a > *c) {
        temp = *c;
        *c = *a;
        *a = temp;
    } else if (*b > *c) {
        temp = *c;
        *c = *b;
        *b = temp;
    }
}

判断是否为素数

#include "stdio.h"
int isPrime(int *n);

int main(void) {
    int a;
    printf("输入一个数:\n");
    scanf("%d", &a);
    if (isPrime(&a)) {
        printf("是素数");
    } else {
        printf("不是素数");
    }
    return 0;
}
int isPrime(int *n) {
    int count = 0;
    for (int i = 1; i <= *n; i++) {
        if (*n % i == 0) {
            count++;
        }
    }
    if (count == 2) {
        return 1;
    } else {
        return 0;
    }
}

求最大公约数

#include "stdio.h"

int GYS(int *m, int *n);

int main(void) {
    int a, b, c;
    printf("输入两个数:\n");
    scanf("%d %d", &b,&c);
    printf("最大公约数为%d",GYS(&b,&c));

    return 0;
}

int GYS(int *m, int *n) {
    while (*n != 0) {
        int temp = *m % *n;
        *m = *n;
        *n = temp;
    }
    return *m;
}

求n的阶乘

#include "stdio.h"

int factorial(int a);

int main(void) {
    int a;
    printf("输入一个数:\n");
    scanf("%d", &a);
    printf("%d", factorial(a));
    return 0;
}
/**
 * 阶乘
 * @param a 数
 * @return 结果
 */
int factorial(int a) {
    if (a == 1) {
        return 1;
    }
    return a * factorial(a - 1);
}

求幂指数

#include "stdio.h"
#include "math.h"

int CountX(int x, int n);

int main(void) {
    printf("%d", CountX(1, 2));
    return 0;
}
/**
 * 求幂指数
 * @param x 底数
 * @param n 次方
 * @return 结果
 */
int CountX(int x, int n) {
    if (n == 0) {
        return 1;
    } else if (n == 1) {
        return x;
    } else {
        return x * pow(x, n - 1);
    }
}

将数组a中的n个整数按相反顺序存放(用指针实现)

#include "stdio.h"
#include "string.h"

void reserve(int *arr,int n);

int main(void) {
    int arr[5] = {0, 1, 2, 3, 4};
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    int n=sizeof (arr)/sizeof (arr[0]);
    reserve(arr,n);
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

void reserve(int *arr,int n) {
    int *start;
    int *end;
    start = &arr[0];
    end = &arr[n-1];
    while (start < end) {
        int temp = *start;
        *start = *end;
        *end = temp;
        start++;
        end--;
    }
}

对若干个字符串排序(用指针实现)

#include "stdio.h"
#include "string.h"

void sort(char *arr[], int n);

void reserve(int *arr,int n);

print(char *arr[], int n);

int main(void) {
    char *arr[] = {"Bat", "ZFD", "EXP"};
    sort(arr, 3);
    print(arr, 3);
    return 0;
}

void sort(char *arr[], int n) {
    char *temp;
    for (int i = 0; i < n - 1; ++i) {
        for (int j = i + 1; j < n; ++j) {
            if (strcmp(arr[i], arr[j]) > 0) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

print(char *arr[], int n) {
    for (int i = 0; i < n; ++i) {
        printf("%s", arr[i]);
    }
}
// 第二种写法
print2(char *arr[], int n) {
    int *p;
    p = arr[0];
    for (int i = 0; i < n; i++) {
        p = *(arr + i);
        printf("%s ", p);
    }
}

结构体5名学生,找出最高分和最低分学生信息

#include<stdio.h>
#include<stdlib.h>

struct student {
    //定义结构体成员
    int num;        //学号
    char name[20];    //姓名
    int score;    //成绩
};

void bubbleSort(struct student stu[5], int len) {
    int temp = 0;
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len - i - 1; j++) {
            if (stu[j].score > stu[j + 1].score) {
                temp = stu[j].score;
                stu[j].score = stu[j + 1].score;
                stu[j + 1].score = temp;
            }
        }
    }
    for (int i = 0; i < len; i++) {
        printf("%d ", stu[i].score);
    }
    printf("\n");
}

int main() {
    int a, b;
    struct student stu[5] =
            {
                    {1, "张三", 110},
                    {2, "李四", 120},
                    {3, "王五", 140},
                    {4, "赵六", 105},
                    {5, "田七", 90}
            };                        //声明结构体类型数组
    int maxScore = stu[0].score;
    int minScore = stu[0].score;
    for (int i = 1; i < 5; i++) {
        if (stu[i].score > maxScore) {
            maxScore = stu[i].score;        //记录最高成绩
            a = i;                        //记录最高成绩下标
        }
        if (stu[i].score < minScore) {
            minScore = stu[i].score;//记录最低成绩
            b = i; //记录最低成绩下标
        }
    }

    for (int i = 0; i < 5; i++) {
        printf("学号:%d 姓名:%s 成绩:%5.1d \n", stu[i].num, stu[i].name, stu[i].score);
    }

    bubbleSort(stu,5);
    printf("最高分是:%5.1d\n", stu[4].score);            //输出最高成绩
    printf("最高分学生的学号:%d\n", stu[4].num);    //输出最高成绩的学号
    printf("最高分学生的姓名:%s\n", stu[4].name);    //输出最高成绩的下标


    printf("最低分是:%5.1d\n", stu[0].score);            //输出最高成绩
    printf("最低分学生的学号:%d\n", stu[0].num);    //输出最高成绩的学号
    printf("最低分学生的姓名:%s\n", stu[0].name);    //输出最高成绩的下标
   /* printf("最高分是:%5.1d\n", maxScore);            //输出最高成绩
    printf("最高分学生的学号:%d\n", stu[a].num);    //输出最高成绩的学号
    printf("最高分学生的姓名:%s\n", stu[a].name);    //输出最高成绩的下标

    printf("最低分是:%5.1d\n", minScore);            //输出最高成绩
    printf("最低分学生的学号:%d\n", stu[b].num);    //输出最高成绩的学号
    printf("最低分学生的姓名:%s\n", stu[b].name);    //输出最高成绩的下标*/


    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140690.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!