c語言zgi
A. 關於C編程的問題
主要是把基礎的東西學扎實了,比如c中的結構、函數、指針......再學一些數據結構方面攜襪的知識.以後再做比較大的查詢系統時,就會思路很清晰的.下面給你一個有關企業職工管理的查詢系統.以做參考!其實一些查詢系統的基本思路都是一樣的.比如電話系統查詢、圖書管理系統等等.
還有具體把你的查詢系統的功能描述一下:e.g.要能輸入姓名查找到該用戶的電話,輸入電話號碼要能對應查找出該號碼的機主姓名.還要能實現電話的插入、姓名和號碼拿純的更改保存等等.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define N 100
struct employee//職工基本情況
{
int num;//工號
int position;//職位1為董事長2為總經消隱咐理3為副總經理等
char name[8];//姓名
char sex[2];//性別f為女m為男
int age;//年齡
int cult;//文化程度1為專家2為博士3為碩士4為學士5為其他
int salary;//工資
int state;//健康情況分為good,general,bad
}em[N];
struct communication//職工通訊錄
{
char name[8];
char officetel[13];
char hometel[13];
char handtel[13];
char address[13];
}empc[N];
struct empsalary//職工工資與姓名的文件
{
char name[8];
int salary;
}emps[N];
void manage();
void query();
void communicate();
void input();
void display();
void change();
void del();
void add();
void count();
int changeposition();
int changecult();
int changesalary();
int changestate();
void querysalary();
void creat();
void inputcommunicate();
void querycommunicate();
void changecommunicate();
void changetel1();
void changetel2();
void changetel3();
char password[7]="123456";
void main()
{
int choice;
char s[7];
int flag=0;
int n=3;
do
{
printf("請你輸入密碼:\n");
scanf("%s",s);
if(!strcmp(s,password))//若密碼正確
{
printf("恭喜你成功登陸了\n\n\n");
flag=1;
break;
}
else
{
printf("輸入有錯誤請重新輸入:\n");
n--;
}
}while(n>0);
if(!flag)
{
printf("你的輸入次數已到再見\n");
}
do
{
printf("~~~~~~~~~~\t\t\t~~~~~~~~~~~~\n");
printf("\t\t歡迎進入職工管理系統中文版\n");
printf("製作人:李華詩\t班級:計034班\t學號:2003041150\n");
printf("聯系地址:廣西工學院\n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf("\t\t請你選擇操作類型:\n");
printf("==============\t\t==============\n");
printf("\t\t1進入管理系統\n");
printf("\t\t2進入查詢系統\n");
printf("\t\t3進入通訊錄\n");
printf("\t\t0退出系統\n");
printf("==============\t\t==============\n");
printf("說明:版權歸作者所有違者必究\n\n\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
manage();
break;
case 2:
query();
break;
case 3:
communicate();
break;
case 0:
{
printf("謝謝使用再見\n");
exit(0);
}
default:
{
printf("輸入有錯誤請重新輸入:\n");
return;
}
}
}while(1);
}
void manage()
{
int choicemanage;
char choice='y';
while(choice=='y'||choice=='Y')
{
printf("\t\t歡迎進入管理系統\n");
printf("===================\n");
printf("\t\t請你選擇操作類型:\n");
printf("\t\t1輸入職工信息\n");
printf("\t\t2顯示職工信息\n");
printf("\t\t3修改職工信息\n");
printf("\t\t4追加一個職工信息\n");
printf("\t\t5刪除一個職工信息\n");
printf("\t\t6統計職工信息\n");
printf("\t\t0返回\n");
printf("=====================\n");
scanf("%d",&choicemanage);
switch(choicemanage)
{
case 1:
input();//輸入職工信息
break;
case 2:
display();//顯示職工信息
break;
case 3:
change();//修改職工信息
break;
case 4:
add();//追加一個職工信息
break;
case 5:
del();//刪除一個職工信息
break;
case 6:
count();//統計職工信息
break;
case 0:
printf("謝謝你的使用再見\n");
return;
default:
printf("你的輸入有錯請重新輸入\n");
}
printf("是否繼續管理?(y/n)");
scanf("%s",&choice);
}
if(toupper(choice)=='N'||(choice)=='n')
{
printf("輸入完畢,任意鍵返回\n");
getch();
return;
}
}
void input()
{
FILE *fp;
int i=0;
char choiceinput='y';
if((fp=fopen("employee.txt","w"))==NULL)
return;
while(choiceinput=='y'||choiceinput=='Y')
{
i++;
printf("第%d個職工\n",i);
printf("\n");
printf("請你輸入工號:\n");//輸入工號
scanf("%d",&em[i].num);
printf("\n");
printf("請你輸入職位:\n");//輸入職位
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
scanf("%d",&em[i].position);
printf("\n");
printf("請你輸入姓名:\n");//輸入姓名
scanf("%s",em[i].name);
printf("\n");
printf("請你輸入性別以m為男f為女:\n");//輸入性別
scanf("%s",em[i].sex);
printf("\n");
printf("請你輸入文化程度:\n");//輸入文化程度
printf("1為專家2為博士3為碩士4為學士5為其他\n");
scanf("%d",&em[i].cult);
printf("\n");
printf("請你輸入工資:\n");//輸入工資
scanf("%d",&em[i].salary);
printf("\n");
printf("請你輸入身體情況:\n");//身體情況
printf("1好2為一般3為差\n");
scanf("%d",&em[i].state);
printf("\n");
printf("是否繼續輸入?(y/n)\n");
scanf("%s",&choiceinput);
fwrite(&em[i],sizeof(struct employee),1,fp);
}
if(toupper(choiceinput)=='N')
{
fclose(fp);
printf("輸入完畢,任意鍵返回\n");
getch();
return;
}
}
void display()//顯示職工信息
{
FILE *fp;
int i;
if((fp=fopen("employee.txt","r"))==NULL)
return;
printf("輸出結果:\n");
printf("工號 職位 姓名 性別 文化程度 工資 身體情況\n");
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
printf("工號%d\n",em[i].num);
printf("職位為%d\n",em[i].position);
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
printf("姓名為%s\n",em[i].name);
printf("性別為%s\n",em[i].sex);
printf("其中m為男f為女\n");
printf("文化程度為%d\n",em[i].cult);
printf("1為專家2為博士3為碩士4為學士5為其他\n");
printf("工資為%d\n",em[i].salary);
printf("身體情況為%d\n",em[i].state);
printf("1好2為一般3為差\n");
}
printf("完畢按任意鍵返回\n");
getch();
fclose(fp);
return;
}
void change()
{
FILE *fp;
int i;
char chname[8];
int choicechange;
printf("請你輸入要修改的人的姓名:\n");
scanf("%s",&chname);
if((fp=fopen("employee.txt","w+"))==NULL)
{
printf("不能夠打開這個文件\n");
return;
}
for(i=0;i<N;i++)
{
if(strcmp(chname,em[i].name)==0)
{
printf("這是你要修改的人的信息\n");
printf("工號為%d職位為%d姓名為%s性別為%s文化程度為%d工資為%d身體為%d\n",em[i].num,em[i].position,em[i].name,em[i].sex,em[i].cult,em[i].salary,em[i].state);
printf("------------------------------------------------------------\n");
printf("請你輸入要修改的部分:\n");
printf("======================\n");
printf("1修改職位\n");
printf("2修改文化程度\n");
printf("3修改工資\n");
printf("4修改身體情況\n");
printf("0退出系統\n");
printf("======================\n");
printf("請選擇\n");
scanf("%d",&choicechange);
switch(choicechange)
{
case 1:
em[i].position=changeposition();
break;
case 2:
em[i].cult=changecult();
break;
case 3:
em[i].salary=changesalary();
break;
case 4:
em[i].state=changestate();
break;
case 0:
return;
default :
printf("輸入有錯誤");
}
fwrite(&em[i],sizeof(struct employee),1,fp);
}
}
fclose(fp);
printf("操作完成按任意鍵返回\n");
getch();
return;
}
int changeposition()
{
int newposition;
printf("請你輸入新職位:\n");
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
scanf("%d",&newposition);
return(newposition);
}
int changecult()
{
int newcult;
printf("請你輸入新的文憑:\n");
printf("1為專家2為博士3為碩士4為學士5為其他\n");
scanf("%d",&newcult);
return(newcult);
}
int changesalary()
{
int newsalary;
printf("請你輸入新的工資:\n");
scanf("%d",&newsalary);
return(newsalary);
}
int changestate()
{
int newstate;
printf("請你輸入現在的身體情況:\n");
printf("1好2為一般3為差\n");
scanf("%d",&newstate);
return(newstate);
}
void add()//追加一個職工信息
{
struct employee emp;
FILE *fp;
int i=0;
if((fp=fopen("employee.txt","ab+"))==NULL)
{
printf("不能夠打開這個文件\n");
getch();
return;
}
printf("請你輸入新人的內容:\n");
printf("請你輸入工號:\n");//輸入工號
scanf("%d",&emp.num);
printf("請你輸入職位:\n");//輸入職位
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
scanf("%d",&emp.position);
printf("請你輸入姓名:\n");//輸入姓名
scanf("%s",emp.name);
printf("請你輸入性別以m為男f為女:\n");//輸入性別
scanf("%s",emp.sex);
printf("請你輸入文化程度:\n");//輸入文化程度
printf("1為專家2為博士3為碩士4為學士5為其他\n");
scanf("%d",&emp.cult);
printf("請你輸入工資:\n");//輸入工資
scanf("%d",&emp.salary);
printf("請你輸入身體情況:\n");//身體情況
printf("1好2為一般3為差\n");
scanf("%d",&emp.state);
fwrite(&emp,sizeof(struct employee),1,fp);
rewind(fp);
printf("插入完畢,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
void del()//刪除一個職工信息
{
int i=0;
char delname[8];
FILE *fp;
if((fp=fopen("employee.txt","w"))==NULL)
{
printf("文件為空,不能夠打開\n");
printf("按任意鍵返回\n");
getch();
return;
}
printf("請你輸入要刪除的人的姓名:\n");//刪除的職工的信息
scanf("%s",delname);
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
if(strcmp(em[i].name,delname)!=0)
fwrite(&em[i],sizeof(struct employee),1,fp);
}
fclose(fp);
if((fp=fopen("employee.txt","r"))==NULL)//顯示新的職工的信息
return;
printf("新的職工的信息為:\n");
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
printf("工號%d",em[i].num);
printf("職位為%d",em[i].position);
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
printf("姓名為%s",em[i].name[8]);
printf("性別為%s",em[i].sex[2]);
printf("其中m為男f為女");
printf("文化程度為%d",em[i].cult);
printf("1為專家2為博士3為碩士4為學士5為其他\n");
printf("工資為%d",em[i].salary);
printf("身體情況為%d",em[i].state);
printf("1好2為一般3為差\n");
fclose(fp);
}
}
void count()
{
FILE *fp;
int i=0;
int num=0;//總人數統計
int mnum=0,fnum=0;//性別人數統計
int expernum=0,doctornum=0,masternum=0,bechelornum=0,othernum=0;//學位人數統計
int dsznum=0,zglnum=0,fzglnum=0,glnum=0,fglnum=0;//職位人數統計
int mishunum=0,jsynum=0,lbnum=0,ygnum=0;
if((fp=fopen("employee.txt","r"))==NULL)
{
printf("不能夠打開這個文件\n");
printf("按任意鍵繼續\n");
getch();
return;
}
do
{
fread(&em[i],sizeof(struct employee),1,fp);
if(feof(fp))
break;
num++;
if(strcmp(em[i].sex,"m")==0)
mnum++;
if(strcmp(em[i].sex,"f")==0)
fnum++;
if(em[i].cult==1)
expernum++;
if(em[i].cult==2)
doctornum++;
if(em[i].cult==3)
masternum++;
if(em[i].cult=4)
bechelornum++;
if(em[i].cult=5)
othernum++;
if(em[i].position==1)//職位統計
dsznum++;
if(em[i].position==2)
zglnum++;
if(em[i].position==3)
fzglnum++;
if(em[i].position==4)
glnum++;
if(em[i].position==5)
fglnum++;
if(em[i].position==6)
mishunum++;
if(em[i].position==7)
jsynum++;
if(em[i].position==8)
lbnum++;
if(em[i].position==9)
ygnum++;
i++;
}while(1);
printf("總人數為%d\n",num);
printf("====性別分類=====\n");
printf("男人數為%d\n",mnum);
printf("女人數為%d\n",fnum);
printf("=====文憑分類=====\n");
printf("專家數為%d\n",expernum);
printf("博士數為%d\n",doctornum);
printf("碩士數為%d\n",masternum);
printf("學士數為%d\n",bechelornum);
printf("其他的數為%d\n",othernum);
printf("=====職位分類========\n");
printf("董事長數為%d\n",dsznum);
printf("總經理數為%d\n",zglnum);
printf("副總經理數為%d",fzglnum);
printf("經理數為%d",glnum);
printf("副經理數為%d",fglnum);
printf("秘書數為%d",mishunum);
printf("技術員數為%d",jsynum);
printf("領班人數為%d",lbnum);
printf("員工數為%d",ygnum);
fclose(fp);
return;
}
void query()
{
FILE *fp;
int i=0;
char quename[8];
if((fp=fopen("employee.txt","r"))==NULL)
{
printf("不能夠打開文件,按任意鍵返回\n");
getch();
return;
}
printf("請你輸入要查詢的人的姓名\n");
scanf("%s",quename);
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
if(strcmp(em[i].name,quename)==0) /*找到,並顯示該職工記錄*/
{
printf("\t\t\n查詢到的職工號或姓名為的信息如下:\n");
printf("以下是你要查詢的人的信息\n");
printf("工號%d",em[i].num);
printf("職位為%d",em[i].position);
printf("\t1為董事長2為總經理3為副總經理\n");
printf("\t4為經理5為副經理6為秘書\n");
printf("\t7為技術員8為領班9為員工\n");
printf("姓名為%s",em[i].name);
printf("性別為%s",em[i].sex);
printf("\t其中m為男f為女");
printf("文化程度為%d",em[i].cult);
printf("\t1為專家2為博士3為碩士4為學士5為其他\n");
printf("工資為%d",em[i].salary);
printf("身體情況為%d",em[i].state);
printf("\n");
printf("查詢完畢,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
}
printf("沒有這樣的人,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
void querysalary()
{
int i;
FILE *fp1,*fp2;
creat();
if((fp1=fopen("employee.txt","w+"))==NULL)
return;
for(i=0;fread(&em[i],sizeof(struct employee),1,fp1)!=0;i++)
{
printf("輸出結果為:\n");
printf("工號%d",em[i].num);
printf("職位為%d",em[i].position);
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
printf("姓名為%s",em[i].name[8]);
printf("性別為%s",em[i].sex[2]);
printf("其中m為男f為女");
printf("文化程度為%d",em[i].cult);
printf("1為專家2為博士3為碩士4為學士5為其他\n");
printf("工資為%d",em[i].salary);
printf("身體情況為%d",em[i].state);
printf("1好2為一般3為差\n");
strcpy(emps[i].name,em[i].name);
emps[i].salary=em[i].salary;
}
if((fp2=fopen("empsalary.txt","w"))==NULL)
return;
for(i=0;i<N;i++)
fwrite(&emps[i],sizeof(struct empsalary),1,fp2);
fclose(fp1);
fclose(fp2);
}
void creat()
{
FILE *fp;
if((fp=fopen("employee.txt","w+"))==NULL)
return;
input();
fclose(fp);
}
void communicate()
{
int choicecommunicate;
printf("歡迎進入通訊錄系統\n");
printf("請你選擇操作類型:\n");
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("1為輸入通訊錄信息\n");
printf("2為查詢通訊錄信息\n");
printf("3為修改通訊錄信息\n");
printf("0為退出通訊錄系統\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
scanf("%d",&choicecommunicate);
switch(choicecommunicate)
{
case 1:
inputcommunicate();
break;
case 2:
querycommunicate();
break;
case 3:
changecommunicate();
break;
case 0:
{
printf("謝謝使用再見\n");
printf("按任意鍵返回\n");
getch();
return;
}
default:
printf("輸入有錯\n");
}
}
void inputcommunicate()
{
FILE *fp;
int choiceincom='y';
int i=0;
if((fp=fopen("empcom.txt","w"))==NULL)
{
printf("不能夠打開文件\n");
printf("任意鍵返回\n");
getch();
return;
}
printf("請你輸入通訊錄的信息:\n");
while(choiceincom=='y'||choiceincom=='Y')
{
i++;
printf("第%d個職工\n",i);
printf("請你輸入姓名:\n");
scanf("%s",empc[i].name);
printf("請你輸入辦公室電話號碼:\n");
scanf("%s",empc[i].officetel);
printf("請你輸入家庭電話號碼:\n");
scanf("%s",empc[i].hometel);
printf("請你輸入手機號碼:\n");
scanf("%s",empc[i].handtel);
printf("請你輸入地址:\n");
scanf("%s",empc[i].address);
printf("是否繼續輸入?(y/n)\n");
choiceincom=getch();
fwrite(&empc[i],sizeof(struct communication),1,fp);
}
if(toupper(choiceincom)=='N')
{
fclose(fp);
printf("輸入完畢,任意鍵返回\n");
return;
}
}
void querycommunicate()
{
FILE *fp;
int i=0;
char qcname[8];
if((fp=fopen("empcom.txt","r"))==NULL)
{
printf("不能夠打開文件,按任意鍵返回\n");
getch();
return;
}
printf("請你輸入要查詢的人的姓名:\n");
scanf("%s",qcname);
for(i=0;fread(&empc[i],sizeof(struct communication),1,fp)!=0;i++)
{
if(strcmp(empc[i].name,qcname)==0)
{
printf("以下為您所要求的信息:\n");
printf("姓名為%s\n",empc[i].name);
printf("辦公室電話號碼為%s\n",empc[i].officetel);
printf("家庭電話號碼為%s\n",empc[i].hometel);
printf("手機號碼為%s\n",empc[i].handtel);
printf("家庭地址為%s\n",empc[i].address);
printf("查詢完畢,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
}
printf("沒有這樣的人,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
void changecommunicate()
{
FILE *fp;
int i=0;
char chcname[8];
int choicecom;
if((fp=fopen("empcom.txt","w+"))==NULL)
{
printf("打不開文件按任意鍵返回\n");
getch();
return;
}
printf("請你輸入你要修改的人的姓名:\n");
scanf("%s",chcname);
for(i=0;fread(&empc[i],sizeof(struct communication),1,fp)!=0;i++)
{
if(strcmp(empc[i].name,chcname)==0)
{
printf("以下為您所要修改的人的信息:\n");
printf("姓名為%s\n",empc[i].name);
printf("辦公室電話號碼為%s\n",empc[i].officetel);
printf("家庭電話號碼為%s\n",empc[i].hometel);
printf("手機號碼為%s\n",empc[i].handtel);
printf("家庭地址為%s\n",empc[i].address);
printf("請你選擇要修改的東西:\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf("1修改辦公室電話號碼\n");
printf("2修改家庭電話號碼\n");
printf("3修改手機電話號碼\n");
printf("0退出系統\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
scanf("%d",&choicecom);
switch(choicecom)
{
case 1:
changetel1();
break;
case 2:
changetel2();
break;
case 3:
changetel3();
break;
case 0:
return;
default:
printf("輸入有錯\n");
}
}
}
}
void changetel1()
{
printf("參照上面有時間再編\n");
}
void changetel2()
{
printf("參照上面\n");
}
void changetel3()
{
printf("參照上面\n");
}
==============================================
編程愛好者群:24410693 只要對c有興趣就可以申請加入本群.
B. 如何非同步讀取ftp
一:開發背景
由於需要對多個伺服器發布大的數據包,所以自己在LINUX用c語言,開發了一個傳送器工具。因為上傳時需要支持斷點續傳,所以自己參考ftp-rfc959和一些文章開發了這個支持斷點續傳的上傳工具。整個工具分兩部分開發的:一是支持斷點續傳的Ftp工具,包含下載和上傳功能。二是同時對多個伺服器發布不同數據包的傳送器工具。本文只是對斷點續傳的商船和下載作探討。
二:實現
其實Ftp上傳下載的實現很簡單,首先Ftp伺服器端要支持文件的定位,
然後就是通過建立的Socket用Ftp伺服器命令和伺服器交互.
有些也可以通過Socket做自己的客戶端和伺服器端,但是有些伺服器是自己能管理控制的,而且原來自己也寫過一些這樣C/S模式的工具,簡單消息的傳送接收還不錯。
但用來傳輸文件效率很低,比文件傳送協議FTP(File Transfer Protocol)差的太多。 利用Ftp的服務端可以省去伺服器端的開發,而且可以向任何開放Ftp服務的伺服器上傳送文件,可以不考慮對方安裝的
是什麼的操作系統。
三:FTP
文件傳送協議 FTP 只提供文件傳送的一些基本的服務,它使用 TCP 可靠的運輸服務。FTP 的主要功能是減少或消除在不同操作系統下處理文件的不兼容性。
FTP 使用客戶伺服器方式。
一個 FTP 伺服器進程可同時為多個客戶進程提供服務。FTP的伺服器進程由兩大部分組成:一個主進程,負責接受新的請求;另外有若干個從屬進程,負責處理單個請求。
A、通常的方式:
控制連接在整個會話期間一直保持打開,FTP 客戶所發出的傳送請求通過控制連接發送給控制進程,但控制連接並不用來傳送文件,實際用於傳輸文件的是「數據連接」。
控制進程在接收到 FTP 客戶發送來的文件傳輸請求後就創建一個「數據傳送進程」和一個「數據連接」,並將數據連接連接到「數據傳送進程」,數據傳送進程實際完成文件的傳送,在傳送完畢後關閉「數據傳送連接」並結束運行
當客戶進程向伺服器進程發出建立連接請求時,要尋找連接伺服器進程的熟知埠(21),同時還要告訴伺服器進程自己的另一個埠號碼,用於建立數據傳送連接。接著,伺服器進程用自己傳送數據的熟知埠(20)與客戶進程所提供的埠號碼建立數據傳送連接。
B、 被動模式:
FTP客戶端發出的連接請求,一般通過伺服器的21號埠建立控制連接,專門用來傳輸一些字元串命令和響應信息。控制命令通道一定是由客戶端向伺服器的連接(默認的埠是21,也可以指定埠,這要看伺服器的設置)。
PASV:通過控制通道通過發送PASV 伺服器命令到 FTP伺服器。請求建立被動模式數據連接通道。 (客戶端的命令 passive)
伺服器返回連接的信息(227 Entering Passive Mode (70,0,10,62,120,18) )地址和埠。埠=最後第二位乘256再加上最後一位(120*256+18)。(注意埠設為0的情況) 如: *f_port = atoi(port_1) * 256 + atoi(port_2);
伺服器端和客戶端身份轉換,原客戶端在本地建立監聽,監聽來自原伺服器遠端的連接請求建立數據連接通道。
四、 實現方法:
A、下載:
1、向伺服器發送「REST + 本地文件長度」,告訴伺服器,客戶端要斷點下載了。這時伺服器還不知道客戶端要下載的文件名;
2、向伺服器發送"RETR + 文件名",通知伺服器要下載的文件名,這時伺服器開始定位文件指針讀文件並發送數據。
3、客戶端定位本地文件指針偏移到文件末尾;
4、兩端的准備工作都做完了以後,客戶端創建socket,以被動或非被動方式建立數據鏈接,循環調用recv接收文件數據並追加到本地文件末尾;
B、上傳:
1、獲取伺服器上和本地要上傳文件的同名文件大小;
2、向伺服器發送「APPE + 文件名」,通知伺服器,從數據通道發送給你的數據要附加到這個文件末尾。
3、定位本地文件指針,文件指針偏移到指定位置,這個位置與FTP伺服器上文件大小相同的位置。
4、從文件指針處讀數據並發送。
C、Ftp伺服器命令
我們平時使用的命令,大多是客戶端的。伺服器端的命令可以參考下面:
命令 描述
ABOR 中斷數據連接程序 ACCT <account> 系統特權帳號
ALLO <bytes> 為伺服器上的文件存儲器分配位元組 APPE <filename> 添加文件到伺服器同名文件
CDUP <dir path> 改變伺服器上的父目錄 CWD <dir path> 改變伺服器上的工作目錄
DELE <filename> 刪除伺服器上的指定文件 HELP <command> 返回指定命令信息 LIST <name> 如果是文件名列出文件信息,如果是目錄則列出文件列表 MODE <mode> 傳輸模式(S=流模式,B=塊模式,C=壓縮模式)
MKD <directory> 在伺服器上建立指定目錄 NLST <directory> 列出指定目錄內容
NOOP 無動作,除了來自伺服器上的承認 PASS <password> 系統登錄密碼
PASV 請求伺服器等待數據連接 PORT <address> IP 地址和兩位元組的埠 ID PWD 顯示當前工作目錄 QUIT 從 FTP 伺服器上退出登錄
REIN 重新初始化登錄狀態連接 REST <offset> 由特定偏移量重啟文件傳遞
RETR <filename> 從伺服器上找回(復制)文件 RMD <directory> 在伺服器上刪除指定目錄
RNFR <old path> 對舊路徑重命名 RNTO <new path> 對新路徑重命名
SITE <params> 由伺服器提供的站點特殊參數 SMNT <pathname> 掛載指定文件結構
STAT <directory> 在當前程序或目錄上返回信息 STOR <filename> 儲存(復制)文件到伺服器上
STOU <filename> 儲存文件到伺服器名稱上 STRU <type> 數據結構(F=文件,R=記錄,P=頁面)
SYST 返回伺服器使用的操作系統 TYPE <data type> 數據類型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系統登錄的用戶名
D、伺服器返回的部分數字代碼含義
125 Data connection already open; Transfer starting.
226 Transfer complete.
227 Entering Passive Mode (127,0,0,1,4,18).
230 User xxxxx logged in.
331 Password required for xxxxx.
425 Can』t open data connection.
226 Closing data connection.
200 return a state of TYPE or MODE commond
220 connection state
五、關於Socket
關於Socket編程有很多參考資料,這里不作詳細說明
Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面
Socket 是一個基本的通信機制Socket把復雜的TCP/IP協議族隱藏在Socket介面後面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協議.
Socket也具有一個類似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。
常用的Socket類型有兩種:
A、流式Socket(SOCK_STREAM):流式是一種面向連接的Socket,針對於面向連接的TCP服務應用。
B、數據報式Socket(SOCK_DGRAM):數據報式Socket是一種無連接的Socket,對應於無連接的UDP服務應用。
Socket的程序是一種C/S結構,分客戶端和伺服器端。
A、客戶端
– 初始化Socket
– 連接伺服器(connect),如果連接成功,這時客戶端與伺服器端的連接就建立了
– 客戶端發送數據請求,伺服器端接收請求並處理請求,然後把回應數據發送給客戶端
– 客戶端讀取數據,最後關閉連接,一次交互結束。
B、伺服器端
- 初始化Socket
- 埠綁定(bind)
- 監聽(listen)埠
- 調用accept阻塞,等待客戶端連接
在這里我們使用的就是面向連接的流式Socket,只編寫客戶端的程序。
六、代碼:
下面僅提供一個編譯過並在使用中的函數簡單的說明其實現原理,
需要有一點C語言和Linux/UNIX的socket編程基礎即可理解。
只是建立連接和傳輸部分的一個函數。當文件傳出結束或斷開時,
可以調用檢查函數看是否成功,位元組是否正常等,如果不正常結束,
可以再次循環調用它並定為伺服器文件的位元組,繼續傳輸。
其他的控制和功能都在其他函數中實現。為移植方便使用標准C語法符合C89標准。
code:
/*****************************************************************
* FileName: uftt_ver5.c *
* Company: algorithmics china lib Co.,Ltd. *
* Author: G.L.Zhang --- zglcl008 *
* Time: [2006-12-20] *
* Description: uninterrupted file transfers tools *
*****************************************************************/
int f_file_trans(const char *ft_addr, int ft_port, const char *ft_usr,const char *ft_pwd, const char *ft_opt, const char *ft_src, char *ft_obj, int ft_flg)
{
int cmd_sock = -1;
int dat_sock = -1;
int stream_sock= -1;
int dat_port = 0;
char dat_buffer[1024*5];
struct sockaddr_in f_server;
struct sockaddr_in f_datasvr;
unsigned char *pasv_ip = NULL;
unsigned char *pasv_port = NULL;
unsigned int len_addr = 0;
long rc_size = 0;
/* long svr_file_size = 0; */
long file_size = 0;
int rc = 0;
if (ft_addr == NULL || ft_usr == NULLft_pwd == NULL ||
ft_opt == NULL || ft_src == NULL || ft_obj == NULL ||
ft_port == 0 || ft_flg < 0) {
err_quit("--- file transfers parameter error");
}
/* get ftp commomd socket */
if ((cmd_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("cmmond socket");
err_quit("--- command sock error");
}
bzero(&f_server, sizeof(f_server));
f_server.sin_family = AF_INET;
f_server.sin_port = htons(ft_port);
f_server.sin_addr.s_addr = inet_addr(ft_addr);
if (connect(cmd_sock, (struct sockaddr *)&f_server, sizeof(f_server)) < 0) {
perror("connect");
err_quit("--- command sock error");
}
rc = uftt_cmd(dat_buffer, cmd_sock, NULL);
if (rc == 220)
printf("-1- %d OK\n", rc);
else
printf("-1- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"USER %s",ft_usr);
if (rc == 331)
printf("-2- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"PASS %s",ft_pwd);
if (rc == 230)
printf("-3- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "TYPE I");
if (rc == 200)
printf("-41- %d OK\n", rc);
else
printf("-41- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "MODE S");
if (rc == 200)
printf("-42- %d OK\n", rc);
else
printf("-42- %d ERR\n", rc);
memset(dat_buffer, ''\0'', sizeof(dat_buffer));
rc = uftt_cmd(dat_buffer, cmd_sock, "PASV");
if (rc == 227)
printf("-5- %d OK\n", rc);
else
printf("-5- %d ERR\n", rc);
#ifdef ZGL_DEBUG
printf("-5- %d %s\n", rc, dat_buffer);
#endif
/* get passive port */
dat_port = 0;
if ((rc = get_svr_port(dat_buffer, (int *)&dat_port)) < 0)
err_quit("data stream port error");
#ifdef ZGL_DEBUG
printf("--- pasive port=[%d]\n", dat_port);
#endif
if ((dat_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("data socket");
err_quit("--- data sock error");
}
len_addr = sizeof(f_datasvr);
bzero(&f_datasvr, sizeof(f_datasvr));
rc = getsockname(cmd_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
f_datasvr.sin_port = htons(dat_port);
/* 0=all port or appoint port TEST OK ***
f_datasvr.sin_port = htons(dat_port);
f_datasvr.sin_port = 0;
*/
if (bind(dat_sock,(struct sockaddr *)&f_datasvr,len_addr) == -1)
err_sys("--- data sock bind error");
if (listen(dat_sock,1) == -1)
err_sys("--- data sock bind error");
rc = getsockname(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
pasv_ip = (unsigned char *)&f_datasvr.sin_addr;
pasv_port = (unsigned char *)&f_datasvr.sin_port;
rc = uftt_cmd(dat_buffer, cmd_sock,"PORT %d,%d,%d,%d,%d,%d",pasv_ip[0],
pasv_ip[1], pasv_ip[2], pasv_ip[3], pasv_port[0], pasv_port[1]);
if (rc == 200)
printf("-6- %d OK\n", rc);
else
printf("-6- %d ERR\n", rc);
/* get RETR put STOR append APPE */
if (ft_flg == 0) {
rc = uftt_cmd(dat_buffer, cmd_sock, "STOR %s", ft_obj);
}
else if (ft_flg > 0){
rc = uftt_cmd(dat_buffer, cmd_sock, "APPE %s", ft_obj);
}
if (rc == 150)
printf("-7- %d OK\n", rc);
else
printf("-7- %d ERR\n", rc);
stream_sock = accept(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
if (stream_sock < 0)
err_sys("--- stream socket error");
rc_size = f_put_file(stream_sock, ft_src, ft_obj, ft_flg, file_size);
/* do without ***
rc = uftt_cmd(dat_buffer, dat_sock,"QUIT");
printf("-8- %d \n", rc);
*/
close(stream_sock);
close(dat_sock);
rc = uftt_cmd(dat_buffer, cmd_sock,"QUIT");
if (rc == 226)
printf("-9- %d OK\n", rc);
else
printf("-9- %d ERR\n", rc);
close(cmd_sock);
return rc_size ;
}
C. Auto CAD,哪有免費下載,我找了好多個,都不行了.急
AutoCAD的二次開發主要涉及以下內容:(1)編寫各種用戶自定義函數並形成若干LISP、ARX、VLX或ADS文件,以及一些DCL文件。(2)建立符合自己要求的菜單文件,一般可在AutoCAD原菜單文件內添加自己的內容,對於AutoCAD2000版本還可增加部分菜單文件,然後經交互方式加入到系統中去。(3)在系統的ACAD.LSP或類似文件中加入某些內容以便進行各種初始化操作,如在啟動時立即裝入一些文件等。(4)通過系統對話框設置某些路徑。這些操作在程序開發成功後向其它AutoCAD系統上安裝應用,特別是需要大批安裝時,需要進行很多文件檢索、內容增刪、子目錄創建、文件拷貝、系統設置等繁瑣工作,如能令上述工作全部自動進行,使整個二次開發程序在無人干預的情況下嵌入系統,將大大提高工作效率。
AutoCAD榮登全球繪圖軟體的龍頭寶座,主要是因為它具有開放的體系結構。它允許用戶和開發者採用高級編程語言對其進行擴充和修改,即二次開發,能最大限度地滿足用戶的特殊要求。AutoCAD第一版於1982年11月由AutoDESK公司推出,目前大家廣泛使用的是AutoCAD 2000或2002,最新版本是AutoCAD 2004,其二次開發語言及工具也在不斷地涌現
1 AutoLISP
AutoLISP的全名是LIST Processing Language,她出現於1985年推出的AutoCAD R2.18中,是一種嵌入在AutoCAD內部的編程語言,是LISP原版的一個子集,她一直是低版本AutoCAD的首選編程語言。它是一種表處理語言,是被解釋執行的,任何一個語句鍵入後就能馬上執行,它對於互動式的程序開發非常方便。其缺點是繼承了LISP語言的編程規則而導致繁多的括弧。
3 ADS
ADS的全名是AutoCAD Development System,它是AutoCAD的C語言開發系統,ADS本質上是一組可以用C語言編寫AutoCAD應用程序的頭文件和目標庫,它直接利用用戶熟悉的各種流行的C語言編譯器,將應用程序編譯成可執行的文件在AutoCAD環境下運行,這種可以在AutoCAD環境中直接運行的可執行文件叫做ADS應用程序。ADS由於其速度快,又採用結構化的編程體系,因而很適合於高強度的數據處理,如二次開發的機械設計CAD、工程分析CAD、建築結構CAD、土木工程CAD、化學工程CAD、電氣工程CAD等。
4 ObjectARX
ObjectARX是一種嶄新的開發AutoCAD應用程序的工具,她以C++為編程語言,採用先進的面向對象的編程原理,提供可與AutoCAD直接交互的開發環境,能使用戶方便快捷地開發出高效簡潔的Auto CAD應用程序。ObjectARX並沒有包含在AutoCAD中,可在AutoDESK公司網站中去下載,其最新版本是ObjectARX for AutoCAD 2000,它能夠對AutoCAD的所有事務進行完整的、先進的、面向對象的設計與開發,並且開發的應用程序速度更快、集成度更高、穩定性更強。ObjectARX從本質上講,是一種特定的C++編程環境,她包括一組動態鏈接庫(DLL),這些庫與AutoCAD在同一地址空間運行並能直接利用AutoCAD核心數據結構和代碼,庫中包含一組通用工具,使得二次開發者可以充分利用AutoCAD的開放結構,直接訪問AutoCAD資料庫結構、圖形系統以及CAD幾何造型核心,以便能在運行期間實時擴展AutoCAD的功能,創建能全面享受AutoCAD固有命令的新命令。ObjectARX的核心是兩組關鍵的API,即AcDb(Auto CAD資料庫)和AcEd(Auto CAD編譯器),另外還有其它的一些重要庫組件,如AcRX(Auto CAD實時擴展)、AcGi(Auto CAD圖形介面)、AcGe(Auto CAD幾何庫)、ADSRX(Auto CAD開發系統實時擴展)。ObjectARX 還可以按需要載入應用程序;使用ObjectARX進行應用開發還可以在同一水平上與Windows系統集成,並與其它Windows應用程序實現交互操作。
5 VisualLISP
VisualLISP已經被完整地集成到AutoCAD 2000中,她為開發者提供了嶄新的、增強的集成開發環境,一改過去在AutoCAD中內嵌AtuoLISP運行引擎的機制,這樣開發者可以直接使用AutoCAD中的對象和反應器,進行更底層的開發。其特點為自身是AutoCAD 2000中默認的代碼編輯工具;用它開發AutoLISP程序的時間被大大地縮短,原始代碼能被保密,以防盜版和被更改;能幫助大家使用ActiveX對象及其事件;使用了流行的有色代碼編輯器和完善的調試工具,使大家很容易創建和分析LISP程序的運行情況。在VisualLISP中新增了一些函數:如基於AutoLISP的ActiveX/COM自動化操作介面;用於執行基於Auto CAD內部事件的LISP程序的對象反應器;新增了能夠對操作系統文件進行操作的函數。
6 VBA
VBA 即Mcrosoft office中的Visual Basic for Applications,它被集成到AutoCAD 2000中。VBA為開發者提供了一種新的選擇,也為用戶訪問AutoCAD 2000中豐富的技術框架打開一條新的通道。VBA和AutoCAD 2000中強大的ActiveX自動化對象模型的結合,代表了一種新型的定製AutoCAD的模式構架。通過VBA,我們可以操作AutoCAD,控制ActiveX和其它一些應用程序,使之相互之間發生互易活動。
D. C語言程序設計題
這有一個常式序,跟你的要求有出入,不過肯定對你有幫助!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define N 100
struct employee//職工基本情況
{
int num;//工號
int position;//職位1為董事長2為總經理3為副總經理等
char name[8];//姓名
char sex[2];//性別f為女m為男
int age;//年齡
int cult;//文化程度1為專家2為博士3為碩士4為學士5為其他
int salary;//工資
int state;//健康情況分為good,general,bad
}em[N];
struct communication//職工通訊錄
{
char name[8];
char officetel[13];
char hometel[13];
char handtel[13];
char address[13];
}empc[N];
struct empsalary//職工工資與姓名的文件
{
char name[8];
int salary;
}emps[N];
void manage();
void query();
void communicate();
void input();
void display();
void change();
void del();
void add();
void count();
int changeposition();
int changecult();
int changesalary();
int changestate();
void querysalary();
void creat();
void inputcommunicate();
void querycommunicate();
void changecommunicate();
void changetel1();
void changetel2();
void changetel3();
char password[7]="123456";
void main()
{
int choice;
char s[7];
int flag=0;
int n=3;
do
{
printf("棚梁州請你輸入密碼:\n");
scanf("%s",s);
if(!strcmp(s,password))//若密碼正確
{
printf("恭喜你成功登陸了\n\n\n");
flag=1;
break;
}
else
{
printf("輸入有錯誤請重新輸入:\n");
n--;
}
}while(n>0);
if(!flag)
{
printf("你的輸入次數已到再見\n");
}
do
{
printf("~~~~~~~~~~\t\t\t~~~~~~~~~~~~\n");
printf("\t\渣雀t歡迎進入職工管理系統中文版\n");
printf("製作人:黃仕福\t班級:計081班\t學號:303011608217\n");
printf("聯系地址:石家莊經鏈蔽濟學院\n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf("\t\t請你選擇操作類型:\n");
printf("==============\t\t==============\n");
printf("\t\t1進入管理系統\n");
printf("\t\t2進入查詢系統\n");
printf("\t\t3進入通訊錄\n");
printf("\t\t0退出系統\n");
printf("==============\t\t==============\n");
printf("說明:版權歸作者所有違者必究\n\n\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
manage();
break;
case 2:
query();
break;
case 3:
communicate();
break;
case 0:
{
printf("謝謝使用再見\n");
exit(0);
}
default:
{
printf("輸入有錯誤請重新輸入:\n");
return;
}
}
}while(1);
}
void manage()
{
int choicemanage;
char choice='y';
while(choice=='y'||choice=='Y')
{
printf("\t\t歡迎進入管理系統\n");
printf("===================\n");
printf("\t\t請你選擇操作類型:\n");
printf("\t\t1輸入職工信息\n");
printf("\t\t2顯示職工信息\n");
printf("\t\t3修改職工信息\n");
printf("\t\t4追加一個職工信息\n");
printf("\t\t5刪除一個職工信息\n");
printf("\t\t6統計職工信息\n");
printf("\t\t0返回\n");
printf("=====================\n");
scanf("%d",&choicemanage);
switch(choicemanage)
{
case 1:
input();//輸入職工信息
break;
case 2:
display();//顯示職工信息
break;
case 3:
change();//修改職工信息
break;
case 4:
add();//追加一個職工信息
break;
case 5:
del();//刪除一個職工信息
break;
case 6:
count();//統計職工信息
break;
case 0:
printf("謝謝你的使用再見\n");
return;
default:
printf("你的輸入有錯請重新輸入\n");
}
printf("是否繼續管理?(y/n)");
scanf("%s",&choice);
}
if(toupper(choice)=='N'||(choice)=='n')
{
printf("輸入完畢,任意鍵返回\n");
getch();
return;
}
}
void input()
{
FILE *fp;
int i=0;
char choiceinput='y';
if((fp=fopen("employee.txt","w"))==NULL)
return;
while(choiceinput=='y'||choiceinput=='Y')
{
i++;
printf("第%d個職工\n",i);
printf("\n");
printf("請你輸入工號:\n");//輸入工號
scanf("%d",&em[i].num);
printf("\n");
printf("請你輸入職位:\n");//輸入職位
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
scanf("%d",&em[i].position);
printf("\n");
printf("請你輸入姓名:\n");//輸入姓名
scanf("%s",em[i].name);
printf("\n");
printf("請你輸入性別以m為男f為女:\n");//輸入性別
scanf("%s",em[i].sex);
printf("\n");
printf("請你輸入文化程度:\n");//輸入文化程度
printf("1為專家2為博士3為碩士4為學士5為其他\n");
scanf("%d",&em[i].cult);
printf("\n");
printf("請你輸入工資:\n");//輸入工資
scanf("%d",&em[i].salary);
printf("\n");
printf("請你輸入身體情況:\n");//身體情況
printf("1好2為一般3為差\n");
scanf("%d",&em[i].state);
printf("\n");
printf("是否繼續輸入?(y/n)\n");
scanf("%s",&choiceinput);
fwrite(&em[i],sizeof(struct employee),1,fp);
}
if(toupper(choiceinput)=='N')
{
fclose(fp);
printf("輸入完畢,任意鍵返回\n");
getch();
return;
}
}
void display()//顯示職工信息
{
FILE *fp;
int i;
if((fp=fopen("employee.txt","r"))==NULL)
return;
printf("輸出結果:\n");
printf("工號 職位 姓名 性別 文化程度 工資 身體情況\n");
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
printf("工號%d\n",em[i].num);
printf("職位為%d\n",em[i].position);
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
printf("姓名為%s\n",em[i].name);
printf("性別為%s\n",em[i].sex);
printf("其中m為男f為女\n");
printf("文化程度為%d\n",em[i].cult);
printf("1為專家2為博士3為碩士4為學士5為其他\n");
printf("工資為%d\n",em[i].salary);
printf("身體情況為%d\n",em[i].state);
printf("1好2為一般3為差\n");
}
printf("完畢按任意鍵返回\n");
getch();
fclose(fp);
return;
}
void change()
{
FILE *fp;
int i;
char chname[8];
int choicechange;
printf("請你輸入要修改的人的姓名:\n");
scanf("%s",&chname);
if((fp=fopen("employee.txt","w+"))==NULL)
{
printf("不能夠打開這個文件\n");
return;
}
for(i=0;i<N;i++)
{
if(strcmp(chname,em[i].name)==0)
{
printf("這是你要修改的人的信息\n");
printf("工號為%d職位為%d姓名為%s性別為%s文化程度為%d工資為%d身體為%d\n",em[i].num,em[i].position,em[i].name,em[i].sex,em[i].cult,em[i].salary,em[i].state);
printf("------------------------------------------------------------\n");
printf("請你輸入要修改的部分:\n");
printf("======================\n");
printf("1修改職位\n");
printf("2修改文化程度\n");
printf("3修改工資\n");
printf("4修改身體情況\n");
printf("0退出系統\n");
printf("======================\n");
printf("請選擇\n");
scanf("%d",&choicechange);
switch(choicechange)
{
case 1:
em[i].position=changeposition();
break;
case 2:
em[i].cult=changecult();
break;
case 3:
em[i].salary=changesalary();
break;
case 4:
em[i].state=changestate();
break;
case 0:
return;
default :
printf("輸入有錯誤");
}
fwrite(&em[i],sizeof(struct employee),1,fp);
}
}
fclose(fp);
printf("操作完成按任意鍵返回\n");
getch();
return;
}
int changeposition()
{
int newposition;
printf("請你輸入新職位:\n");
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
scanf("%d",&newposition);
return(newposition);
}
int changecult()
{
int newcult;
printf("請你輸入新的文憑:\n");
printf("1為專家2為博士3為碩士4為學士5為其他\n");
scanf("%d",&newcult);
return(newcult);
}
int changesalary()
{
int newsalary;
printf("請你輸入新的工資:\n");
scanf("%d",&newsalary);
return(newsalary);
}
int changestate()
{
int newstate;
printf("請你輸入現在的身體情況:\n");
printf("1好2為一般3為差\n");
scanf("%d",&newstate);
return(newstate);
}
void add()//追加一個職工信息
{
struct employee emp;
FILE *fp;
int i=0;
if((fp=fopen("employee.txt","ab+"))==NULL)
{
printf("不能夠打開這個文件\n");
getch();
return;
}
printf("請你輸入新人的內容:\n");
printf("請你輸入工號:\n");//輸入工號
scanf("%d",&emp.num);
printf("請你輸入職位:\n");//輸入職位
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
scanf("%d",&emp.position);
printf("請你輸入姓名:\n");//輸入姓名
scanf("%s",emp.name);
printf("請你輸入性別以m為男f為女:\n");//輸入性別
scanf("%s",emp.sex);
printf("請你輸入文化程度:\n");//輸入文化程度
printf("1為專家2為博士3為碩士4為學士5為其他\n");
scanf("%d",&emp.cult);
printf("請你輸入工資:\n");//輸入工資
scanf("%d",&emp.salary);
printf("請你輸入身體情況:\n");//身體情況
printf("1好2為一般3為差\n");
scanf("%d",&emp.state);
fwrite(&emp,sizeof(struct employee),1,fp);
rewind(fp);
printf("插入完畢,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
void del()//刪除一個職工信息
{
int i=0;
char delname[8];
FILE *fp;
if((fp=fopen("employee.txt","w"))==NULL)
{
printf("文件為空,不能夠打開\n");
printf("按任意鍵返回\n");
getch();
return;
}
printf("請你輸入要刪除的人的姓名:\n");//刪除的職工的信息
scanf("%s",delname);
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
if(strcmp(em[i].name,delname)!=0)
fwrite(&em[i],sizeof(struct employee),1,fp);
}
fclose(fp);
if((fp=fopen("employee.txt","r"))==NULL)//顯示新的職工的信息
return;
printf("新的職工的信息為:\n");
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
printf("工號%d",em[i].num);
printf("職位為%d",em[i].position);
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
printf("姓名為%s",em[i].name[8]);
printf("性別為%s",em[i].sex[2]);
printf("其中m為男f為女");
printf("文化程度為%d",em[i].cult);
printf("1為專家2為博士3為碩士4為學士5為其他\n");
printf("工資為%d",em[i].salary);
printf("身體情況為%d",em[i].state);
printf("1好2為一般3為差\n");
fclose(fp);
}
}
void count()
{
FILE *fp;
int i=0;
int num=0;//總人數統計
int mnum=0,fnum=0;//性別人數統計
int expernum=0,doctornum=0,masternum=0,bechelornum=0,othernum=0;//學位人數統計
int dsznum=0,zglnum=0,fzglnum=0,glnum=0,fglnum=0;//職位人數統計
int mishunum=0,jsynum=0,lbnum=0,ygnum=0;
if((fp=fopen("employee.txt","r"))==NULL)
{
printf("不能夠打開這個文件\n");
printf("按任意鍵繼續\n");
getch();
return;
}
do
{
fread(&em[i],sizeof(struct employee),1,fp);
if(feof(fp))
break;
num++;
if(strcmp(em[i].sex,"m")==0)
mnum++;
if(strcmp(em[i].sex,"f")==0)
fnum++;
if(em[i].cult==1)
expernum++;
if(em[i].cult==2)
doctornum++;
if(em[i].cult==3)
masternum++;
if(em[i].cult=4)
bechelornum++;
if(em[i].cult=5)
othernum++;
if(em[i].position==1)//職位統計
dsznum++;
if(em[i].position==2)
zglnum++;
if(em[i].position==3)
fzglnum++;
if(em[i].position==4)
glnum++;
if(em[i].position==5)
fglnum++;
if(em[i].position==6)
mishunum++;
if(em[i].position==7)
jsynum++;
if(em[i].position==8)
lbnum++;
if(em[i].position==9)
ygnum++;
i++;
}while(1);
printf("總人數為%d\n",num);
printf("====性別分類=====\n");
printf("男人數為%d\n",mnum);
printf("女人數為%d\n",fnum);
printf("=====文憑分類=====\n");
printf("專家數為%d\n",expernum);
printf("博士數為%d\n",doctornum);
printf("碩士數為%d\n",masternum);
printf("學士數為%d\n",bechelornum);
printf("其他的數為%d\n",othernum);
printf("=====職位分類========\n");
printf("董事長數為%d\n",dsznum);
printf("總經理數為%d\n",zglnum);
printf("副總經理數為%d",fzglnum);
printf("經理數為%d",glnum);
printf("副經理數為%d",fglnum);
printf("秘書數為%d",mishunum);
printf("技術員數為%d",jsynum);
printf("領班人數為%d",lbnum);
printf("員工數為%d",ygnum);
fclose(fp);
return;
}
void query()
{
FILE *fp;
int i=0;
char quename[8];
if((fp=fopen("employee.txt","r"))==NULL)
{
printf("不能夠打開文件,按任意鍵返回\n");
getch();
return;
}
printf("請你輸入要查詢的人的姓名\n");
scanf("%s",quename);
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
if(strcmp(em[i].name,quename)==0) /*找到,並顯示該職工記錄*/
{
printf("\t\t\n查詢到的職工號或姓名為的信息如下:\n");
printf("以下是你要查詢的人的信息\n");
printf("工號%d",em[i].num);
printf("職位為%d",em[i].position);
printf("\t1為董事長2為總經理3為副總經理\n");
printf("\t4為經理5為副經理6為秘書\n");
printf("\t7為技術員8為領班9為員工\n");
printf("姓名為%s",em[i].name);
printf("性別為%s",em[i].sex);
printf("\t其中m為男f為女");
printf("文化程度為%d",em[i].cult);
printf("\t1為專家2為博士3為碩士4為學士5為其他\n");
printf("工資為%d",em[i].salary);
printf("身體情況為%d",em[i].state);
printf("\n");
printf("查詢完畢,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
}
printf("沒有這樣的人,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
void querysalary()
{
int i;
FILE *fp1,*fp2;
creat();
if((fp1=fopen("employee.txt","w+"))==NULL)
return;
for(i=0;fread(&em[i],sizeof(struct employee),1,fp1)!=0;i++)
{
printf("輸出結果為:\n");
printf("工號%d",em[i].num);
printf("職位為%d",em[i].position);
printf("1為董事長2為總經理3為副總經理\n");
printf("4為經理5為副經理6為秘書\n");
printf("7為技術員8為領班9為員工\n");
printf("姓名為%s",em[i].name[8]);
printf("性別為%s",em[i].sex[2]);
printf("其中m為男f為女");
printf("文化程度為%d",em[i].cult);
printf("1為專家2為博士3為碩士4為學士5為其他\n");
printf("工資為%d",em[i].salary);
printf("身體情況為%d",em[i].state);
printf("1好2為一般3為差\n");
strcpy(emps[i].name,em[i].name);
emps[i].salary=em[i].salary;
}
if((fp2=fopen("empsalary.txt","w"))==NULL)
return;
for(i=0;i<N;i++)
fwrite(&emps[i],sizeof(struct empsalary),1,fp2);
fclose(fp1);
fclose(fp2);
}
void creat()
{
FILE *fp;
if((fp=fopen("employee.txt","w+"))==NULL)
return;
input();
fclose(fp);
}
void communicate()
{
int choicecommunicate;
printf("歡迎進入通訊錄系統\n");
printf("請你選擇操作類型:\n");
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("1為輸入通訊錄信息\n");
printf("2為查詢通訊錄信息\n");
printf("3為修改通訊錄信息\n");
printf("0為退出通訊錄系統\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
scanf("%d",&choicecommunicate);
switch(choicecommunicate)
{
case 1:
inputcommunicate();
break;
case 2:
querycommunicate();
break;
case 3:
changecommunicate();
break;
case 0:
{
printf("謝謝使用再見\n");
printf("按任意鍵返回\n");
getch();
return;
}
default:
printf("輸入有錯\n");
}
}
void inputcommunicate()
{
FILE *fp;
int choiceincom='y';
int i=0;
if((fp=fopen("empcom.txt","w"))==NULL)
{
printf("不能夠打開文件\n");
printf("任意鍵返回\n");
getch();
return;
}
printf("請你輸入通訊錄的信息:\n");
while(choiceincom=='y'||choiceincom=='Y')
{
i++;
printf("第%d個職工\n",i);
printf("請你輸入姓名:\n");
scanf("%s",empc[i].name);
printf("請你輸入辦公室電話號碼:\n");
scanf("%s",empc[i].officetel);
printf("請你輸入家庭電話號碼:\n");
scanf("%s",empc[i].hometel);
printf("請你輸入手機號碼:\n");
scanf("%s",empc[i].handtel);
printf("請你輸入地址:\n");
scanf("%s",empc[i].address);
printf("是否繼續輸入?(y/n)\n");
choiceincom=getch();
fwrite(&empc[i],sizeof(struct communication),1,fp);
}
if(toupper(choiceincom)=='N')
{
fclose(fp);
printf("輸入完畢,任意鍵返回\n");
return;
}
}
void querycommunicate()
{
FILE *fp;
int i=0;
char qcname[8];
if((fp=fopen("empcom.txt","r"))==NULL)
{
printf("不能夠打開文件,按任意鍵返回\n");
getch();
return;
}
printf("請你輸入要查詢的人的姓名:\n");
scanf("%s",qcname);
for(i=0;fread(&empc[i],sizeof(struct communication),1,fp)!=0;i++)
{
if(strcmp(empc[i].name,qcname)==0)
{
printf("以下為您所要求的信息:\n");
printf("姓名為%s\n",empc[i].name);
printf("辦公室電話號碼為%s\n",empc[i].officetel);
printf("家庭電話號碼為%s\n",empc[i].hometel);
printf("手機號碼為%s\n",empc[i].handtel);
printf("家庭地址為%s\n",empc[i].address);
printf("查詢完畢,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
}
printf("沒有這樣的人,按任意鍵返回\n");
getch();
fclose(fp);
return;
}
void changecommunicate()
{
FILE *fp;
int i=0;
char chcname[8];
int choicecom;
if((fp=fopen("empcom.txt","w+"))==NULL)
{
printf("打不開文件按任意鍵返回\n");
getch();
return;
}
printf("請你輸入你要修改的人的姓名:\n");
scanf("%s",chcname);
for(i=0;fread(&empc[i],sizeof(struct communication),1,fp)!=0;i++)
{
if(strcmp(empc[i].name,chcname)==0)
{
printf("以下為您所要修改的人的信息:\n");
printf("姓名為%s\n",empc[i].name);
printf("辦公室電話號碼為%s\n",empc[i].officetel);
printf("家庭電話號碼為%s\n",empc[i].hometel);
printf("手機號碼為%s\n",empc[i].handtel);
printf("家庭地址為%s\n",empc[i].address);
printf("請你選擇要修改的東西:\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf("1修改辦公室電話號碼\n");
printf("2修改家庭電話號碼\n");
printf("3修改手機電話號碼\n");
printf("0退出系統\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
scanf("%d",&choicecom);
switch(choicecom)
{
case 1:
changetel1();
break;
case 2:
changetel2();
break;
case 3:
changetel3();
break;
case 0:
return;
default:
printf("輸入有錯\n");
}
}
}
}
void changetel1()
{
printf("參照上面有時間再編\n");
}
void changetel2()
{
printf("參照上面有時間再編\n");
}
void changetel3()
{
printf("參照上面有時間再編\n");
}
E. c語言知識
錯了,比如 「&」或者「%」。標識符由字母(A-Z,a-z)、數字(0-9)、下劃線「_」組成,並且首字元不能是數字,但可以是字母或者下劃線。例如,正確的標識符:abc,a1,prog_to(摘自網路升備網路)
是滴,正笑尺至少我學的只是目前是這樣....(就連 javascript語言裡面,你在申明變數時至少寫上 var)
是滴...但是必須保舉高證先申明 後 使用
是滴
是滴(可參考,http://..com/question/17533722,雖然他是說vb,不過這一點一樣吧...)
這個我沒懂你是什麼意思...字元常量可以參見:http://bbs.chinaunix.net/thread-4090169-1-1.html 中的8樓....
是滴...參見 網路:http://ke..com/link?url=W2V4w4mH_
typedef
外部變數。參見:http://ke..com/link?url=
const 。請注意和static的區別。可參考:http://..com/question/293786823.html