欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實現(xiàn)一個簡易通訊錄

 更新時間:2020年07月23日 14:12:16   作者:GangStudyIT  
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)一個簡易通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實現(xiàn)一個通訊錄,是基于C語言的IO文件操作、數(shù)據(jù)結(jié)構(gòu)里面的順序表實現(xiàn)。

具體功能

實現(xiàn)了

1、信息的添加
2、信息的顯示
3、信息的修改(修改單一屬性)
4、將內(nèi)存中的信息保存到文件中去
5、將文件中的信息加載到內(nèi)存中(每次程序運行數(shù)據(jù)就會丟失)
6、信息的刪除
7、信息的查找(按照各自的屬性查找)
8、給每一條信息設(shè)置了唯一的標(biāo)識id
9、通訊錄的銷毀

頭文件中的聲明

在c語言中我們采用結(jié)構(gòu)體來記錄每一個人的具體信息
用順序表的數(shù)據(jù)結(jié)構(gòu)來來對數(shù)據(jù)的操作

#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 // 存儲的最大信息數(shù)量
#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

函數(shù)的定義

在這里我們實現(xiàn)了,基本的增刪查改,保存信息加載信息。

#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 ;
 }
 // 把光標(biāo)移動到文件末尾
 fseek(fp,0,SEEK_END);
 // 從光標(biāo)到文件首偏移的字節(jié)數(shù)
 len = ftell(fp);
 if(len == 0)
 {
  printf("通訊錄為空\n\n");
  return ;
 }
 // rewind函數(shù)是將fp指針指向文件的開始
 rewind(fp);
 while(!feof(fp))
 {
  fscanf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",&i,book->data[book->size].name,//name是數(shù)組,在調(diào)用數(shù)組名時候降級為指針
   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("請輸入查找的姓名或者關(guān)鍵字\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函數(shù)來查關(guān)鍵字
   {
    flag = 1;
    printf("%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);
   }
   i++;
  }
  if(flag == 0)
  printf("未查找到\n");
 }
 else if (choice == 2)
 {
  //電話號碼查找
  printf("請輸入查找的電話號或者關(guān)鍵號碼\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",i,book->data[i].name,
    book->data[i].gender,book->data[i].number,
    book->data[i].address);
   }
   i++;
  }
  if(flag == 0)
  {
   printf("未查找到\n");
  }
 }
 else
 {
  printf("選擇錯誤\n");
 }
}

/*fseek(fp,100L,0);把文件內(nèi)部指針移動到離文件開頭100字節(jié)處;
fseek(fp,100L,1);把文件內(nèi)部指針移動到離文件當(dāng)前位置100字節(jié)處;
fseek(fp,-100L,2);把文件內(nèi)部指針退回到離文件結(jié)尾100字節(jié)處。

ftell(fp);利用函數(shù) ftell() 也能方便地知道一個文件的長。
如以下語句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp)+1; 
首先將文件的當(dāng)前位置移到文件的末尾,然后調(diào)用函數(shù)ftell()獲得當(dāng)前
位置相對于文件首的位移,該位移值等于文件所含字節(jié)數(shù)。
*/

//銷毀通訊錄
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,0,SEEK_SET);
 rewind(fp);
 fclose(fp);
 printf("銷毀成功\n");
}

主函數(shù)的實現(xiàn)(主要的框架)

實現(xiàn)是采用枚舉來標(biāo)識要使用哪種功能,其中要注意的是,我們在將程序運行起來時候就需要加載我們的以前文件中的信息。還有就是我們要在每次添加一條信息,或者刪除,修改都需要保存,既內(nèi)存中和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;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)

    基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)

    數(shù)據(jù)結(jié)構(gòu)作為每一個IT人不可回避的問題,本文基于C++編寫,下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C++實現(xiàn)賓館房間管理系統(tǒng)

    C++實現(xiàn)賓館房間管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)賓館房間管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++ main函數(shù)的幾點細(xì)節(jié)

    C++ main函數(shù)的幾點細(xì)節(jié)

    這篇文章主要介紹了C++ main函數(shù)的幾點細(xì)節(jié),幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2020-08-08
  • C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊詳解

    C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊詳解

    這篇文章主要為大家詳細(xì)介紹了C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Qt基于定時器實現(xiàn)動圖展示效果

    Qt基于定時器實現(xiàn)動圖展示效果

    這篇文章主要為大家詳細(xì)介紹了Qt基于定時器實現(xiàn)簡單動圖展示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

    C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

    這篇文章主要為大家詳細(xì)介紹了C語言函數(shù)棧幀的創(chuàng)建與銷毀,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Qt實現(xiàn)UI界面純代碼示例

    Qt實現(xiàn)UI界面純代碼示例

    這篇文章主要給大家介紹了關(guān)于Qt實現(xiàn)UI界面的相關(guān)資料,使用Qt純代碼,實現(xiàn)了基本的界面,對大家學(xué)習(xí)或者使用Qt具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • C++?QT實現(xiàn)獲取本機網(wǎng)卡信息

    C++?QT實現(xiàn)獲取本機網(wǎng)卡信息

    這篇文章主要為大家詳細(xì)介紹了如何利用qt自帶的QNetworkInterface接口以及c++Iphlpapi庫,獲取當(dāng)前windows電腦下的網(wǎng)卡信息,需要的可以參考下
    2024-01-01
  • C++數(shù)據(jù)結(jié)構(gòu)紅黑樹全面分析

    C++數(shù)據(jù)結(jié)構(gòu)紅黑樹全面分析

    今天的這一篇博客,我要跟大家介紹二叉搜索樹中的另一顆樹——紅黑樹,它主要是通過控制顏色來控制自身的平衡,但它的平衡沒有AVL樹的平衡那么嚴(yán)格
    2022-02-02
  • 隊列的動態(tài)鏈?zhǔn)酱鎯崿F(xiàn)代碼分享

    隊列的動態(tài)鏈?zhǔn)酱鎯崿F(xiàn)代碼分享

    DynaLnkQueue.cpp - 動態(tài)鏈?zhǔn)疥犃校搓犃械膭討B(tài)鏈?zhǔn)酱鎯崿F(xiàn)
    2014-02-02

最新評論