需求
写一个shell程序命名为wc,统计文件字符数、行数和单词数。
写一个shell程命名为bank,完成以下功能:退出、存款、取款、添加账户、删除账户、查询账户、显示所有账户,所有信息保存在account.dat文件中,每次操作会实时更新account.dat文件。
编写对应的makefile,使用 make编译
shell版本
https://blog.csdn.net/qq21497936/article/details/79952413
实现截图(c与shell的差不多)
wc
bank
wc的makefile
CC=gcc wc : wc.o $(CC) -o wc wc.o wc.o : wc.c $(CC) -c wc.c clean: rm -rf wc.o wc
wc的c代码
#include <stdio.h> void wc(char *path) { int isWord = 0; int chars = 0; int rows = 0; int words = 0; int ch; FILE *fp = NULL; fp = fopen(path, "r"); if(fp == NULL) { printf("Failed to open file:%s", path); return; } do { ch = fgetc(fp); if(ch != EOF) chars++; if(ch == '\n') rows++; if((ch >= 'a' && ch <='z') || (ch >= 'A' && ch <='Z')) { isWord = 1; }else{ if(isWord == 1) words++; isWord = 0; } }while(ch != EOF); fclose(fp); printf("===== file: %s =====\n", path); printf("字符数:%d\n", chars); printf("换行数:%d\n", rows); printf("单词数:%d\n", words); return; } int main(int argc, char *argv[]) { int i = 0; char path[32] = {0x00}; if( argc == 1 ) { printf("input a file:"); scanf("%s", path); wc(path); }else{ for(i = 1; i < argc; i++) { wc(argv[i]); } } }
bank的makefile
CC=gcc bank : bank.o $(CC) -o bank bank.o bank.o : bank.c $(CC) -c bank.c clean: rm -rf bank.o bank
bank的c代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define DATA_FILE ("accounts.dat") struct Info *pAccountHead = 0; struct Info{ char firstName[128]; char middleName[128]; char lastName[128]; char number[128]; int balance; struct Info *pNext; }; void loadInfo() { struct Info *p = 0; struct Info *q = 0; struct Info *pInfo = 0; FILE *fp = fopen(DATA_FILE, "rb"); if(fp == NULL) { printf("Failed to open file : %s", DATA_FILE); return; } pAccountHead = 0; do{ struct Info *pInfo = (struct Info *)malloc(sizeof(struct Info)); memset(pInfo, 0x00, sizeof(struct Info)); if(5!=fscanf(fp,"%s %s %s %s %d ", pInfo->firstName, pInfo->middleName, pInfo->lastName, pInfo->number, &pInfo->balance)) { free(pInfo); break; } if(pAccountHead == 0) { pAccountHead = pInfo; }else{ p = pAccountHead; while(p->pNext != 0) { p = p->pNext; } p->pNext = pInfo; pInfo->pNext = 0; } }while(1); fclose(fp); } void saveInfo() { struct Info *p = 0; int result = 0; FILE *fp = 0; fp = fopen(DATA_FILE, "wb+"); if(fp == NULL) { printf("Failed to open file : %s", DATA_FILE); return; } p = pAccountHead; while(p != 0) { fprintf(fp,"%s %s %s %s %d ", p->firstName, p->middleName, p->lastName, p->number, p->balance); p = p->pNext; } fclose(fp); } int showMenu() { int number = 0; printf("========== 银行账户菜单 =========="); printf("\n"); printf("0.退出"); printf("\n"); printf("1.存款"); printf("\n"); printf("2.取款"); printf("\n"); printf("3.添加账户"); printf("\n"); printf("4.删除账户"); printf("\n"); printf("5.查询账户余额"); printf("\n"); printf("6.打印所有账户信息"); printf("\n"); printf("================================="); printf("\n"); printf("请输入您的选择(0-6):"); scanf("%d", &number); return number; } void menu2() { int i = 0; char number[128] = {0x00}; int balance; struct Info *pInfo = 0; struct Info *p = 0; struct Info *q = 0; printf("请输入account(6位数字):"); scanf("%s", number); if(strlen(number) != 6) { printf("账户必须是6位数字!!!"); printf("\n"); return; } for(i = 0; i < 6; i++) { if(number[i] >= '0' && number[i] <= '9') { ; }else{ printf("账户必须是6位数字!!!"); printf("\n"); return; } } printf("请输入取款金额(元):"); scanf("%d", &balance); q = 0; p = pAccountHead; while(p != 0) { if(strcmp(p->number, number) == 0) { if(p->balance-balance < 0) { printf("取款失败,账户余额不足!!!"); printf("\n"); return; } p->balance-=balance; printf("取款成功!!!"); printf("\n"); return; } q = p; p = p->pNext; } printf("未找到账户"); printf("\n"); } void menu1() { int i = 0; char number[128] = {0x00}; int balance; struct Info *pInfo = 0; struct Info *p = 0; struct Info *q = 0; printf("请输入account(6位数字):"); scanf("%s", number); if(strlen(number) != 6) { printf("账户必须是6位数字!!!"); printf("\n"); return; } for(i = 0; i < 6; i++) { if(number[i] >= '0' && number[i] <= '9') { ; }else{ printf("账户必须是6位数字!!!"); printf("\n"); return; } } printf("请输入存款金额(元):"); scanf("%d", &balance); q = 0; p = pAccountHead; while(p != 0) { if(strcmp(p->number, number) == 0) { p->balance+=balance; printf("存款成功!!!"); printf("\n"); return; } q = p; p = p->pNext; } printf("未找到账户"); printf("\n"); } void menu3() { int i = 0; char fisrtName[128] = {0x00}; char middleName[128] = {0x00}; char lastName[128] = {0x00}; char number[128] = {0x00}; struct Info *pInfo = 0; struct Info *p = 0; printf("请输入firstName:"); scanf("%s", fisrtName); printf("请输入middleName:"); scanf("%s", middleName); printf("请输入lastName:"); scanf("%s", lastName); printf("请输入account(6位数字):"); scanf("%s", number); if(strlen(number) != 6) { printf("账户必须是6位数字!!!"); printf("\n"); return; } for(i = 0; i < 6; i++) { if(number[i] >= '0' && number[i] <= '9') { ; }else{ printf("账户必须是6位数字!!!"); printf("\n"); return; } } pInfo = (struct Info*)malloc(sizeof(struct Info)); memset(pInfo, 0x00, sizeof(struct Info)); memcpy(pInfo->firstName, fisrtName, strlen(fisrtName)+1); memcpy(pInfo->middleName, middleName, strlen(middleName)+1); memcpy(pInfo->lastName, lastName, strlen(lastName)+1); memcpy(pInfo->number, number, strlen(number)+1); pInfo->balance = 0; pInfo->pNext = 0; if(pAccountHead == 0) { pAccountHead = pInfo; return; } p = pAccountHead; do { if(p->pNext == 0) { p->pNext = pInfo; return; } p = p->pNext; }while(1); } void menu4() { int i = 0; char number[128] = {0x00}; struct Info *q = 0; struct Info *p = 0; printf("请输入账户(6位数字):"); scanf("%s", number); if(strlen(number) != 6) { printf("账户必须是6位数字!!!"); printf("\n"); return; } for(i = 0; i < 6; i++) { if(number[i] >= '0' && number[i] <= '9') { ; }else{ printf("账户必须是6位数字!!!"); printf("\n"); return; } } q = 0; p = pAccountHead; while(p != 0) { if(strcmp(p->number, number) == 0) { if(q == 0) { pAccountHead = p->pNext;; free(p); }else{ q->pNext = p->pNext; free(p); } printf("删除账户%s成功!!!", number); printf("\n"); } q = p; p = p->pNext; } } void menu5() { int i = 0; char number[128] = {0x00}; struct Info *q = 0; struct Info *p = 0; printf("请输入账户(6位数字):"); scanf("%s", number); if(strlen(number) != 6) { printf("账户必须是6位数字!!!"); printf("\n"); return; } for(i = 0; i < 6; i++) { if(number[i] >= '0' && number[i] <= '9') { ; }else{ printf("账户必须是6位数字!!!"); printf("\n"); return; } } q = 0; p = pAccountHead; while(p != 0) { if(strcmp(p->number, number) == 0) { printf("firstName:%s middleName:%s lastName:%s account:%s balance:%d ", p->firstName, p->middleName, p->lastName, p->number, p->balance); printf("\n"); return; } q = p; p = p->pNext; } printf("查询账户%s失败!!!", number); printf("\n"); } void menu6() { struct Info *p = pAccountHead; if(p == 0) { printf("没有账户信息"); printf("\n"); return; } do{ printf("firstName:%s middleName:%s lastName:%s account:%s balance:%d ", p->firstName, p->middleName, p->lastName, p->number, p->balance); printf("\n"); p = p->pNext; }while(p != NULL); } void main(int argc, char *argv[]) { loadInfo(); while(1) { switch(showMenu()) { case 0: return; case 1: menu1(); break; case 2: menu2(); break; case 3: menu3(); break; case 4: menu4(); break; case 5: menu5(); break; case 6: menu6(); break; default: ; } saveInfo(); } }