多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)

  readme.txt //作为一个程序员,我们咋么能不写用户手册呢!MSP的我觉得用户体验是王道,苹果手机的用户体验的确不错!不过WP加油!我去,扯远了!赶紧看我的程序吧!   歡迎使用多功能電子通訊錄V1.0版本        如有BUG敬請原諒     make  之後便可以使用     ./ebook  運行本程序      make clean 清理本程序中間文件     make cleanall 清除所有非源程序文件  PS:我本想直接给大家看代码的,但是在这个过程中,重要不仅仅是代码,首先你要在你的脑海有一个大体的框架,你打算咋么写?如何去写得更加规范化,当然我自己写的地方也有不好的地方,纵观全局,你打算使用什么来实现,比如,我特喜欢把一个系统模块化!第一个,链表操作吧,好那我就给一个文件专门用来存放链表的函数,第二个,该是界面吧!那我就拿个HELP.C专门来存放它的函数等等,有人就奇怪了,你把那些模块化了,咋么组装起来?声明都文件吗?每个都带一个,不错 这是个方法,但是你的写多少个头文件呢来声明函数呢?不要忘了编译器只是找你的MIAN函数的入口,我们直接用makefile把他们连起来就行了!头文件只用用来定义我们的数据结构,方便我们的函数调用!  还有一个思想也是非常重要的,不要一蹴而就!我们不是大神,更不要说C本来就是一个有缺陷的语言,因而,你如何去完善及调试C,那才是我们应该关注的要点!而不是代码的本身!好了,这回我的废话真的结束了!  1 首先大家看到的是我定义的一个data.h的头文件,我在头文件中写好了数据框架和应当包括的头文件!这个程序大概写了3天,
  2 #ifndef __DATA__
  3 #define __DATA__
  4 #define MAXSIZE 100
  5 #include<stdio.h>
  6 #include<stdlib.h>
  7 #include<string.h>
  8 #include<sys/types.h>
  9 #include<sys/stat.h>
 10 #include <fcntl.h>
 11 struct node
 12 {
 13     int id;    //ID
 14     char name[MAXSIZE];  //姓名
 15     char phone[MAXSIZE]; //電話
 16     char add[MAXSIZE];   //公司地址
 17     char comp[MAXSIZE];  //公司電話
 18
 19     struct node *pr;
 20     struct node *next;
 21 };
 22 typedef struct node Node;
 23 typedef struct node* link;
 24 #endif
 25 这边呢!就是我写的主函数了!具体的功能,将在这个文件中一一诉述!
 26 /****************************************************************************
 27 *                          函數列表                                         *
 28 *                   int insert_cmd() 命令選擇                               *
 29 *                   int input_num_ok(char *temp) 判斷數字                   *
 30 *                   int  input_char_ok(char *temp) 判斷字符                 *
 31 *                   link   input_list()   輸入數據                          *
 32 *                   int  is_choose(char ch) 選擇查詢模式                    *
 33 ****************************************************************************/
 34 #include"data.h"//调用自己定义的头文件
 35
 36 int insert_cmd()
 37 {
 38    char cmd[MAXSIZE];
 39    printf("请输入相应的命令:(提示:INSERT/DISPLAY/SEARCH/DELETE/EXIT:)\n");
 40    scanf("%s",cmd);
 41    if( strcmp(cmd,"INSERT") == 0)
 42      {
 43         return 1;//INSERT  CMD ID
 44      }
 45      else if( strcmp(cmd ,"DISPLAY") == 0)
 46      {
 47          return 2;//DISPLAY CMD ID
 48      }
 49      else if( strcmp(cmd , "SEARCH") == 0)
 50      {
 51          return 3;//SEARCH CMD ID
 52      }
 53      else if( strcmp(cmd , "DELETE") == 0)
 54      {
 55          return 4;//EDLETE CMD ID
 56      }
 57      else if( strcmp(cmd , "EXIT") == 0)
 58      {
 59          return 5;//EXIT CMD ID
 60      }
 61      else
 62      {
 63          return 0;//ERROR CMD ID
 64      }
 65
 66 }
 67
 68 int input_num_ok(char *temp) //0~9返回1 其他直接返回0
 69 {
 70     int len = strlen(temp);
 71       int i;
 72     for(i = 0; i < len; i++)
 73      {
 74          if(temp[i] >= ‘0‘&&temp[i] <= ‘9‘ )
 75          {
 76          }
 77          else
 78          {
 79               return 0;
 80          }
 81      }
 82     return 1;
 83 }
 84 int input_char_ok(char *temp) //a~z或者A~Z返回1 其他直接返回0
 85 {
 86     int len = strlen(temp);
 87       int i;
 88     for(i = 0; i < len; i++)
 89      {
 90          if((temp[i] >= ‘a‘&&temp[i] <= ‘z‘)||(temp[i] >= ‘A‘&&temp[i] <= ‘Z‘ ))
 91          {
 92          }
 93          else
 94          {
 95               return 0;
 96          }
 97      }
 98     return 1;
 99 }
100 link input_list()
101 {
102    link temp;
103    is_malloc_ok(&temp);
104    char tempchar[MAXSIZE];
105    printf("请输入您好友的名字(名字必须英文):\n");
106    scanf("%s",tempchar);
107    int flag = 0;
108    flag = input_char_ok(tempchar);
109    while(flag != 1)
110    {
111      printf("您输入的名字有误!请重新输入您好友的名字(名字必须英文):\n");
112      scanf("%s",tempchar);
113      flag = input_char_ok(tempchar);
114    }
115    strcpy(temp->name,tempchar);
116    printf("请输入您想要设置的ID(该ID必须0~300):\n");
117    scanf("%d",&temp->id);
118    while(temp->id < 0 || temp->id > 300)
119    {
120        printf("您输入的ID已经超过了限定ID,请重新输入ID:\n");
121        scanf("%d",&temp->id);
122    }
123    printf("请输入您好友的手机号码:\n");
124    scanf("%s",tempchar);
125      flag = 0;
126      flag = input_num_ok(tempchar);
127    while(flag != 1)
128    {
129      printf("您输入的手机号码有误!请重新输入号码(号码必须为数字):\n");
130      scanf("%s",tempchar);
131      flag = input_num_ok(tempchar);
132    }
133    strcpy(temp->phone,tempchar);
134    printf("请输入公司地址:\n");
135    scanf("%s",temp->add);
136    printf("请输入公司电话(电话须为数字):\n");
137    scanf("%s",tempchar);
138    flag = 0;
139    flag = input_num_ok(tempchar);
140    while(flag != 1)
141    {
142      printf("您输入的公司电话有误!请重新输入公司电话(号码必须数字):\n");
143      scanf("%s",tempchar);
144      flag = input_num_ok(tempchar);
145    }
146    strcpy(temp->comp,tempchar);
147    return temp;
148 }
149 int is_choose(char ch)
150 {
151     while(1)
152     {
153         if(ch == ‘i‘ || ch ==‘I‘)
154             {
155                 return 0;
156             }
157             if(ch == ‘N‘ || ch == ‘n‘)
158             {
159                     return 1;
160             }
161         printf("请正确输入!\n");
162         scanf("%c",&ch);
163     }
164 }
165 int main()
166 {
167     system("clear");
168     insert_help();//包含在help.c文件中的函数
169     link head;
170     link newnode;
171     create_list(&head);//包含在looplist.c文件的函数
172     int fd; //file id文件描述符!
173
174     int cmdid;
175     char sc;//用于判断查询的模式
176     int id;
177     char name[MAXSIZE];
178     fd = is_open_creat("data.txt",O_RDONLY|O_CREAT,0755);//文件编程 打开或者创建一个文件
179    // null_fd = is_open_creat("null.txt",O_RDWR|O_CREAT,0755);
180     int count = 0;
181     count = read_countline(fd);//我是以行读取文件中的内容的!因为要判定data.txt文件中有多少行
182     lseek(fd,0,SEEK_SET);
183     int i = 0;
184     for(i = 0; i < count; i++)
185     {
186        analysis(fd,&head);//解析文件内容
187     }
188     cmdid = insert_cmd();
189     while(cmdid != 5) //主程序
190     {
191        switch(cmdid)
192        {
193            case 1:
194                       {
195                          system("clear");
196                       is_malloc_ok(&newnode);
197                       newnode = input_list();
198                       insert_list(&head,&newnode);
199                       sleep(1);
200                       break;
201                      }
202            case 2:
203                       {
204                              system("clear");
205                              display_list(&head);//凡带list的函数都是我调用了looplist.c的文件函数
206                              printf("请按回车键返回首页");
207                              getchar();
208                              getchar();
209                        break;
210                      }
211            case 3:
212                       {
213                          system("clear");
214                          printf("请选择你所需要搜索的模式 ID搜素请输入I或者i  名字搜索请输入N或者n\n");
215                          scanf("%c",&sc);
216                          if(is_choose(sc) == 0)
217                              {
218                                  printf("请输入要搜素的ID号\n");
219                                  scanf("%d",&id);
220                                  display_id(&head,id);
221                           }
222                           else
223                               {
224                                   printf("请输入要搜索的名字\n");
225                                    scanf("%s",name);
226                                   display_name(&head,name);
227                               }
228                           printf("请按回车键返回首页");
229                               getchar();
230                               getchar();
231                         break;
232                      }
233            case 4:
234                      {
235                          system("clear");
236                          printf("你想删除谁?请输入他的名字!\n");
237                          scanf("%s",name);
238                          display_name(&head,name);//这是调用了search.c的函数
239                         printf("已找到你想删除的人,注意:如果您的通讯录本来就为空,請不要輸入Y!\n");
240                         printf("您是否要刪除?確定請輸入Y,取消请输入N\n");
241                         char chcmd;
242                        scanf("%c",&chcmd);
243                        while(chcmd != ‘N‘)
244                        {
245                         if(chcmd == ‘Y‘||chcmd == ‘y‘)
246                         {
247                              printf("請輸入對應的ID!\n");
248                              scanf("%d",&id);
249                              delete_list(&head,id);
250                              break;
251                         }
252                         scanf("%c",&chcmd);
253                        }
254
255                           printf("请按回车键返回首页");
256                               getchar();
257                               getchar();
258                         break;
259
260                      }
261            case 5:
262                      {
263                          system("clear");
264                          printf("tui chu chengxue");
265                          sleep(2);
266                        break;
267                     }
268            case 0:
269                      {
270                      printf("你所输入的命令不正确,等待1秒后,请重新输入!\n");
271                      sleep(1);
272                      break;
273                     }
274        }
275         system("clear");
276           insert_help();
277           cmdid = insert_cmd();
278       }
279       close(fd);
280    FILE *fp;
281    fp = fopen("data.txt","w");
282    fd = fileno(fp);
283     lseek(fd,0,SEEK_SET);
284     write_all(fd,&head);
285     close(fd);
286     //close(null_fd);
287        return 0;
288 }
289 好了,下面大家将看看到我写的一些用makefile关联起来的一些文件这个就是file.c文件 用于解析文件内容和文件操作的函数
290 #include"data.h"
291
292 int is_open_creat(char *filename,int flags,mode_t mode)
293 {
294     int fd;
295     if((fd = open(filename,flags,mode)) < 0)
296     {
297         perror("can‘t open  file");
298         exit(1);
299     }
300     return fd;
301 }
302
303 int is_open(char *filename,int flags)
304 {
305     int fd;
306     if((fd = open(filename,flags)) < 0)
307     {
308         perror("can‘t open file");
309         exit(1);
310     }
311 }
312 int is_read(int fd,char *buf,int maxsize)
313 {
314     int btye;
315     if((btye = read(fd,buf,maxsize)) < 0)
316     {
317         perror("can‘t read this file");
318         exit(1);
319     }
320     return btye;
321 }
322 int read_countline(int fd)
323 {
324     int count = 0;
325     int btye;
326     char buf[1024];
327     btye = is_read(fd,buf,1024);
328     int i = 0;
329     for(i = 0; i < btye; i++)
330     {
331         if(buf[i] == ‘\n‘)
332         {
333             count++;
334         }
335     }
336     return count;
337
338 }
339 int read_line(int fd,char *buf,int maxsize)
340 {
341     int i;
342     char ch;
343     for(i = 0; i < maxsize - 1; i++)
344     {
345         if(read(fd,&ch,1) < 0)
346         {
347             perror("can‘t read this file");
348             exit(1);
349         }
350         if(ch == ‘\n‘)
351         {
352             buf[i] = ‘\0‘;
353             return i;
354         }
355         buf[i] = ch;
356     }
357     buf[i] = ‘\0‘;
358     return maxsize;
359 }
360 void analysis(int fd,link *head)
361 {
362     link temp;
363     is_malloc_ok(&temp);
364     char buf[1024];
365     char ptr[1024];
366     int size;
367     size = read_line(fd,buf,1024);
368     int i = 0;
369     int count = 0;
370     while(buf[i] != ‘:‘)
371     {
372         ptr[count++] = buf[i++];
373     }
374     ptr[count] = ‘\0‘;
375     i++;
376     count = 0;
377     temp->id = atoi(ptr);
378     while(buf[i] != ‘:‘)
379     {
380         ptr[count++] = buf[i++];
381     }
382     ptr[count] = ‘\0‘;
383     count = 0;
384     i++;
385     strcpy(temp->name,ptr);
386     while(buf[i] != ‘:‘)
387     {
388         ptr[count++] = buf[i++];
389     }
390     ptr[count] = ‘\0‘;
391     count = 0;
392     i++;
393     strcpy(temp->phone,ptr);
394     while(buf[i] != ‘:‘)
395     {
396         ptr[count++] = buf[i++];
397     }
398     ptr[count] = ‘\0‘;
399     count = 0;
400     i++;
401     strcpy(temp->add,ptr);
402     while(buf[i] != ‘:‘)
403     {
404         ptr[count++] = buf[i++];
405     }
406     ptr[count] = ‘\0‘;
407     count = 0;
408     strcpy(temp->comp,ptr);
409     insert_list(head,&temp);
410 }
411 int is_write(int fd,char *buf,int maxsize)
412 {
413     int btye;
414     if((btye = write(fd,buf,maxsize)) < 0)
415     {
416         perror("can‘t write this file");
417         exit(1);
418     }
419     return btye;
420 }
421
422 FILE *is_fopen(const char *fname,const char *mode)
423 {
424     FILE *fp;
425     if((fp = fopen(fname,mode)) == NULL)
426     {
427         perror("无法打开信息文件!请检查信息文件是否安全!");
428         exit(1);
429     }
430     return fp;
431 }
432 void write_data(int fd,link *newnode)
433 {
434     char buf[1024];
435     int id;
436     int i = 0;
437     id = (*newnode)->id;
438     if( id <= 9)
439     {
440        buf[i++] = id + ‘0‘;
441        buf[i++] = ‘:‘;
442     }
443     else if(id > 9 && id <= 99)
444     {
445         buf[i++] = id / 10 + ‘0‘;
446         buf[i++] = id % 10 + ‘0‘;
447         buf[i++] = ‘:‘;
448     }
449     else
450     {
451         buf[i++] = id / 100 + ‘0‘;
452         buf[i++] = id % 100 / 10 + ‘0‘;
453         buf[i++] = id % 10 + ‘0‘;
454         buf[i++] = ‘:‘;
455     }
456     int j = 0;
457     while((*newnode)->name[j] != ‘\0‘)
458     {
459         buf[i++] = (*newnode)->name[j++];
460     }
461     j = 0;
462     buf[i++] = ‘:‘;
463     while((*newnode)->phone[j] != ‘\0‘)
464     {
465         buf[i++] = (*newnode)->phone[j++];
466     }
467     j = 0;
468     buf[i++] = ‘:‘;
469     while((*newnode)->add[j] != ‘\0‘)
470     {
471         buf[i++] = (*newnode)->add[j++];
472     }
473     j = 0;
474     buf[i++] = ‘:‘;
475     while((*newnode)->comp[j] != ‘\0‘)
476     {
477         buf[i++] = (*newnode)->comp[j++];
478     }
479     j = 0;
480     buf[i++] = ‘:‘;
481     buf[i++] = ‘\n‘;
482     is_write(fd,buf,i);
483 }
484 void write_all(int fd,link *head)
485 {
486    link temp = (*head)->next;
487    if(temp == *head)
488    {
489        printf("您的通讯录是空的!\n");
490    }
491    while(temp != *head)
492    {
493         write_data(fd,&temp);
494         temp = temp->next;
495    }
496    printf("已经录入文件完毕\n");
497 }    这个就是我的help.c文件主要是为了显示我的主界面,display在我的主函数中 没有用到,仅仅是用来调用调试的!
498 /***************************************************
499 *                     函數列表                     *
500 *                insert_help() 幫助界面顯示        *
501 *                 display(link *temp) 查看數據     *
502 ***************************************************/
503 #include"data.h"
504 void insert_help()
505 {
506    printf("\033[;35m \t************************多功能电子通讯录*********************************\n\033[0m");
507    printf("\033[;35m \t*                           功能介绍                                    *\n\033[0m");
508    printf("\033[;35m \t*                        A、添加好友信息                                *\n\033[0m");
509    printf("\033[;35m \t*                        B、列表好友信息                                *\n\033[0m");
510    printf("\033[;35m \t*                        C、搜索好友信息                                *\n\033[0m");
511    printf("\033[;35m \t*                        D、删除好友信息                                *\n\033[0m");
512    printf("\033[;35m \t*         如在本界面出现录入成功,表示正在读取文件信息                  *\n\033[0m");
513    printf("\033[;35m \t**************************欢迎您的使用***********************************\n\033[0m");
514 }
515 void display(link *temp)
516 {
517         printf("\033[;32m \t********************您的联系人的基本信息*********************************\n\033[0m");
518         printf("\033[;32m \t*                         ID = %d                                       \n\033[0m",(*temp)->id);
519         printf("\033[;32m \t*                       姓名:%s                                        \n\033[0m",(*temp)->name);
520         printf("\033[;32m \t*                       电话号码:%s                                   \n\033[0m",(*temp)->phone);
521         printf("\033[;32m \t*                       公司地址:%s                                    \n\033[0m",(*temp)->add);
522         printf("\033[;32m \t*                       公司电话:%s                               \n\033[0m",(*temp)->comp);
523         printf("\033[;32m \t*************************************************************************\n\033[0m");
524 }这是looplist.c文件用来对我的双向链表进行相应的操作!
525 /***************************************************************
526 *                      函數列表                                *
527 *           void  is_malloc_ok(link *list)判斷空間分配         *
528 *           void  create_list(link *list) 創建鏈表             *
529 *             int  insert_list(link *head,link*newnode)錄入信息*
530 *           void display_list(link *head)遍歷鏈表              *
531 *           int delete_list(link *head,int num)刪除節點        *
532 ***************************************************************/
533 #include"data.h"
534 #define MALLOC_ERROR -1
535 #define MALLOC_SUCCSE 0
536 void is_malloc_ok(link *list)
537 {
538    *list = (link)malloc(sizeof(Node));
539    if(*list == NULL)
540    {
541        exit(MALLOC_ERROR);
542    }
543 }
544
545 void create_list(link *list)
546 {
547   is_malloc_ok(list);
548   (*list)->next = (*list);
549   (*list)->pr = (*list);
550 }
551 int insert_list(link *head,link *newnode)
552 {
553     link temp = (*head)->next;
554     while(temp != *head)
555     {
556         if((*newnode)->id < temp->id)
557         {
558        (*newnode)->next = temp;
559              (*newnode)->pr = temp->pr;
560              (temp->pr)->next = *newnode;
561              temp->pr = *newnode;
562              printf("\t\t\t录入信息成功!\n");
563              return 0;
564         }
565         temp = temp->next;
566     }
567     (*newnode)->next = temp;
568     (*newnode)->pr = temp->pr;
569     (temp->pr)->next = *newnode;
570     temp->pr = *newnode;
571     printf("\t\t\t录入信息成功!\n");
572     return 0;
573 }
574 void display_list(link *head)
575 {
576    link temp = (*head)->next;
577    if(temp == *head)
578    {
579        printf("您尚未录入任何信息\n");
580    }
581    while(temp != *head)
582    {
583         printf("\033[;32m \t********************您的联系人的基本信息*********************************\n\033[0m");
584         printf("\033[;32m \t*                         ID = %d                   \n\033[0m",temp->id);
585         printf("\033[;32m \t*                       姓名:%s                     \n\033[0m",temp->name);
586         printf("\033[;32m \t*                       电话号码:%s                 \n\033[0m",temp->phone);
587         printf("\033[;32m \t*                       公司地址:%s                \n\033[0m",temp->add);
588         printf("\033[;32m \t*                       公司电话:%s               \n\033[0m",temp->comp);
589         printf("\033[;32m \t*************************************************************************\n\033[0m");
590         temp = temp->next;
591    }
592
593 }
594
595 int delete_list(link *head,int num)
596 {
597      link temp = (*head)->next;
598      while(temp != *head)
599      {
600          if(temp->id == num)
601        {
602         (temp->pr)->next = temp->next;
603         (temp->next)->pr = temp->pr;
604         free(temp);
605         temp->next = NULL;
606         printf("\t\t刪除成功!\n");
607         return 0;
608        }
609          temp = temp->next;
610      }
611      return -1;这是search.c文件 用于操作搜索!
612 }/***************************************************************
613 *                            函數列表                          *
614 *      void display_id(link *head,int id)ID查詢                *
615 *      void display_name(link *head,char *name)名字查詢        *
616 ***************************************************************/
617 #include"data.h"
618 void display_id(link *head,int id)
619 {
620     int flag = 0;
621    link temp = (*head)->next;
622    if(temp == *head)
623    {
624        printf("您的通讯录是空的!\n");
625    }
626    printf("\t\t以下为ID寻找方式得到的信息\n");
627    while(temp != *head)
628    {
629        if(temp->id == id)
630            {
631        printf("\033[;32m \t********************您的联系人的信息*********************************\n\033[0m");
632         printf("\033[;32m \t*                         ID = %d                   \n\033[0m",temp->id);
633         printf("\033[;32m \t*                       姓名:%s                     \n\033[0m",temp->name);
634         printf("\033[;32m \t*                       电话:%s                 \n\033[0m",temp->phone);
635         printf("\033[;32m \t*                       公司地址:%s                \n\033[0m",temp->add);
636         printf("\033[;32m \t*                       公司电话:%s               \n\033[0m",temp->comp);
637         printf("\033[;32m \t********************************************************************\n\033[0m");
638         flag = 1;
639           }
640         temp = temp->next;
641    }
642   if(flag == 0)
643       {
644           printf("查无此人!\n");
645       }
646 }
647 void display_name(link *head,char *name)
648 {
649     int flag = 0;
650    link temp = (*head)->next;
651    if(temp == *head)
652    {
653        printf("您的联系簿中是空的\n");
654    }
655    printf("以下为按照名字查询所得信息\n");
656    while(temp != *head)
657    {
658        if(strcmp(name,temp->name) == 0)
659            {
660        printf("\033[;32m \t********************您的联系人信息*********************************\n\033[0m");
661         printf("\033[;32m \t*                         ID = %d                   \n\033[0m",temp->id);
662         printf("\033[;32m \t*                       姓名:%s                     \n\033[0m",temp->name);
663         printf("\033[;32m \t*                       电话:%s                 \n\033[0m",temp->phone);
664         printf("\033[;32m \t*                       公司地址:%s                \n\033[0m",temp->add);
665         printf("\033[;32m \t*                       公司电话:%s               \n\033[0m",temp->comp);
666         printf("\033[;32m \t*************************************************************************\n\033[0m");
667         flag = 1;
668         }
669     temp = temp->next;
670    }
671    if(flag == 0)
672    {
673        printf("查无此人!");
674    }
675 }
676 这是我写的makefile文件:
677 main = help.o ebook.o looplist.o search.o file.o
678 ebook:$(main)
679     @gcc $(main) -o ebook
680 main.o: main.c
681     @gcc main.c -c
682 help.o: help.c
683     @gcc help.c -c
684 looplist.o: looplist.c
685     @gcc looplist.c -c
686 search.o:search.c
687     @gcc search.c -c
688 file.o:file.c
689     @gcc file.c -c
690 .PHONY: clean cleanall
691 clean:
692     @rm *.o
693 cleanall:
694     @rm *.o ebook

多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等),布布扣,bubuko.com

时间: 2024-10-06 06:00:39

多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)的相关文章

Tomcat启动过程原理详解 -- 非常的报错:涉及了2个web.xml等文件的加载流程

Tomcat启动过程原理详解 发表于: Tomcat, Web Server, 旧文存档 | 作者: 谋万世全局者 标签: Tomcat,原理,启动过程,详解 基于Java的Web 应用程序是 servlet.JSP 页面.静态页面.类和其他资源的集合,它们可以用标准方式打包,并运行在来自多个供应商的多个容器(诸如tomcat).Web 应用程序存在于结构化层次结构的目录中,该层次结构是由 Java Servlet 规范定义的.Web 应用程序的根目录包含直接存储或存储在子文件夹中的所有公共资源

C语言可以开发哪些项目?(转)

原文地址:https://www.cnblogs.com/shiyanlou/p/6098661.html 知乎:https://www.zhihu.com/question/20564904 C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程中不知道如何学.学什么,所以,总结这个列表,希望对C语言初学者可以有所帮助~ C语言可以做什么? 从最简单

利用AddressBook.framework框架获取iOS系统通讯录数据

此方法是使用AddressBook.framework框架获取通讯录信息 第一步.在info.plist文件里面配置访问权限 第二步.导入头文件 1 #import <AddressBook/AddressBook.h> 2 #import <AddressBookUI/AddressBookUI.h> 第三步.获取通讯录数据 1 - (void)getSystemAddress{ 2 3 //新建一个通讯录类 4 ABAddressBookRef addressBooks = n

Android通讯录数据库介绍与基本操作(增删改查)

Android通讯录数据库介绍与基本操作(增删改查) 2014年2月21日 Android通讯录管理总结 这几天导师安排我一个任务就是研究一下Android通讯录获取联系人.通话记录.短信的方法,还有看看不同Android版本之间的异同是否能做到兼容之类的事情.Android通讯录这一块,我个人感觉是挺乱的,网上一堆关于查询本地数据库获取联系人的方法,但似乎都没有仔细说明数据有哪些重要的表,它们之间有什么联系.下面是本人查询资料总结的一下知识点,方便童鞋们以后用到. http://xys2891

黑马程序员---C基础15【通讯录应用】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [通讯录应用] 1 // 2 //  main.c 3 //  15_通讯录 4 // 5 //  Created by snowimba on 15/9/28. 6 //  Copyright © 2015年 snowimba. All rights reserved. 7 // 8 9 //引入头文件 10 #include <stdio.h> 11 #include <strin

多版本通讯录

开始写通讯录已经好久了,才把通讯录的多个版本整理完,下边我来谈谈实现通讯录过程中的一些问题,以及自己的心 得,另外附加代码. 通讯录要求: 1.增加信息   2.删除信息    3.查找信息  4.修改信息 5.显示信息   6.清除信息  7.按姓名排序  0.退出 我觉得,写代码之前一定要想清楚自己要实现的功能,应该怎么实现,大致应该清楚这些. 首先,静态通讯录,给出通讯录存储元素的总大小,通讯录里最多只能存储这么多信息.而通讯录的增删改查,通常 需要找到通讯录的最后一个元素的位置,或者是元

iphone通讯录的备份与恢复

最近在做iOS系统通讯录备份到服务器,并且可以从服务器中下载备份文件恢复到手机的功能,部分实现细节记录如下. 将iphone系统通讯录生成.vcf文件 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook); CFDataRef vcards = (CFDataRef)ABPersonCreateVCardR

双向链表实现队列与循环链表

一.双向链表(double linked list)如图26.5,是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.双向链表的基本操作与单链表基本一样,除了插入和删除的时候需要更改两个指针变量,需要注意的是修改的顺序很重要,插入如图3-14-5,删除如图3-14-6. 链表的delete操作需要首先找到要摘除的节点的前趋,而在单链表中找某个节点的前趋需要从表头开始依次查找,对于n个节点的链表,删除操作的时间复杂度为O(n).可以想像得到,如果每个节点再维护一个指向前趋的指针,删除操作就像

工作中涉及运维知识点的汇总

对工作中常见运维知识点的一个简单汇总 0)设置阿里云pip源,加速pip更新速度 mkdir ~/.pip #创建文件夹 vi ~/.pip/pip.conf #添加如下内容 [global]index-url=https://mirrors.aliyun.com/pypi/simple/[install]trusted-host=mirrors.aliyun.com 如果是临时使用,在使用的时候,也可以采用如下方式: pip install django -i http://mirrors.a