【C語言編程挑戰】輕鬆實現10個實用項目

提問者:用戶ZQNI 發布時間: 2025-05-24 21:25:54 閱讀時間: 3分鐘

最佳答案

引言

C言語作為一種歷史長久且功能富強的編程言語,至今仍被廣泛利用於體系編程、嵌入式開辟等範疇。控制C言語不只可能幫助我們深刻懂得打算機的任務道理,還能經由過程現實項目來晉升編程技能。本文將介紹10個合適初學者跟中級順序員輕鬆實現的C言語項目,旨在幫助讀者堅固C言語基本知識,並激起編程興趣。

項目一:打算器順序

目標

編寫一個簡單的命令行打算器,可能停止加、減、乘、除運算。

實現步調

  1. 輸入兩個數字跟一個運算符。
  2. 根據運算符履行響應的運算。
  3. 輸出成果。
#include <stdio.h>

int main() {
    char operator;
    double firstNumber, secondNumber;

    printf("Enter an operator (+, -, *, /): ");
    scanf("%c", &operator);

    printf("Enter two operands: ");
    scanf("%lf %lf", &firstNumber, &secondNumber);

    switch (operator) {
        case '+':
            printf("%.1lf + %.1lf = %.1lf", firstNumber, secondNumber, firstNumber + secondNumber);
            break;
        case '-':
            printf("%.1lf - %.1lf = %.1lf", firstNumber, secondNumber, firstNumber - secondNumber);
            break;
        case '*':
            printf("%.1lf * %.1lf = %.1lf", firstNumber, secondNumber, firstNumber * secondNumber);
            break;
        case '/':
            if (secondNumber != 0.0)
                printf("%.1lf / %.1lf = %.1lf", firstNumber, secondNumber, firstNumber / secondNumber);
            else
                printf("Division by zero is not allowed.");
            break;
        default:
            printf("Error! operator is not correct");
    }

    return 0;
}

項目二:冒泡排序

目標

實現一個冒泡排序演算法,對一組整數停止排序。

實現步調

  1. 輸入一組整數。
  2. 利用冒泡排序演算法對整數停止排序。
  3. 輸出排序後的成果。
#include <stdio.h>

void bubbleSort(int array[], int size) {
    for (int step = 0; step < size - 1; ++step) {
        for (int i = 0; i < size - step - 1; ++i) {
            if (array[i] > array[i + 1]) {
                int temp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = temp;
            }
        }
    }
}

int main() {
    int array[] = {64, 34, 25, 12, 22, 11, 90};
    int size = sizeof(array) / sizeof(array[0]);

    bubbleSort(array, size);

    printf("Sorted array: \n");
    for (int i = 0; i < size; i++)
        printf("%d ", array[i]);
    printf("\n");

    return 0;
}

項目三:文件複製東西

目標

編寫一個C言語順序,用於複製一個文件到另一個文件。

實現步調

  1. 打開源文件跟目標文件。
  2. 讀取源文件內容並寫入目標文件。
  3. 封閉文件。
#include <stdio.h>

int main() {
    FILE *source, *target;
    char ch;

    source = fopen("source.txt", "r");
    if (source == NULL) {
        printf("Could not open source file");
        return 1;
    }

    target = fopen("target.txt", "w");
    if (target == NULL) {
        printf("Could not open target file");
        fclose(source);
        return 1;
    }

    while ((ch = fgetc(source)) != EOF)
        fputc(ch, target);

    fclose(source);
    fclose(target);

    return 0;
}

項目四:溫度轉換器

目標

編寫一個C言語順序,將華氏溫度轉換為攝氏溫度。

實現步調

  1. 輸入華氏溫度。
  2. 打算攝氏溫度。
  3. 輸出成果。
#include <stdio.h>

int main() {
    float fahrenheit, celsius;

    printf("Enter temperature in Fahrenheit: ");
    scanf("%f", &fahrenheit);

    celsius = (fahrenheit - 32) * 5 / 9;

    printf("Temperature in Celsius: %.2f\n", celsius);

    return 0;
}

項目五:簡單文本編輯器

目標

實現一個簡單的文本編輯器,容許用戶創建、讀取跟保存文本文件。

實現步調

  1. 創建一個新的文本文件。
  2. 讀取文本文件內容。
  3. 保存文本文件內容。
#include <stdio.h>

void createFile(const char *filename) {
    FILE *file = fopen(filename, "w");
    if (file == NULL) {
        printf("Error creating file.\n");
        return;
    }
    fclose(file);
    printf("File created successfully.\n");
}

void readFile(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("Error opening file.\n");
        return;
    }
    char ch;
    while ((ch = fgetc(file)) != EOF)
        putchar(ch);
    fclose(file);
}

void saveFile(const char *filename) {
    FILE *file = fopen(filename, "w");
    if (file == NULL) {
        printf("Error opening file.\n");
        return;
    }
    char ch;
    printf("Enter text to save:\n");
    while ((ch = getchar()) != '\n')
        fputc(ch, file);
    fclose(file);
    printf("File saved successfully.\n");
}

int main() {
    char filename[100];
    printf("Enter filename: ");
    scanf("%99s", filename);

    createFile(filename);
    readFile(filename);
    saveFile(filename);

    return 0;
}

項目六:猜數字遊戲

目標

編寫一個猜數字遊戲,打算機隨機生成一個數字,玩家實驗猜想這個數字。

實現步調

  1. 打算機生成一個1到100之間的隨機數。
  2. 玩家輸入猜想的數字。
  3. 根據玩家的猜想,供給提示(太高了、太低了或猜對了)。
  4. 重複步調2跟3,直到玩家猜對數字。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int numberToGuess, guess;

    // Seed the random number generator
    srand(time(NULL));

    numberToGuess = rand() % 100 + 1;

    printf("Guess the number (between 1 and 100): ");
    scanf("%d", &guess);

    while (guess != numberToGuess) {
        if (guess < numberToGuess)
            printf("Too low. Try again: ");
        else
            printf("Too high. Try again: ");
        scanf("%d", &guess);
    }

    printf("Congratulations! You guessed the right number: %d\n", numberToGuess);

    return 0;
}

項目七:密碼驗證器

目標

編寫一個C言語順序,用於驗證用戶輸入的密碼能否符合特定的請求。

實現步調

  1. 輸入密碼。
  2. 驗證密碼長度能否至少為8個字元。
  3. 驗證密碼能否包含數字跟字母。
  4. 輸出驗證成果。
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int validatePassword(const char *password) {
    int length = strlen(password);
    int hasDigit = 0, hasLetter = 0;

    if (length < 8)
        return 0;

    for (int i = 0; i < length; i++) {
        if (isdigit(password[i]))
            hasDigit = 1;
        if (isalpha(password[i]))
            hasLetter = 1;
    }

    return hasDigit && hasLetter;
}

int main() {
    char password[100];

    printf("Enter a password: ");
    scanf("%99s", password);

    if (validatePassword(password))
        printf("Password is valid.\n");
    else
        printf("Password is invalid.\n");

    return 0;
}

項目八:簡單材料庫管理體系

目標

實現一個簡單的材料庫管理體系,容許用戶增加、刪除跟查詢記錄。

實現步調

  1. 定義記錄構造體。
  2. 創建一個構造體數組作為材料庫。
  3. 實現增加、刪除跟查詢功能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char name[50];
    int age;
    float salary;
} Employee;

Employee database[100];
int databaseSize = 0;

void addEmployee(const char *name, int age, float salary) {
    if (databaseSize < 100) {
        strncpy(database[databaseSize].name, name, sizeof(database[databaseSize].name) - 1);
        database[databaseSize].name[sizeof(database[databaseSize].name) - 1] = '\0';
        database[databaseSize].age = age;
        database[databaseSize].salary = salary;
        databaseSize++;
    } else {
        printf("Database is full.\n");
    }
}

void deleteEmployee(const char *name) {
    for (int i = 0; i < databaseSize; i++) {
        if (strcmp(database[i].name, name) == 0) {
            for (int j = i; j < databaseSize - 1; j++) {
                database[j] = database[j + 1];
            }
            databaseSize--;
            printf("Employee deleted successfully.\n");
            return;
        }
    }
    printf("Employee not found.\n");
}

void queryEmployee(const char *name) {
    for (int i = 0; i < databaseSize; i++) {
        if (strcmp(database[i].name, name) == 0) {
            printf("Name: %s, Age: %d, Salary: %.2f\n", database[i].name, database[i].age, database[i].salary);
            return;
        }
    }
    printf("Employee not found.\n");
}

int main() {
    addEmployee("John Doe", 30, 50000.0);
    addEmployee("Jane Smith", 25, 45000.0);

    queryEmployee("John Doe");
    deleteEmployee("John Doe");
    queryEmployee("John Doe");

    return 0;
}

項目九:命令行氣象利用

目標

編寫一個C言語順序,經由過程命令行獲取並表現以後氣象信息。

實現步調

  1. 利用API獲取氣象信息。
  2. 剖析API前去的數據。
  3. 表現氣象信息。
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

struct String {
    char *ptr;
    size_t len;
};

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, struct String *s) {
    size_t newLen = size * nmemb;
    size_t oldLen = s->len;

    s->ptr = realloc(s->ptr, oldLen + newLen + 1);

    if (!s->ptr) {
        return 0;
    }

    memcpy(s->ptr + oldLen, contents, newLen);
    s->ptr[oldLen + newLen] = '\0';
    s->len += newLen;

    return size * nmemb;
}

int main() {
    CURL *curl;
    CURLcode res;
    struct String s = {NULL, 0};

    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://api.openweathermap.org/data/2.5/weather?q=London&appid=YOUR_API_KEY&units=metric");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);

        if (res == CURLE_OK) {
            printf("Weather in London: %s\n", s.ptr);
        } else {
            printf("Curl failed: %s\n", curl_easy_strerror(res));
        }
    }

    curl_global_cleanup();

    return 0;
}

項目十:淺易聊天順序

目標

實現一個淺易的聊天順序,容許兩個用戶經由過程命令行停止通信。

實現步調

  1. 創建一個伺服器端跟一個客戶端。
  2. 伺服器端監聽客戶端連接。
  3. 客戶端發送消息到伺服器端,伺服器端播送消息到全部客戶端。
// 伺服器端代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[BUFFER_SIZE] = {0};
    char *hello = "Hello from server";

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    read(new_socket, buffer, BUFFER_SIZE);
    send(new_socket, hello, strlen(hello), 0);
    close(new_socket);
    return 0;
}
// 客戶端代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int sock = 0, valread;
    struct sockaddr_in serv_addr;
    char buffer[BUFFER_SIZE] = {0};
    char *hello = "Hello from client";

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }

    memset(&serv_addr, '0', sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

    // Convert IPv4 and IPv6 addresses from text to binary form
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }

    send(sock , hello , strlen(hello) , 0 );
    valread = read( sock , buffer, BUFFER_SIZE);
    printf("%s\n", buffer);

    return 0;
}

總結

經由過程以上10個C言語編程項目標現實,讀者可能堅固C言語的基本知識,並晉升編程技能。在編程過程中,壹直實驗跟調試是進步編程才能的重要道路。盼望這些項目可能激起讀者的編程熱忱,為將來的編程之路打下堅固的基本。

相關推薦
    发布时间:2024-11-11
    一般情况下首先得向每位小孩家长道歉,然后根据小孩的上学天数,逐一给每家退没用完的学费,我家朋友小孩上一家幼儿园因为经营不善,倒闭啦,然后就按照学生未上完的学费退的款,如果要是幼儿园因为非可抗拒因素,退费的问题就另当别论啦!
    发布时间:2024-11-11
    路易士集成灶是品牌。路易士厨电隶属于美的集团,是美的旗下的高端厨电品牌,主要生产高端厨房电器,如烟灶、消毒柜、蒸箱、烤箱等。路易士厨电以其高品质、高性能、高设计感的产品而著名,是国内高端厨电市场的领导品牌之一。
    发布时间:2024-11-11
    一、查询缺额信息符合调剂要求的考生可以登录中国研究生招生信息网(https://yz.chsi.com.cn/),进入网上调剂系统,查询各单位公布的调剂缺额信息和调剂要求,锁定几所目标院校。二、填写调剂志愿选择好调剂院校后按要求填写调
    发布时间:2024-11-11
    小项、中项、大项是指在统计学上用于分类和总结数据的术语。大项是最总体的分类,中项是对大项的细分,小项则更具体地划分了中项。例如,在调查某个城市的食品消费情况中,大项可以是食品消费,中项可以是餐饮消费、超市购物消费等,小项则可以是每个餐饮
    发布时间:2024-11-11
    1、将肉桂枝和/或肉桂叶装入蒸馏锅进行蒸馏,其内的肉桂枝和/或肉桂叶的肉桂油被水蒸气蒸出,与水蒸气形成混合蒸气。2、混合蒸汽进入到蒸发器冷凝成油水混合液后输入冷凝器中,进行加热蒸发转化成蒸汽进入水蒸。3、油水混合液经过油水分离器后
    发布时间:2024-11-11
    鹦鹉是鹦形目(学名:Psittaciformes)众多羽毛艳丽、爱叫的鸟。典型的攀禽,对趾型足,两趾向前两趾向后,适合抓握,鸟喙强劲有力,可以食用硬壳果。羽色鲜艳,常被作为宠物饲养。它们以其美丽的羽毛,善学人语技能的特点,更为人们所欣赏和钟
    发布时间:2024-11-11
    在散打运动中常用的有直、摆、勾、劈、鞭拳等五种拳法,这些拳法在实战中具有速度快和灵活多变的特点,它能以最短的距离,最快的速度击中对手。拳法益于结合进行训练,并且能任意配合其它技术使用,掌握的好,利用的巧妙能给对手造成很大的威胁。直拳:以左直
    发布时间:2024-11-11
    有可能会,有可能不会,要么你的手机是中端机或者低端机,高端机,如果你是中端机或者低端机的话你一边听歌,一边玩游戏,会影响你玩游戏的性能,会导致你手机发烫,然后使你玩游戏的时候卡顿,如果你是高端机的话,比如苹果那种的就不会发生那种情况,一边听
    发布时间:2024-11-11
    1、孤独界杠把子 2、酷到无路可走 3、曲未终人已散 4、当时我就萌了5、最凉不过人心6、谁把流年搁浅7、我记得我帅过8、余生独自流浪9、错过了就算了夕鍚下嘚箛影10、一只孤独的鬼11、久伴不如酒伴
    发布时间:2024-11-11
    土木工程结构设计中,在地基基础设计时,直接承受基础荷载的土层称为持力层。持力层受力最大,直接影响建筑物安全,故在设计中要验算包括该地层在内的整个地基强度,必要时,还要验算它们的沉降。持力层地基承受的荷载是随着土体深度的加深而慢慢减小,到