c program

来源:互联网 发布:捷易通软件可靠吗 编辑:程序博客网 时间:2024/05/17 23:33

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

#define MaxRec 10
typedef struct
{
 char num[4];
 int offset;
} IdxType;

typedef struct
{
 char num[4];
 char name[8];
 char sex;
 int age;
 char address[12];
 char department[12];
 char speciality[12];
}StudType;

void GetMainFile()
{
 int n = 2;
 FILE *mfile;
 StudType st[MaxRec] = {{"106", "WangHua", 'f', 23, "new street", "science", "Computer"},
       {"123", "HanLie", 'M', 24, "Old Street", "Culture", "China"}};
 if((mfile = fopen("main.file", "wb")) == NULL)
 {
  printf("  >>CAN'T OPEN MAIN DATA FILE!/n");
  exit(0);
 }

 fwrite(st, sizeof(StudType), n, mfile);
 fclose(mfile);
}

void DispMainFile()
{
 int i, n, len;
 FILE *mfile;
 StudType st;
 if((mfile = fopen("main.file", "rb")) == NULL)
 {
  printf("    >>CAN'T OPEN MAIN DATA FILE!/n");
  exit(0);
 }

 fseek(mfile, 0, SEEK_END);
 len = ftell(mfile);
 n = len / sizeof(StudType);
 rewind(mfile);
 printf("    >>MAIN DATA FILE:/n");
 for(i = 0; i < n; i++)
 {
  fread(&st, sizeof(StudType), 1, mfile);
  printf("    >>%-3d%-5s%-8s%c%3d %-13s%-13s%-13s/n",i + 1, st.num, st.name, st.sex, st.age, st.address,
    st.department, st.speciality);
 }
 
 fclose(mfile);
}

void DispIdxFile()
{
 int i, n, len;
 FILE *idxfile;
 IdxType idx;
 if((idxfile = fopen("index.file", "rb")) == NULL)
 {
  printf(" >>CAN'T OPEN INDEX FILE!/n");
  exit(0);
 }
 
 fseek(idxfile, 0, SEEK_END);
 len = ftell(idxfile);
 n = len / sizeof(IdxType);
 rewind(idxfile);
 printf(" >>INDEX FILE:/n");
   for(i = 0; i < n; i++)
 { 
  fread(&idx, sizeof(IdxType), 1, idxfile);
  printf(" >>%8s%8d/n", idx.num, idx.offset);
 }
 
 fclose(idxfile);
}

void BubbleSort(IdxType idx[], int n)
{
 int i, j;
 IdxType tmp;
 int exchange;
 for(i = 0; i < n - 1; i++)
 {
  exchange = 0;
  for(j = n - 2; j >= i; j--)
  {
   if(strcmp(idx[j + 1].num, idx[j].num) < 0)
   {
    tmp = idx[j + 1];
    idx[j + 1] = idx[j];
    idx[j] = tmp;
    exchange = 1;
   }
   if(exchange == 0)
    return;
  }
 }
}

void BuildIdxFile()
{
 FILE *mfile, *idxfile;
 IdxType idx[MaxRec];
 StudType st;
 int i, len, n, j = 0;

 if((mfile = fopen("main.file", "rb")) == NULL)
 {
  printf(" >>CAN'T OPNE MAIN DATA FILE!/n");
  exit(0);
 }
 if((idxfile = fopen("index.file", "wb")) == NULL)
 {
  printf(" >>CAN'T FOUND INDEX DATA FILE!/n");
  exit(0);
 }
 fseek(mfile, 0, SEEK_END);
 len = ftell(mfile);
 n = len / sizeof(StudType);
 rewind(mfile);
 for(i = 0; i < n; i++)
 {
  fread(&st, sizeof(StudType), 1, mfile);
  strcpy(idx[j].num, st.num);
  idx[j].offset = i + 1;
  j++;
 }
 
 fclose(mfile);
 BubbleSort(idx, n);
 fwrite(idx, sizeof(IdxType), n, idxfile);
 fclose(idxfile);
}
 
void ReadIdxFile(IdxType idx[], int *n)
{
 int len;
 FILE *idxfile;
 if((idxfile = fopen("index.file", "rb")) == NULL)
 {
  printf(" >>CAN'T OPEN INDEX FILE!/n");
  exit(0);
 }
 fseek(idxfile, 0, SEEK_END);
 len = ftell(idxfile);
 rewind(idxfile);
 *n = len / sizeof(IdxType);
 fread(idx, sizeof(IdxType), *n, idxfile);
 fclose(idxfile);
}

int BinSearch(IdxType idx[], int n, char no[])
{
 int mid, low, high, comp;
 low = 0;
 high = n - 1;
 while(low <= high)
 {
  mid = (low + high) / 2;
  comp = strcmp(idx[mid].num, no);
  if(comp > 0)
   high = mid - 1;
  else if(comp < 0)
   low = mid + 1;
  else
   return idx[mid].offset;
 }
 return -1;
}

void Find()
{
 FILE *mfile;
 IdxType idx[MaxRec];
 StudType st;
 char no[4];
 int i, n;
 if((mfile = fopen("main.file", "rb+")) == NULL)
 {
  printf(" >>CAN'T OPEN MAIN DATA FILE!/n");
  exit(0);
 } 
 ReadIdxFile(idx, &n);
 printf(" >>INPUT NUMBER: ");
 scanf("%s", no);
 rewind(mfile);
 i = BinSearch(idx, n, no);
 if(i == -1)
 {
  printf(" >>NOT EXIST STUDENT OF NUMBER!/n");
  exit(0);
 }
 fseek(mfile, (i - 1)*sizeof(StudType), SEEK_SET);
 fread(&st, sizeof(StudType), 1, mfile);
 fseek(mfile, (i - 1) * sizeof(StudType), SEEK_SET);
 printf(" >>%-3d%-5s%-8s%c%3d%-13s%-13s%-13s/n", i, st.num, st.name, st.sex,
  st.age, st.address, st.department, st.speciality);
 fclose(mfile);
}

void Update()
{
 FILE *mfile;
 IdxType idx[MaxRec];
 StudType st;
 char no[4], newaddr[30];
 int i, n;
 if((mfile = fopen("main.file", "rb+")) == NULL)
 {
  printf(" >>CAN'T OPEN MAIN DATA FILE!/n");
  exit(0);
 }
 
 ReadIdxFile(idx, &n);
 printf(" >>INPUT NUMBER:");
 scanf("%s", no);
 rewind(mfile);
 i = BinSearch(idx, n, no);
 if(i == -1)
 {
  printf(" >>NOT EXIST THE STUDENT!/n");
  exit(0);
 }
  
 fseek(mfile, (i - 1) * sizeof(StudType), SEEK_SET);
 fread(&st, sizeof(StudType), 1, mfile);
 printf(" >>NEW ADDRESS:");
 scanf("%s", newaddr);
 strcpy(st.address, newaddr);
 fseek(mfile, (i - 1) * sizeof(StudType), SEEK_SET);
 fseek(mfile, -(long)sizeof(StudType), SEEK_CUR);
 fwrite(&st, sizeof(StudType), 1, mfile);
 printf(" >>%-3d%-5s%-8s%c%3d%-13s%-13s%-13s/n", i, st.num, st.name,
  st.sex, st.age, st.address, st.department, st.speciality);
 fclose(mfile);
}
int main(int argc, char **argv)
{
 int sel = 1;
 while(sel != 0)
 {
  printf("1:NEW 2:DISPLAY MAIN FILE 3:DISPLAY INDEX FILE 4:SELECT 5:CHANGE ADDRESS 0:QUIT/n");
  scanf("%d", &sel);
  switch(sel)
  {
   case 1:
    GetMainFile(); 
    BuildIdxFile();
    break;
   case 2:
    DispMainFile();
    break;
   case 3:
    DispIdxFile();
    break;
   case 4:
    Find();
    break;
   case 5:
    Update();
    break;
  }
 }
 return 0;
}

原创粉丝点击