C语言实现通讯录管理系统(超详细!-实现动态扩容,文件保存!)

简介: C语言实现通讯录管理系统(超详细!-实现动态扩容,文件保存!)

一、总体思路

       需要什么功能?->1、添加联系人(同时将之前存储号的通讯录文件加载进来) 2、删除联系人 3、查找联系人 4、修改联系人 5、显示所有联系人 6、排序联系人->按什么排序?->年龄?名字? 7、以文件形式保存  8、退出系统(释放空间)

       需要存储什么信息?->1、姓名 2、年龄 3、性别 4、电话号码 5、地址

       要实现的是静态的?(不可扩容)还是动态的?(自动扩容)->动态!

确定基本框架如下:

enum option//功能确定,用于后续Switch
{
  Exit,
  Add,
  Del,
  Search,
  Modify,
  Show,
  Sort
};
typedef struct tp//存储信息
{
  char name[10];
  int age;
  char sex[SEX];
  char telp[TELP];
  char addr[ADDR];
}tp;
typedef struct Contact//动态储存,方便扩容
{
  tp* data;
  int sz;
  int capacity;
}Contact;

  写出函数接口以确定整体的作用->确定以结构体指针的形式传参数

如下:

void InitContact(Contact* p);//初始化
void AddContact(Contact* p);//添加
void ShowContact(Contact* p);//显示
void DelContact(Contact* p);//删除
void SearchContact(Contact* p);//查找
void ModifyContact(Contact* p);//修改
void SortContact(Contact* p);//排序
void DestroyContact(Contact* p);//退出销毁
void SaveContact(Contact* p);//保存文件

 接下来就是写下总体结构以及系统界面->确定以Switch函数来构造

如下:

void menu()
{
  printf("**************************************\n");
  printf("*****1、add   *********2、del   ******\n");
  printf("*****3、search*********4、modify******\n");
  printf("*****5、show  *********6、sort  ******\n");
  printf("*****0、exit  *********         ******\n");
  printf("**************************************\n");
  printf("请选择>");
}
void text()
{
  int input = 0;
  Contact p;
  InitContact(&p);
  do
  {
    menu();
    scanf("%d", &input);
    system("cls");
    switch (input)
    {
    case Add:
      AddContact(&p);
      break;
    case Del:
      DelContact(&p);
      break;
    case Search:
      SearchContact(&p);
      break;
    case Modify:
      ModifyContact(&p);
      break;
    case Show:
      ShowContact(&p);
      break;
    case Sort:
      SortContact(&p);
      //namesort1(&p);
      break;
    case Exit:
      SaveContact(&p);
      DestroyContact(&p);
      printf("退出成功!\n");
      break;
    default:
      printf("输入错误,请重新输入!\n");
      break;
    }
  } while (input);
}
int main()
{
  text();
  return 0;
}

二、各个部分函数实现

1、初始化  InitContact(Contact* p)

void InitContact(Contact* p)
{
  assert(p);
  p->data = (tp*)malloc(sizeof(tp) * TELnum);//calloc
  if (p->data == NULL)
  {
    perror("malloc");
    return;
  }
  memset(p->data, 0, sizeof(p->data));
  p->sz = 0;
  p->capacity = TELnum;
  //文件中保存的信息加载到通讯录中
  LoadContact(p);
}

2、增加联系人 AddContact(Contact* p)

int CheckCapacity(Contact* pc)
{
  if (pc->sz == pc->capacity)
  {
    tp* ptr = (tp*)realloc(pc->data, (pc->capacity + INC)*sizeof(tp));
    if (ptr == NULL)
    {
      perror("CheckCapacity");
      return 0;
    }
    else
    {
      pc->data = ptr;
      pc->capacity += INC;
      printf("增容成功\n");
      return 1;
    }
  }
  return 1;
}
void AddContact(Contact* p)
{
  assert(p);
  if (0==CheckCapacity(&p))
  {
    printf("通讯录已满!\n");
    //EnContact(&p);
  }
  printf("\n请输入姓名>");
  scanf("%s",p->data[p->sz].name);
  printf("\n请输入年龄>");
  scanf("%d", &p->data[p->sz].age);
  printf("\n请输入性别>");
  scanf("%s", p->data[p->sz].sex);
  printf("\n请输入电话号码>");
  scanf("%s", p->data[p->sz].telp);
  printf("\n请输入地址>");
  scanf("%s", p->data[p->sz].addr);
  printf("在通讯录中成功添加%s的信息!\n", p->data[p->sz].name);
  p->sz++;
}

3、删除联系人 DelContact(Contact* p)

void DelContact(Contact* p)
{
  assert(p);
  int flag = 0, de = 0;
  if (p->sz == 0)
  {
    printf("通讯录为空!无法删除!\n");
    return;
  }
  printf("输入删除信息的姓名>");
  char arr[20]="0";
  scanf("%s",&arr);
  for (int i = 0; i < p->sz; i++)
  {
    if (strcmp(p->data[i].name, arr) == 0)//按照名字删除
    {
      flag = 1;
      de = i;
      break;
    }
  }
  if (flag == 1)
  {
    for (int j = de; j < p->sz - 1; j++)
    {
      p->data[j] = p->data[j + 1];
    }
    p->sz--;
    printf("成功删除!\n");
  }
  if (flag == 0)
    printf("通讯录中未找到该联系人!\n");
}

4、查找联系人信息 SearchContact(Contact* p)

void SearchContact(Contact* p)
{
  assert(p);
  if (p->sz == 0)
  {
    printf("通讯录为空,无法查找!\n");
      return;
  }
  printf("输入查找人的姓名>");
  char arr[20]="0";
  scanf("%s", arr);
  for (int i = 0; i < p->sz; i++)
  {
    if (strcmp(p->data[i].name, arr) == 0)//通过姓名查找
    {
      printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
      printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
        p->data[i].name,
        p->data[i].age,
        p->data[i].sex,
        p->data[i].telp,
        p->data[i].addr);
      return;
    }
  }
  printf("未找到该联系人!\n");
}
2. vo

5、修改联系人信息 ModifyContact(Contact* p)

void ModifyContact(Contact* p)
{
  assert(p);
  if (p->sz == 0)
  {
    printf("通讯录为空,无法查找!\n");
    return;
  }
  printf("输入要修改人的姓名>");
  char arr[20]="0";
  scanf("%s", &arr);
  for (int i = 0; i < p->sz; i++)
  {
    if (strcmp(p->data[i].name, arr) == 0)//通过姓名修改
    {
      printf("\n请输入姓名>");
      scanf("%s", p->data[i].name);
      printf("\n请输入年龄>");
      scanf("%d", &p->data[i].age);
      printf("\n请输入性别>");
      scanf("%s", p->data[i].sex);
      printf("\n请输入电话号码>");
      scanf("%s", p->data[i].telp);
      printf("\n请输入地址>");
      scanf("%s", p->data[i].addr);
      printf("在通讯录中成功修改%s的信息!\n", p->data[i].name);
      return;
    }
  }
  printf("未找到要修改人%s的信息!", arr);
}

6、排序联系人->按姓名?按年龄? SortContact(Contact* p)

void SortContact(Contact* p)//懒得分装了0.0
{
  assert(p);
  if (p->sz == 0)
  {
    printf("\n通讯录为空,无法排序!!!\n");
    return;
  }
  printf("请选择排序的形式>");
  printf("\n*******************************");//提升菜单
  printf("\n**1、按名字排序  2、按年龄排序**");
  printf("\n*******************************\n");
  int ret = 0;
  scanf("%d", &ret);
  if(ret==1)
  {
    printf("选择升序或降序>");
    printf("\n**1、升**2、降**\n");
    int re = 0;
    Contact* pc = p;
    scanf("%d", &re);
    if (re == 1)//名字升序
    {
      int i = 0;
      int j = 0;
      tp tmp;
      for (i = 0; i < p->sz - 1; i++)
      {
        int flag = 1;
        for (j = 0; j < p->sz - i - 1; j++)
        {
          if (strcmp(p->data[j].name, p->data[j + 1].name) > 0)
          {
            tmp = p->data[j];
            p->data[j] = p->data[j + 1];
            p->data[j + 1] = tmp;
            flag = 0;
          }
        }
        if (flag == 1)
        {
          return;
        }
      }
      printf("\n排序成功\n");
      //namesort1(&pc);
    }
    else if (re == 2)//名字降序
    {
      int i = 0;
      int j = 0;
      tp tmp;
      for (i = 0; i < p->sz - 1; i++)
      {
        int flag = 1;
        for (j = 0; j < p->sz - i - 1; j++)
        {
          if (strcmp(p->data[j].name, p->data[j + 1].name) < 0)
          {
            tmp = p->data[j];
            p->data[j] = p->data[j + 1];
            p->data[j + 1] = tmp;
            flag = 0;
          }
        }
        if (flag == 1)
        {
          return;
        }
      }
      printf("\n排序成功\n");
      //namesort2(&pc);
    }
    else
    {
      printf("\n输入错误!\n");
    }
    //sort2(&p);
  }
  else if (ret == 2)
  {
    printf("选择升序或降序>");
    printf("\n**1、升**2、降**\n");
    int re = 0;
    scanf("%d", &re);
    switch (re)
    {
    case 1://年龄升序
      for (int i = 0; i < p->sz - 1; i++)
      {
        for (int j = 0; j < p->sz - 1 - i; j++)
        {
          if (p->data[j].age > p->data[j + 1].age)
          {
            tp temp = p->data[j];
            p->data[j] = p->data[j + 1];
            p->data[j + 1] = temp;
          }
        }
      }
      printf("\n排序成功!\n");
      break;
    case 2://年龄降序
      for (int i = 0; i < p->sz - 1; i++)
      {
        for (int j = 0; j < p->sz - 1 - i; j++)
        {
          if (p->data[j].age < p->data[j + 1].age)
          {
            tp temp = p->data[j];
            p->data[j] = p->data[j + 1];
            p->data[j + 1] = temp;
          }
        }
      }
      printf("\n排序成功!\n");
      break;
    default:
      printf("\n输入错误!\n");
      break;
    }
  }
  else
  {
    printf("\n输入错误!\n");
  }
}

7、 退出前保存文件 SaveContact(Contact* p)

void LoadContact(Contact* pc)//这里为上面第一小电中的加载函数
{
  //打开文件
  FILE* pf = fopen("contact.dat", "rb");
  if (pf == NULL)
  {
    perror("LoadContact");
    return;
  }
  //读文件
  tp tmp = { 0 };
  while (fread(&tmp, sizeof(tp), 1, pf))
  {
    if (0 == CheckCapacity(pc))
      return;
    pc->data[pc->sz] = tmp;
    pc->sz++;
  }
  //关闭文件
  fclose(pf);
  pf = NULL;
}
void SaveContact(Contact* pc)
{
  FILE* pf = fopen("contact.dat", "wb");
  if (pf == NULL)
  {
    perror("SaveContact");
    return;
  }
  //写数据
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    fwrite(pc->data + i, sizeof(tp), 1, pf);
  }
  //关闭文件
  fclose(pf);
  pf = NULL;
}

8、 退出销毁(释放内存)DestroyContact(Contact* p)

void DestroyContact(Contact* p)
{
  free(p->data);
  p->data = NULL;
  p->capacity = 0;
  p->sz = 0;
}

三、总体代码

1、rel.h

#pragma once
#define NAME 20
#define SEX 5
#define TELP 12
#define ADDR 30
#define TELnum 20
#define INC 20
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
enum option
{
  Exit,
  Add,
  Del,
  Search,
  Modify,
  Show,
  Sort
};
typedef struct tp
{
  char name[10];
  int age;
  char sex[SEX];
  char telp[TELP];
  char addr[ADDR];
}tp;
typedef struct Contact
{
  tp* data;
  int sz;
  int capacity;
}Contact;
void InitContact(Contact* p);//初始化
void AddContact(Contact* p);//添加
void ShowContact(Contact* p);//显示
void DelContact(Contact* p);//删除
void SearchContact(Contact* p);//查找
void ModifyContact(Contact* p);//修改
void SortContact(Contact* p);//排序
void DestroyContact(Contact* p);//退出销毁
void SaveContact(Contact* p);//保存文件

2、rel.c

#define _CRT_SECURE_NO_WARNINGS 01
#include"rel.h"
int CheckCapacity(Contact* pc);
void LoadContact(Contact* pc)
{
  //打开文件
  FILE* pf = fopen("contact.dat", "rb");
  if (pf == NULL)
  {
    perror("LoadContact");
    return;
  }
  //读文件
  tp tmp = { 0 };
  while (fread(&tmp, sizeof(tp), 1, pf))
  {
    if (0 == CheckCapacity(pc))
      return;
    pc->data[pc->sz] = tmp;
    pc->sz++;
  }
  //关闭文件
  fclose(pf);
  pf = NULL;
}
void InitContact(Contact* p)
{
  assert(p);
  p->data = (tp*)malloc(sizeof(tp) * TELnum);//calloc
  if (p->data == NULL)
  {
    perror("malloc");
    return;
  }
  memset(p->data, 0, sizeof(p->data));
  p->sz = 0;
  p->capacity = TELnum;
  //文件中保存的信息加载到通讯录中
  LoadContact(p);
}
int CheckCapacity(Contact* pc)
{
  if (pc->sz == pc->capacity)
  {
    tp* ptr = (tp*)realloc(pc->data, (pc->capacity + INC)*sizeof(tp));
    if (ptr == NULL)
    {
      perror("CheckCapacity");
      return 0;
    }
    else
    {
      pc->data = ptr;
      pc->capacity += INC;
      printf("增容成功\n");
      return 1;
    }
  }
  return 1;
}
void AddContact(Contact* p)
{
  assert(p);
  if (0==CheckCapacity(&p))
  {
    printf("通讯录已满!\n");
    //EnContact(&p);
  }
  printf("\n请输入姓名>");
  scanf("%s",p->data[p->sz].name);
  printf("\n请输入年龄>");
  scanf("%d", &p->data[p->sz].age);
  printf("\n请输入性别>");
  scanf("%s", p->data[p->sz].sex);
  printf("\n请输入电话号码>");
  scanf("%s", p->data[p->sz].telp);
  printf("\n请输入地址>");
  scanf("%s", p->data[p->sz].addr);
  printf("在通讯录中成功添加%s的信息!\n", p->data[p->sz].name);
  p->sz++;
}
void ShowContact(Contact* p)
{
  assert(p);
  int i = 0;
  if (p->sz == 0)
  {
    printf("通讯录为空!\n");
    return;
  }
  printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
  while (i < p->sz)
  {
    printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
      p->data[i].name,
      p->data[i].age,
      p->data[i].sex,
      p->data[i].telp,
      p->data[i].addr);
    i++;
  }
}
void DelContact(Contact* p)
{
  assert(p);
  int flag = 0, de = 0;
  if (p->sz == 0)
  {
    printf("通讯录为空!无法删除!\n");
    return;
  }
  printf("输入删除信息的姓名>");
  char arr[20]="0";
  scanf("%s",&arr);
  for (int i = 0; i < p->sz; i++)
  {
    if (strcmp(p->data[i].name, arr) == 0)//按照名字删除
    {
      flag = 1;
      de = i;
      break;
    }
  }
  if (flag == 1)
  {
    for (int j = de; j < p->sz - 1; j++)
    {
      p->data[j] = p->data[j + 1];
    }
    p->sz--;
    printf("成功删除!\n");
  }
  if (flag == 0)
    printf("通讯录中未找到该联系人!\n");
}
void SearchContact(Contact* p)
{
  assert(p);
  if (p->sz == 0)
  {
    printf("通讯录为空,无法查找!\n");
      return;
  }
  printf("输入查找人的姓名>");
  char arr[20]="0";
  scanf("%s", arr);
  for (int i = 0; i < p->sz; i++)
  {
    if (strcmp(p->data[i].name, arr) == 0)//通过姓名查找
    {
      printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
      printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
        p->data[i].name,
        p->data[i].age,
        p->data[i].sex,
        p->data[i].telp,
        p->data[i].addr);
      return;
    }
  }
  printf("未找到该联系人!\n");
}
void ModifyContact(Contact* p)
{
  assert(p);
  if (p->sz == 0)
  {
    printf("通讯录为空,无法查找!\n");
    return;
  }
  printf("输入要修改人的姓名>");
  char arr[20]="0";
  scanf("%s", &arr);
  for (int i = 0; i < p->sz; i++)
  {
    if (strcmp(p->data[i].name, arr) == 0)//通过姓名修改
    {
      printf("\n请输入姓名>");
      scanf("%s", p->data[i].name);
      printf("\n请输入年龄>");
      scanf("%d", &p->data[i].age);
      printf("\n请输入性别>");
      scanf("%s", p->data[i].sex);
      printf("\n请输入电话号码>");
      scanf("%s", p->data[i].telp);
      printf("\n请输入地址>");
      scanf("%s", p->data[i].addr);
      printf("在通讯录中成功修改%s的信息!\n", p->data[i].name);
      return;
    }
  }
  printf("未找到要修改人%s的信息!", arr);
}
void SortContact(Contact* p)
{
  assert(p);
  if (p->sz == 0)
  {
    printf("\n通讯录为空,无法排序!!!\n");
    return;
  }
  printf("请选择排序的形式>");
  printf("\n*******************************");//提升菜单
  printf("\n**1、按名字排序  2、按年龄排序**");
  printf("\n*******************************\n");
  int ret = 0;
  scanf("%d", &ret);
  if(ret==1)
  {
    printf("选择升序或降序>");
    printf("\n**1、升**2、降**\n");
    int re = 0;
    Contact* pc = p;
    scanf("%d", &re);
    if (re == 1)//名字升序
    {
      int i = 0;
      int j = 0;
      tp tmp;
      for (i = 0; i < p->sz - 1; i++)
      {
        int flag = 1;
        for (j = 0; j < p->sz - i - 1; j++)
        {
          if (strcmp(p->data[j].name, p->data[j + 1].name) > 0)
          {
            tmp = p->data[j];
            p->data[j] = p->data[j + 1];
            p->data[j + 1] = tmp;
            flag = 0;
          }
        }
        if (flag == 1)
        {
          return;
        }
      }
      printf("\n排序成功\n");
      //namesort1(&pc);
    }
    else if (re == 2)//名字降序
    {
      int i = 0;
      int j = 0;
      tp tmp;
      for (i = 0; i < p->sz - 1; i++)
      {
        int flag = 1;
        for (j = 0; j < p->sz - i - 1; j++)
        {
          if (strcmp(p->data[j].name, p->data[j + 1].name) < 0)
          {
            tmp = p->data[j];
            p->data[j] = p->data[j + 1];
            p->data[j + 1] = tmp;
            flag = 0;
          }
        }
        if (flag == 1)
        {
          return;
        }
      }
      printf("\n排序成功\n");
      //namesort2(&pc);
    }
    else
    {
      printf("\n输入错误!\n");
    }
    //sort2(&p);
  }
  else if (ret == 2)
  {
    printf("选择升序或降序>");
    printf("\n**1、升**2、降**\n");
    int re = 0;
    scanf("%d", &re);
    switch (re)
    {
    case 1://年龄升序
      for (int i = 0; i < p->sz - 1; i++)
      {
        for (int j = 0; j < p->sz - 1 - i; j++)
        {
          if (p->data[j].age > p->data[j + 1].age)
          {
            tp temp = p->data[j];
            p->data[j] = p->data[j + 1];
            p->data[j + 1] = temp;
          }
        }
      }
      printf("\n排序成功!\n");
      break;
    case 2://年龄降序
      for (int i = 0; i < p->sz - 1; i++)
      {
        for (int j = 0; j < p->sz - 1 - i; j++)
        {
          if (p->data[j].age < p->data[j + 1].age)
          {
            tp temp = p->data[j];
            p->data[j] = p->data[j + 1];
            p->data[j + 1] = temp;
          }
        }
      }
      printf("\n排序成功!\n");
      break;
    default:
      printf("\n输入错误!\n");
      break;
    }
  }
  else
  {
    printf("\n输入错误!\n");
  }
}
void DestroyContact(Contact* p)
{
  free(p->data);
  p->data = NULL;
  p->capacity = 0;
  p->sz = 0;
}
void SaveContact(Contact* pc)
{
  FILE* pf = fopen("contact.dat", "wb");
  if (pf == NULL)
  {
    perror("SaveContact");
    return;
  }
  //写数据
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    fwrite(pc->data + i, sizeof(tp), 1, pf);
  }
  //关闭文件
  fclose(pf);
  pf = NULL;
}

3、text.c

#define _CRT_SECURE_NO_WARNINGS 01
#include"rel.h"
void menu()
{
  printf("**************************************\n");
  printf("*****1、add   *********2、del   ******\n");
  printf("*****3、search*********4、modify******\n");
  printf("*****5、show  *********6、sort  ******\n");
  printf("*****0、exit  *********         ******\n");
  printf("**************************************\n");
  printf("请选择>");
}
void text()
{
  int input = 0;
  Contact p;
  InitContact(&p);
  do
  {
    menu();
    scanf("%d", &input);
    system("cls");
    switch (input)
    {
    case Add:
      AddContact(&p);
      break;
    case Del:
      DelContact(&p);
      break;
    case Search:
      SearchContact(&p);
      break;
    case Modify:
      ModifyContact(&p);
      break;
    case Show:
      ShowContact(&p);
      break;
    case Sort:
      SortContact(&p);
      //namesort1(&p);
      break;
    case Exit:
      SaveContact(&p);
      DestroyContact(&p);
      printf("退出成功!\n");
      break;
    default:
      printf("输入错误,请重新输入!\n");
      break;
    }
  } while (input);
}
int main()
{
  text();
  return 0;
}
相关文章
|
4月前
|
存储 编译器 程序员
c语言的文件操作与文件缓冲区
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。
110 0
|
10月前
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
831 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
8月前
|
人工智能 C语言
|
9月前
|
存储 小程序 C语言
【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】
本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。
245 5
|
8月前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
191 0
|
10月前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
317 12
|
11月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
631 3
|
11月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
260 1
|
11月前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
466 1
|
26天前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
637 0