引言
C言語作為一種歷史長久且功能富強的編程言語,至今仍被廣泛利用於體系編程、嵌入式開辟等範疇。控制C言語不只可能幫助我們深刻懂得打算機的任務道理,還能經由過程現實項目來晉升編程技能。本文將介紹10個合適初學者跟中級順序員輕鬆實現的C言語項目,旨在幫助讀者堅固C言語基本知識,並激起編程興趣。
項目一:打算器順序
目標
編寫一個簡單的命令行打算器,可能停止加、減、乘、除運算。
實現步調
- 輸入兩個數字跟一個運算符。
- 根據運算符履行響應的運算。
- 輸出成果。
#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;
}
項目二:冒泡排序
目標
實現一個冒泡排序演算法,對一組整數停止排序。
實現步調
- 輸入一組整數。
- 利用冒泡排序演算法對整數停止排序。
- 輸出排序後的成果。
#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言語順序,用於複製一個文件到另一個文件。
實現步調
- 打開源文件跟目標文件。
- 讀取源文件內容並寫入目標文件。
- 封閉文件。
#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言語順序,將華氏溫度轉換為攝氏溫度。
實現步調
- 輸入華氏溫度。
- 打算攝氏溫度。
- 輸出成果。
#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;
}
項目五:簡單文本編輯器
目標
實現一個簡單的文本編輯器,容許用戶創建、讀取跟保存文本文件。
實現步調
- 創建一個新的文本文件。
- 讀取文本文件內容。
- 保存文本文件內容。
#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到100之間的隨機數。
- 玩家輸入猜想的數字。
- 根據玩家的猜想,供給提示(太高了、太低了或猜對了)。
- 重複步調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言語順序,用於驗證用戶輸入的密碼能否符合特定的請求。
實現步調
- 輸入密碼。
- 驗證密碼長度能否至少為8個字元。
- 驗證密碼能否包含數字跟字母。
- 輸出驗證成果。
#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;
}
項目八:簡單材料庫管理體系
目標
實現一個簡單的材料庫管理體系,容許用戶增加、刪除跟查詢記錄。
實現步調
- 定義記錄構造體。
- 創建一個構造體數組作為材料庫。
- 實現增加、刪除跟查詢功能。
#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言語順序,經由過程命令行獲取並表現以後氣象信息。
實現步調
- 利用API獲取氣象信息。
- 剖析API前去的數據。
- 表現氣象信息。
#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;
}
項目十:淺易聊天順序
目標
實現一個淺易的聊天順序,容許兩個用戶經由過程命令行停止通信。
實現步調
- 創建一個伺服器端跟一個客戶端。
- 伺服器端監聽客戶端連接。
- 客戶端發送消息到伺服器端,伺服器端播送消息到全部客戶端。
// 伺服器端代碼
#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言語的基本知識,並晉升編程技能。在編程過程中,壹直實驗跟調試是進步編程才能的重要道路。盼望這些項目可能激起讀者的編程熱忱,為將來的編程之路打下堅固的基本。