1. 程式人生 > 程式設計 >C語言實現一個簡易通訊錄

C語言實現一個簡易通訊錄

本文實現一個通訊錄,是基於c語言的IO檔案操作、資料結構裡面的順序表實現。

具體功能

實現了

1、資訊的新增
2、資訊的顯示
3、資訊的修改(修改單一屬性)
4、將記憶體中的資訊儲存到檔案中去
5、將檔案中的資訊載入到記憶體中(每次程式執行資料就會丟失)
6、資訊的刪除
7、資訊的查詢(按照各自的屬性查詢)
8、給每一條資訊設定了唯一的標識id
9、通訊錄的銷燬

標頭檔案中的宣告

在c語言中我們採用結構體來記錄每一個人的具體資訊
用順序表的資料結構來來對資料的操作

#ifndef __ADDRESSBOOK_H__
#define __ADDRESSBOOK_H__

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

#define NAME_MAX 200 //名字
#define GENDER_MAX 100 // 性別
#define ADDRESS_MAX 200 // 地址
#define NUMBER_MAX 200 // 電話
#define SEQLIST_MAX 1000 // 儲存的最大資訊數量
#define FILE_PATH "address_book.txt" // 寫入檔案的位置

typedef struct person_inf
{  
  char name[NAME_MAX];
  char gender[GENDER_MAX];
  char number[NUMBER_MAX];
  char address[ADDRESS_MAX];
}person_inf;

typedef struct address_book
{
  size_t size;
  person_inf data[SEQLIST_MAX];
}address_book;

//初始化通訊錄
void address_book_init(address_book *book);

//新增資訊
void address_book_add(address_book *book);

//顯示資訊
void address_book_display(address_book *book);

//刪除所有資訊
void address_book_delete_all(address_book *book);

//儲存資訊
void address_book_save(address_book *book);

//載入資訊
void address_book_load(address_book *book);

//修改資訊
void address_book_update(address_book *book);

//刪除資訊
void address_book_delete(address_book *book);

//查詢資訊
void address_book_find(address_book *book);

//銷燬通訊錄
void adderss_book_destory(address_book *book);

#endif

函式的定義

在這裡我們實現了,基本的增刪查改,儲存資訊載入資訊。

#define _CRT_SECURE_NO_WARNINGS

#include "AddressBook.h"

//初始化通訊錄
void address_book_init(address_book *book)
{
  if(book == NULL)
  {
    return ;
  }
  book->size = 0;
}

//新增資訊
void address_book_add(address_book *book)
{
  size_t cur = 0;
  if(book == NULL)
  {
    printf("book is NULL\n");
    return ;
  }
  cur = book->size;
  ++book->size;
  printf("新增資訊\n");
  printf("請輸入要新增的姓名\n");
  scanf("%s",book->data[cur].name);
  printf("請輸入要新增的性別\n");
  scanf("%s",book->data[cur].gender);
  printf("請輸入要新增的電話\n");
  scanf("%s",book->data[cur].number);
  printf("請輸入要新增的地址\n");
  scanf("%s",book->data[cur].address);
  printf("新增成功\n");
  return;
}

//顯示資訊
void address_book_display(address_book *book)
{
  size_t j = 0;
  if(book == NULL)
  {
    return ;
  }
  printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n");
  for(j=0; j< book->size; j++)
  {
    printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",j,book->data[j].name,book->data[j].gender,book->data[j].number,book->data[j].address);
  }
}

//儲存資訊
void address_book_save(address_book *book)
{
  size_t i = 0;
  FILE *fp = fopen(FILE_PATH,"w");
  if(book == NULL)
  {
    return ;
  }
  if(fp == NULL)
  {
    printf("開啟檔案失敗\n");
    return ;
  }
  //fprintf(fp,"序號\t\t姓名\t\t性別\t\t電話\t\t地址\n");
  for(i=0; i< book->size; i++)
  {
    fprintf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,book->data[i].gender,book->data[i].number,book->data[i].address);
  }
  fclose(fp);
}

//載入資訊
void address_book_load(address_book *book)
{
  size_t len = 0;
  size_t i = 0;
  FILE *fp = fopen(FILE_PATH,"r");

  if(book == NULL)
  {
    return ;
  }
  if(fp == NULL)
  {
    printf("開啟檔案失敗\n");
    return ;
  }
  // 把游標移動到檔案末尾
  fseek(fp,SEEK_END);
  // 從游標到檔案首偏移的位元組數
  len = ftell(fp);
  if(len == 0)
  {
    printf("通訊錄為空\n\n");
    return ;
  }
  // rewind函式是將fp指標指向檔案的開始
  rewind(fp);
  while(!feof(fp))
  {
    fscanf(fp,&i,book->data[book->size].name,//name是陣列,在呼叫陣列名時候降級為指標
      book->data[i].gender,book->data[book->size].number,book->data[book->size].address);
    i++;
    ++book->size;
  }
  fclose(fp);
}


//修改資訊
void address_book_update(address_book *book)
{
  size_t i = 0;
  if(book == NULL)
  {
    return ;
  }
  printf("請輸入要修改的編號\n");
  scanf("%u",&i);
  if(i > book->size || i < 0)
  {
    printf("輸入為非法值\n");
    return ;
  }
  printf("修改資訊\n");
  printf("姓名修改為\n");
  scanf("%s",book->data[i].name);
  printf("性別修改為\n");
  scanf("%s",book->data[i].gender);
  printf("修改電話為\n");
  scanf("%s",book->data[i].number);
  printf("地址修改為\n");
  scanf("%s",book->data[i].address);
  printf("修改成功\n");
  return ;
}


//刪除資訊
void address_book_delete(address_book *book)
{
  size_t i = 0;
  if(book == NULL)
  {
    return ;
  }
  printf("請輸入要刪除的編號\n");
  scanf("%u",&i);
  if(i > book->size)
  {
    printf("輸入為非法值\n");
    return ;
  }
  while(i < book->size)
  {
    book->data[i] = book->data[i+1];
    i++;
  }
  book->size--;
  printf("刪除成功\n");
  return;
}

//刪除所有資訊
void address_book_delete_all(address_book *book)
{
  if(book == NULL)
  {
    return ;
  }
  book->size = 0;
}

//查詢資訊
void address_book_find(address_book *book)
{
  int flag = 0;
  size_t i = 0;
  int choice = 0;
  char f_name[50];
  char f_number[50];
  if(book == NULL)
  {
    //book為空指標;
    return ;
  }
  printf("請輸入要查詢的方式\n");
  printf("************************\n");
  printf("*1.姓名查詢 2.電話號查詢\n");
  printf("************************\n");
  scanf("%d",&choice);
  if (choice == 1)
  {
    //姓名查詢
    printf("請輸入查詢的姓名或者關鍵字\n");
    scanf("%s",f_name);
    printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n");
    while(i < book->size)
    {
      if(strstr(book->data[i].name,f_name)) //用strstr函式來查關鍵字
      {
        flag = 1;
        printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",book->data[i].address);
      }
      i++;
    }
    if(flag == 0)
    printf("未查詢到\n");
  }
  else if (choice == 2)
  {
    //電話號碼查詢
    printf("請輸入查詢的電話號或者關鍵號碼\n");
    scanf("%s",f_number);
    printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n");
    while(i < book->size)
    {
      if(strstr(book->data[i].number,f_number))
      {
        flag = 1;
        printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",book->data[i].address);
      }
      i++;
    }
    if(flag == 0)
    {
      printf("未查詢到\n");
    }
  }
  else
  {
    printf("選擇錯誤\n");
  }
}

/*fseek(fp,100L,0);把檔案內部指標移動到離檔案開頭100位元組處;
fseek(fp,1);把檔案內部指標移動到離檔案當前位置100位元組處;
fseek(fp,-100L,2);把檔案內部指標退回到離檔案結尾100位元組處。

ftell(fp);利用函式 ftell() 也能方便地知道一個檔案的長。
如以下語句序列: fseek(fp,0L,SEEK_END); len =ftell(fp)+1; 
首先將檔案的當前位置移到檔案的末尾,然後呼叫函式ftell()獲得當前
位置相對於檔案首的位移,該位移值等於檔案所含位元組數。
*/

//銷燬通訊錄
void adderss_book_destory(address_book *book)
{
  FILE *fp = fopen(FILE_PATH,"w");
  if(book == NULL)
  {
    return ;
  }
  if(fp == NULL)
  {
    printf("開啟檔案失敗\n");
    return ;
  }
  fseek(fp,SEEK_SET);
  rewind(fp);
  fclose(fp);
  printf("銷燬成功\n");
}

主函式的實現(主要的框架)

實現是採用列舉來標識要使用哪種功能,其中要注意的是,我們在將程式執行起來時候就需要載入我們的以前檔案中的資訊。還有就是我們要在每次新增一條資訊,或者刪除,修改都需要儲存,既記憶體中和IO檔案中儲存寫入一次

enum
{
  EXIT,DISPLAY,ADD,UPDATE,Y_DELETE,FIND,DESTORY
};

//選單
void menu()
{
  int choice = 0;
  address_book book;
  address_book_init(&book);
  address_book_load(&book);
  while(1)
  {
    printf("===============================\n");
    printf("1.顯示通訊錄\n");
    printf("2.新增\n");
    printf("3.修改\n");
    printf("4.刪除\n");
    printf("5.查詢\n");
    printf("6.銷燬\n");
    printf("0.退出\n");
    printf("===============================\n");
    scanf("%d",&choice);
    system("cls");
    switch (choice)
    {
      case DISPLAY:
        address_book_display(&book);
        break;
      case ADD:
        address_book_add(&book);
        address_book_save(&book);
        break;
      case UPDATE:
        address_book_update(&book);
        address_book_save(&book);
        break;
      case Y_DELETE:
        address_book_delete(&book);
        address_book_save(&book);
        break;
      case FIND:
        address_book_find(&book);
        break;
      case DESTORY:
        adderss_book_destory(&book);
        address_book_delete_all(&book);
        break;
      case EXIT:
        return ;
        break;
      default:
        printf("輸入值非法\n");
        break;
    }
  }

}

int main()
{
  menu();
  return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。