c语言课程设计-药店管理系统_c语言药店管理系统设计报告-程序员宅基地

技术标签: c语言  

这个东东第一次才开始写的时候,脑子都是懵的,把我的方法和解决办法写出来,希望可以对你有一点帮助。

逻辑方面

可以先想想,我需要这个系统实现什么功能,就药店管理系统来讲,这个我觉得增删改查是必须的,再加一个补货提醒,剩下的就是什么几家药店一起搞,这样用户知道库存和药店位置可以做出最优选择。然后搞了两个端口进行,一个用户端,一个工作人员端口,这样的话显示菜单不同,功能也可以分开实现。(这里可以写三个文本,一个存药店信息,一个存药品信息,一个存所有的用户和工作人员的ID和密码)。

代码实现

按照运行显示顺序排列代码
1.结构体建立(一共三个,药品,药店,用户信息)

typedef struct medicine    //药品信息结构体
{
    
 char name[10];    //药品名 
 int  num;         //药品编号 
 int  drugstore_num;  //药店编号 
 float price;     //药品价格 
 int stock;        //药品库存数量 
 int sell;         //药品销量 
 char effect[10];  //药品功效 
 struct medicine *next; 
 } medicine;
typedef struct place   //药店信息结构体
{
    
 int num;    //药店编号
 char address[20];   //药店地址
 struct place *next;
}place;
typedef struct user       //用户信息结构体
{
    
 char name[10];    //用户名
 int flag1;        //标记是客户还是员工 
 char password[10];    //用户密码
 struct user *next; 
}user;

2.链接三个文件
三个文件分别用三个链表链起来,功能实现方面就简单很多,这里为了方便我就放一个就好了(将三个药店链起来)
文件里面一定要有内容 emmmm 要是出现文件不存在可以试试把r换成w运行一遍后再换回来,换回来后记得回去吧文件里的内容补上(要是有大佬知道更好的解决办法,能否教一下,我也想知道怎么更好解决)

void place_txt()        //将店铺连接起来 
{
    
 FILE *fp;
 fp=fopen("place.txt","r+");
 if(NULL == fp)
    {
    
        printf("文件不存在\n");
  exit(1);
    } 
    place *p,*q;
    place_head=(place *)malloc(sizeof(place));
    place_head->next=NULL;
    p=(place *)malloc(sizeof(place));
    p->next=NULL;
    while(fscanf(fp,"%s %d",p->address,&p->num)!=EOF)
    {
    
     if(place_head->next==NULL)
     place_head->next=p;
     else
     q->next=p;
     q=p;
     p=(place *)malloc(sizeof(place));
     p->next=NULL;
 }
 fclose(fp); 
} 

3.主菜单
这个主要是登录,注册和退出系统
介于本人喜欢的颜色和不想看太繁琐的就加了清屏和改了颜色 这个看个人喜欢

system("cls");    //清屏函数
system("pause");   //点击一下进行下一功能
system("color 0F")  //改背景和字体颜色

前面数字改背景颜色 0=黑 1=蓝 2=绿 3=湖蓝 4=红 5=紫 6=黄 7=白 8=灰 9=淡蓝 后面是字体颜色A=淡绿 B=浅淡绿 C=淡红 D=淡紫 E=淡黄 F=亮白
下面是主菜单代码

void main_menu()          //主菜单栏 
{
    
 system("cls\n");
 int n; 
 printf("\n\t\t-----欢迎来到药店管理系统-----\n\n");
 system("color 0B");
 printf("\t\t***** 1 登录          *****\n");
 printf("\t\t***** 2 注册          *****\n");
 printf("\t\t***** 3 退出系统      *****\n");
 printf("\n\t\t输入您所要进行的功能序号:");
 do{
    
  scanf("%d",&n);
  switch(n)
   {
    
    case 1:{
    log_on(); break;}
    case 2:{
     post();  break; }
    case 3:{
     sign_out();  break;}
    default:
     printf("输入指令不存在请重新输入:\n");
   }
 }while(n<1||n>3);
}

while里面内个控制,看自己的系统功能多少进行改变即可

4.登录系统
终于到登录系统了,嘿嘿嘿,本人在此和注册系统加了一个加密和控制条件,就是现在普遍见到的输入密码出现的是*。

int log_on()             //登录系统
{
    
 system("cls");
 system("color 0E");
 user *p=user_head->next;
 int flag=1,i=0,j=0;
 char a[10],b[11];
 char c=0;
 printf("\n\t\t---------欢迎您使用---------\n\t\t");
 fflush(stdin);
 do{
    
  printf("您有%d次机会输入\n\t\t",3-j);
  printf("请输入您的用户名:\n\t\t"); 
  scanf("%s",a);
  printf("\t\t请输入您的账户密码:\n\t\t");
  i=0;
  p=user_head->next;
  while(i<10&&c!=13)   //13  回车
  {
    
   c=getch();
   if((c>47&&c<58)||(c>96&&c<123))
   {
    
    b[i++]=c;
    putchar('*');
    
   }
   b[10]='\0';
   } 
   while(p!=NULL)
   {
    
    if(strcmp(a,p->name)==0&&strcmp(b,p->password)==0)
    {
    
     flag=0;
     break;
    }
    else
    p=p->next;
   }
  if(flag)
  {
    
   printf("\n\t\t密码或用户名错误请重试\n");
   j++;
  }
  else{
    printf("\n\t\t登陆成功,即将跳转至菜单");
  break;
  }
   
 }while(j!=3);
 if(j==3)
 {
    
  printf("\n\t\t三次机会用完将跳转至注册页面");
  system("pause");
  post();
  } 
  else
  {
    
   if(p->flag1==1111)
  {
    
    system("pause");
    customer_menu();
   }

   else
   {
     
    system("pause");
    user_menu();
   }

  }
}

这里给个建议,写的时候一定要写一个函数测试一下。(不要问,问了全都是泪)还有就是内个*密码内个,需要头文件,会在最后进行头文件汇总的不用担心。
5.注册系统

void post()              //注册系统 
{
    
 system("color 0D");
 int i=0,n=0;
 char a[10],b[11];
 char c=0; 
 system("cls");
 printf("\n\t欢迎使用注册系统\n");
 while(1)
 {
    
  printf("\n\t请输入用户名(不超过10个字符):\n\t");
  scanf("%s",a);
  if(exist(a)==0)
  {
    
   printf("\n\t该用户已存在,请重新输入:");
   continue; 
  }
  if(strlen(a)<=10)
  {
    
   printf("\n\t请输入十位密码,密码可由数字和小写字母组成:\n\t");
   while(i<10&&c!=13)   //13  回车
   {
    
    c=getch();
    if((c>47&&c<58)||(c>96&&c<123))
    {
    
     b[i++]=c;
     putchar('*');
    }
    b[10]='\0';
    }  
    printf("\n\t请输入邀请码(客户邀请码为1111)");  
    scanf("%d",&n);
  }
  else 
   printf("\n\t您输入的用户长度为%d,请重新输入(不超过10位):\n\n",strlen(a));
  if(n!=0)
  break;
 }
 printf("\n\n\t系统会自动将用户名和密码存入使用者的文件中!\n");
 FILE *fp;                            //将新用户的昵称和密码保存到用户信息文件中 
 fp = fopen("user.txt","a+");
 if(NULL == fp)
    {
    
        printf("\t文件不存在\n");
  exit(1);
 }
 fprintf(fp," %s %d %s",a,n,b);
 fclose(fp);
 system("pause");
 main_menu(); 
}
int sign_out()           //退出系统 
{
    
 system("cls");
 printf("\n\t\t感谢您使用本系统,欢迎下次使用");
 system("pause");
 return 0; 
}

这里就会可能万一用户名相同怎么办,当然我加了一个函数防止这个问题发生。(全都是我出现的问题)。

int exist(char name[])    //判断用户名是否存在 
{
    
 user *p;            
 p=user_head; 
 while(p!=NULL)
 {
    
  if(strcmp(p->name ,name)==0)
  {
    
   return 0;  
  }
  p=p->next ;
  }
  return 1; 
}

6.退出系统

int sign_out()           //退出系统 
{
    
 system("cls");
 printf("\n\t\t感谢您使用本系统,欢迎下次使用");
 system("pause");
 return 0; 
}

7.客户菜单栏
啊,终于迎来了第一个端口,但是好像除了不同方式查看药品和药店位置,我好像也想不出来别的功能了。(网上买药这个东东考虑过,有别的功能欢迎补充)

void customer_menu()     //顾客菜单栏
{
    
 system("color 0B");
 system("cls\n");
 int n=0;
 printf("\n\t\t-----------**药店欢迎您-----------\n\n");
 printf("\t\t*****1.按药品名查询*******\n");
 printf("\t\t*****2.按药店编号查询*****\n"); 
 printf("\t\t*****3.返回上一目录*******\n");
 printf("\n\t\t----------------------------------\n");
 do{
    
  printf("\t\t");
  printf("请输入所要操作的指令编号(1位):"); 
  scanf("%d",&n);
  switch(n)
  {
    
   case 1:{
    cus_finddrugs1();break;}
   case 2:{
    cus_finddrugs2();break;}
   case 3:{
    main_menu();break;}
   default:
   printf("输入指令不存在,请重新输入:");
  }
 }while(n<1||n>3);
}

顺势把里面的功能也放进来吧

void cus_finddrugs1()     //客户端查找药品 (药品名查找)
{
    
 system("color 0F");
 system("cls");
 int flag=1;
 char a[10]; 
 printf("\n\n\t\t输入所需查找药品的名称:\n\t\t");
 scanf("%s",a);
 system("cls"); 
 medicine *p=medicine_head->next;
 while(p!=NULL)
 {
    
  if(strcmp(p->name,a)==0)
  {
    
   
   flag=0;
   printf("--------------------------------------------------------\n");
   printf("\t药品名称:%s\n",p->name);
   printf("\t药品编号:%d\n",p->num);
   printf("\t药品价格:%.2f\n",p->price);
   printf("\t药店编号:%d\n",p->drugstore_num);
   printf("\t药品当前药店库存:%d\n",p->stock);
   printf("\t药品功效:%s\n",p->effect);
   printf("--------------------------------------------------------\n");
  }
  p=p->next;
  } 
  if(flag)
  printf("查无此药\n");
  printf("点击返回菜单");
  system("pause");
  customer_menu(); 
}
void cus_finddrugs2()      //客户端查找药品(药店名查找)
{
    
 system("color 0E");
 int n,flag=0;
 char m[20];
 system("cls\n");
 printf("\n\t\t------------------------------------------\n");
 place *p=place_head->next;
 while(p!=NULL)
 {
    
  printf("\t\t%s %d\n",p->address,p->num);
  p=p->next;
 }
 medicine *q;
 printf("\t\t输入所要查找的药店编号:");
 do
 {
    
  scanf("%d",&n);
  if(n<1||n>4)
  printf("\n\t\t此药店编号无效,请重新输入:\n");
 }while(n<1||n>4);
 system("cls");
 printf("\n\t\t请输入要查找的药品名称:");
 scanf("%s",m);
 q=medicine_head->next;
 while(q!=NULL)
 {
    
  if(q->drugstore_num==n&&strcmp(q->name,m)==0)
  {
    
   flag=0;
   printf("\n\n--------------------------------------------------------\n");
   printf("\t\t药品名称:%s\n",q->name);
   printf("\t\t药品编号:%d\n",q->num);
   printf("\t\t药品价格:%.2f\n",q->price);
   printf("\t\t药店编号:%d\n",q->drugstore_num);
   printf("\t\t药品当前药店库存:%d\n",q->stock);
   printf("\t\t药品功效:%s\n",q->effect);
   printf("--------------------------------------------------------\n");
   break;
  }
  q=q->next;
 } 
 if(flag)
  printf("\t\t查无此药\n");
  printf("点击鼠标返回菜单");
  system("pause");
  customer_menu(); 
}
 

有个小错误(太傻了这个错误),当时自己心血来潮,把药店编号改成11 12 13,却忘了当时写代码时定了最多四个药店控制条件也是1——4。
8.工作人员端口
菜单

void user_menu()     //经理端菜单栏 
{
     
 system("color 0B");
    int  i;
    system("cls");
 printf("\t\t*******药品管理系统********\n");
 printf("\t\t     1.增加药品       \n");
 printf("\t\t     2.查找药品       \n");
 printf("\t\t     3.所有药品信息       \n");
 printf("\t\t     4.药品销量       \n");
 printf("\t\t     5.查看所需补货商品      \n");
 printf("\t\t     6.收银       \n");
 printf("\t\t     7.返回上一界面\n");
 printf("\t\t**************************\n");
 printf("\t\t--------------------------\n");
 printf("\t\t请输入所操作程序编号:\n\t\t");
 do{
     
  scanf("%d",&i);
  printf("\t\t");
  system("pause");
  switch(i)
  {
    
   case 1:
    {
    adddrugs();break;}
   case 2:
    {
    user_finddrugs();break;}
   case 3:
    {
    alldrugs();break;}
   case 4:
    {
    saledrugs();break;}
   case 5:
    {
    replenish();break;}
   case 6: 
    {
    redycedrugs();break;}
   case 7:
    {
    main_menu();break;}
   default:
    printf("\n\t\t输入指令不会存在,请重新输入:");
     }
 } while(i<1||i>6);
} 

下面按照功能进行排列 一个黑框框一个函数

void adddrugs()     //增加药品 
{
    
 system("color 0D");
 system("cls");
 medicine *p=medicine_head->next;
 while(1)
 {
    
  medicine *q;
  q=(medicine *)malloc(sizeof(medicine));
  q->next=NULL;
  if(p==NULL)
  {
    
   medicine_head->next=q;
  }
  while(p!=NULL)
  {
    
   if(p->next==NULL)
   {
    
    p->next=q;
    break;
   }
   p=p->next;
  }
  printf("\t\t---------------------------------------\n");
  printf("\n\t\t输入所添加的药品名称:");
  scanf("%s",q->name);
  printf("\n\t\t输入所添加药品编号:");
  scanf("%d",&q->num);
  printf("\n\t\t输入药品所添加到的药店编号:");
  scanf("%d",&q->drugstore_num);
  printf("\n\t\t输入所添加药品的价格:");
  scanf("%f",&q->price);
  printf("\n\t\t输入所添加药品数量:");
  scanf("%d",&q->stock);
  printf("\n\t\t输入目前添加药品销量:");
  scanf("%d",&q->sell);
  printf("\n\t\t输入所添加药品的功效:");
  scanf("%s",q->effect);
  printf("\n\t\t药品信息输入完成,将自动保存至文件\n");
  printf("\t\t---------------------------------------\n");
  FILE *fp;
  fp=fopen("medicine.txt","a+");
  if(NULL==fp)
  {
    
   printf("\t\t此文件不存在\n");
   exit(1);
   } 
   fprintf(fp," %s %d %d %.2f %d %d %s",q->name,q->num,q->drugstore_num,q->price,q->stock,q->sell,q->effect);
   fclose(fp);
   break;
 }
 printf("\n\t\t点击任意位置跳转至上一界面");
 system("pause");
 user_menu();
}
void user_finddrugs()     //经理端查找药品 (药品名查找)
{
    
 system("color 0E");
 system("cls");
 int flag=1;
 char a[10]; 
 printf("\n\n\t\t输入所需查找药品的名称:\n\t\t");
 scanf("%s",a);system("cls");
 medicine *p=medicine_head->next;
 while(p!=NULL)
 {
    
  if(strcmp(p->name,a)==0)
  {
    
   
   flag=0;
   printf("--------------------------------------------------------\n");
   printf("\t药品名称:%s\n",p->name);
   printf("\t药品编号:%d\n",p->num);
   printf("\t药品价格:%.2f\n",p->price);
   printf("\t药店编号:%d\n",p->drugstore_num);
   printf("\t药品当前药店库存:%d\n",p->stock);
   printf("\t药品功效:%s\n",p->effect);
   printf("--------------------------------------------------------\n");
  }
  p=p->next;
  } 
  if(flag)
  printf("查无此药\n");
  printf("点击返回菜单");
  system("pause");
  user_menu(); 
}
void alldrugs()          //所有药品信息
{
    
 system("color 0F");
 system("cls");
 medicine *p=medicine_head->next;
 while(p!=NULL)
 {
    
  printf("\n*****************************************\n");
  printf("药品名称:%s\n",p->name);
  printf("药品编号:%d\n",p->num);
  printf("药店编号:%d\n",p->drugstore_num);
  printf("药品价格:%.2f\n",p->price);
  printf("库存数量:%d\n",p->stock);
  printf("药品销量:%d\n",p->sell);
  printf("药品功效:%s\n",p->effect);
  printf("\n*****************************************\n");
  p=p->next;
 }
 printf("\n所有药品显示完毕");
 system("pause");
 user_menu();
 
}
void saledrugs()         //销售药品量 
{
    
 system("color 0F");
 double a=0;
 system("cls");
 medicine *p=medicine_head->next;
 while(p!=NULL){
    
  if(p->sell>0)
  {
    
   printf("\t\t------------------------------------\n");
   printf("\t\t药品名称:%s\n",p->name);
   printf("\t\t销量为:%d\n",p->sell);
   printf("\t\t所在店铺编号为:%d\n",p->drugstore_num);
   printf("\t\t销售价格合计:%.2f\n",p->sell*p->price);
   a+=(p->sell*p->price);
   printf("\t\t------------------------------------\n");
  }
  p=p->next;
 }
 printf("\t\t总计销售总价为%.2f\n",a);
 printf("\n\n\t\t销售如上所示\n\t\t");
 system("pause");
 user_menu();
}

上述为药品销量,没有排序的,可以试着自己搞下排序的。

void replenish()         //补货函数 
{
    
 system("color 0A");
 system("cls");
 medicine *p=medicine_head->next;
 while(p!=NULL)
 {
    
  if(p->stock<20)
  {
    
   printf("\n\t\t-------------------------------------------------------------\n");
   printf("\t\t%d号药店%s库存少于20件,近期需进行补货\n",p->drugstore_num,p->name);
   printf("\n\t\t-------------------------------------------------------------\n");
   
  }p=p->next;
 }
 printf("需补货药品显示完毕\n");
 system("pause");
 user_menu();
}
void redycedrugs()      //收银   
{
    
 system("color 0D");
 system("cls");
 int n,m;
 char a[10];
 medicine *p=medicine_head->next;
 printf("\t\t-----------------------------------------\n");
 printf("\n\n\t\t请输入购买的药品名称:");
 scanf("%s",a);
 printf("\n\t\t请输入购买所在药店编号:");
 scanf("%d",&n);
 printf("\n\t\t请输入购买数量:");
 scanf("%d",&m); 
 while(p!=NULL)
 {
    
  if(strcmp(p->name,a)==0&&p->drugstore_num==n)
  {
    
   printf("\n\t\t应付价格为%.2f",p->price*m);
   p->sell+=m;
   p->stock-=m;
   break;
  }
  p=p->next;
 }
 printf("\n\t\t收银结束\n");
 printf("\t\t-----------------------------------------\n");
 system("pause");
 user_menu();
}

9.主函数

int main()
 {
    
  user_txt();
  place_txt();
  medicine_txt();
  main_menu();
  return 0;
 } 

10.头文件
中间说的头文件它终于来了!!!

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

最后想说一下,以前总觉得for循环很好用,但是在课设里面do while异常好用,每个循环都有优点,不同场合虽说可以相互代替,但是总有最适合的。(do while是真的适合在这里用!!!)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46623078/article/details/106602441

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签