第一篇:C语言上机实习报告
一、实验目的
1.能够描述VC++6.0开发平台的使用过程,学会运行一个C程序的基本步骤,包括编辑、编译、链接和运行。
2.能够使用算术表达式和赋值表达式书写正确的语句。3.能够使用输入/输出函数编写简单的程序。
二、实验环境
(调试程序所使用的软硬件环境)软件环境:VC++6.0 硬件环境:宏基
Intel 奔4 主频 2.8GHz,内存256MB
三、实验内容、结果及分析
1、题目1)求华氏温度150°F对应的摄氏温度。计算公式如下: 55cf32
其中:c表示摄氏温度,f表示华氏温度。源程序清单:(调试好的源程序代码)// work1.cpp : Defines the entry point for the console application.//
#include “stdafx.h” #include
} 主要标识符说明:(源程序中主要标识符含义说明)Double为双精度类型变量名表
实验结果:(程序运行结果)double f,c;cout<<“输入华氏温度,按Enter执行”< 实验中遇到的问题及解决的方法 源代码的粘贴出现乱码 解决:从Cpp文件中粘消除格式。 2、题目 已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均分。 源程序清单:(调试好的源程序代码)// work2.cpp : Defines the entry point for the console application.// #include “stdafx.h” #include double a,b,c,average;cout<<“请按顺序输入数学、英语、计算机三科成绩。”< 实验中遇到的问题及解决的方法 3、题目 当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。 源程序清单:(调试好的源程序代码)// work3.cpp : Defines the entry point for the console application.// #include “stdafx.h” #include int n,digit1,digit2,digit3;cout<<“请输入一个三位数n(100﹏999)”< //求个位数字 digit2=n/10%10; //求十位数字 digit3=n/100%10; //求百位数字 cout<<“个位数字(digit1)”< 实验中遇到的问题及解决的方法 四、实验体会(心得、收获) C语言对我们来说是一个崭新的学科。我想学习C语言就像学习其他学科一样,需要我们用心的去学习。它也是我们交流的一种新的方式。只不过是人机之间的。随着科学的进步,与社会的发展,计算机显得尤为重要。C语言又是学习计算机的基础,所以我们更应该该好好的学习C语言。通过这节实验课,我们学到了如何运用6.0来编辑代码,运行我自己编写的程序。虽然过程中会有错误,但在这犯错的过程中我学到了我所不知道的。在这纠错的过程中,我来了解到我还有很多的地方不足。如忘记写分号等。其实就错就是个学习的过程。 对于实验上的问题,如粘源代码时,就应先用记事本打开源代码,就可以。而不是在程序中直接粘,这样就不会出现乱码。还有,就是注意小处的错误,如分号和注意换行的使用。 苏州科技大学上机实习报告 程序设计语言(C语言) 实验一: Visual C++实验环境 一、实验任务 实验一 二、实验目的 1.了解C程序结构,熟悉VC++ 6.0开发环境。 2.熟悉在VC++ 6.0开发环境中编辑、编译、连接、运行和调试C语言程序。3.通过运行简单的C语言程序,初步连接C语言源程序的特点。 三、实验环境 硬件:PC兼容机 CPU Core i5,内存4GB; 操作系统:中文版 Windows 7; 应用软件 Visual C++ 6.0程序开发环境。 四、实验准备及作业提交方法 1.提交位置 在计算机硬盘(E盘)上新建以学生“学号姓名”命名的文件夹,本次实验学生编写的程序文件先保存到上述文件夹中,待上机实验结束时,将文件夹通过校园网络提交到规定服务器位置上。2.提交内容 本次作业需提交2类文件:.c文件、上机实习报告.doc 五、实验内容(因实验内容较多,本实验报告中仅体现部分内容) 1.编写一个程序,输出以下信息: ***************************** Welcome to the world of C! ***************************** 【源程序代码】 电子与信息工程学院上机实习报告 第1页 2.编写程序求两数之和 【源程序代码】 3. 编写程序。 【源程序代码 六、思考与实践 6.【修改后源程序代 】 码】 7.【源程序代码】 七、实验分析总结 有时候多个错误只要改第一个就行了。不能忘记尾部的‘;’。C语言要敢于动手尝试,不能逃避困难。 班级:学号:姓名: 填空题 第一题 题目要求(11) 下列给定程序中,函数fun的功能是:将形参中,各位偶数的数取出,并按原来从高位到低位相反的顺序组成一个新数,作为函数值返回。例如,输入一个整数27638496,中。. #include int fun(char*source, char*target){FILE*fs,*ft;charch;/**********found**********/if((fs=fopen(source,“w”_))==NULL)return 0; if((ft=fopen(target, “w”))==NULL)函数返回值为64862 #include unsigned long fun(unsigned longn){ unsigned longx=0;intt;while(n){ t=n%10; /**********found**********/if(t%2==0) /**********found**********/x=10*x+t; /**********found**********/n=n/10;}returnx;} main() { unsigned longn=-1;while(n>99999999||n<0){ printf(“Please input(0 ”);scanf(“%ld”,&n);} printf(“nThe result is: %ldn”,fun(n));} 1、做题分析: ① 本题考查:已知某数,如何求该数各个 位数值,已知各个位数值,如何表示该数;除法运算。将十位取出数以用于下次运算故改为n/10 第二题(11) 1、题目要求 .给定程序的功能是;调用函数fun将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值是1,失败时返回值为O。在复制的过程中,把复制的内容输出到终端屏幕。主函数中源文件名放在变量sfname中,目标文件名放在变量tfname return 0; printf(“nThe data in file :n”);ch=fgetc(fs); /**********found**********/while(!feof(fs)){putchar(ch); /**********found**********/fputc(ch,ft);ch=fgetc(fs);} fclose(fs);fclose(ft);printf(“nn”);return1;} main(){ char sfname[20] =“myfile1”,tfname[20]=“myfile2”; FILE*myf;inti;charc;myf=fopen(sfname,“w”);printf(“nThe original data :n”);for(i=1;i<30;i++){ c='A'+rand()%25;fprintf(myf,“%c”,c);printf(“%c”,c);} fclose(myf);printf(“nn”);if(fun(sfname,tfname))printf(“Succeed!”); elseprintf(“Fail!”);} 答案:【1】“r” 【2】fs【3】ft 2、做题分析 ① 对数据文件部分的知识掌握不透彻。首 先以读的方式打开文件看看是否有数据在里面,然后再进行操作,故应将“w”改为“r”。第三题 班级:学号:姓名: 1、题目要求 给定程序的功能是:从键盘输入若干行文件(每行不超过80个字符),写到文件myfile4.txt中,用-1作为字符串输入结束的标志。然后将文件的内容读出显示在屏幕上。文件的读写分别由自定义函数ReadText和WriteText实现。#include {FILE*fp; if((fp=fopen(“myfile4.txt”,“w”))==NULL) {printf(“ open fail!n”);exit(0);} WriteText(fp);fclose(fp); if((fp=fopen(“myfile4.txt”,“r”))==NULL) {printf(“ open fail!n”);exit(0);} ReadText(fp);fclose(fp);} /**********found**********/ void WriteText(FILE___1___){charstr[81]; printf(“nEnter string with-1 to end :n”);gets(str); while(strcmp(str,“-1”)!=0){ /**********found**********/fputs(___2___,fw);fputs(“n”,fw);gets(str);} } void ReadText(FILE*fr){charstr[81]; printf(“nRead file and output to screen :n”); fgets(str,81,fr);while(!feof(fr)){ /**********found**********/printf(“%s”,___3___);fgets(str,81,fr);} } 2、做题分析 答案:【1】*fw【2】str【3】str ①本题考查:函数定义以及文件指针;fputs函数的功能是向指定的文件写入一个字符串,其调用形式为: fputs(字符串,文件指针)。 【解题思路】 填空1:定义函数,函数的形参是一个文件类型的指针。 填空2:此处考查fputs函数的形式,应填入str。 填空3:依据printf函数的格式,输出字符串内容,即printf(“%s”,str)。 班级:姓名:学号: 第一题 一、题目要求(11题) #include STRECfun(STREC*a, char *b){ int i; STREC str={“ ”,-1};/*若没找到指定的学号,在结构体变量中给学号置空串,给成绩置-1*/ for(i=0;i if(strcmp(a[i].num,b)==0)/*找到指定学号的学生数据*/ str=a[i]; str=a[i]; return str;/*返回学生记录*/ }} main(){STREC s[N]={{“GA005”,85},{“GA003”,76},{“GA002”,69},{“GA004”,85},{“GA001”,91},{“GA007”,72},{“GA008”,64},{“GA006”,87},{“GA015”,85},{“GA013”,91},{“GA012”,64},{“GA014”,91},{“GA011”,77},{“GA017”,64},{“GA018”,64},{“GA016”,72}};STRECh;charm[10]; inti;FILE *out; printf(“The original data:n”);for(i=0;i {if(i%4==0)printf(“n”); printf(“%s %3d”,s[i].num,s[i].s);} printf(“nnEnter the number:”);gets(m);h=fun(s,m); printf(“The data :”); printf(“n%s%4dn”,h.num,h.s);printf(“n”); out = fopen(“out.dat”,“w”);h=fun(s,“GA013”); fprintf(out,“%s%4dn”,h.num,h.s);fclose(out);} 第二题 编写函数fun,它的功能是:利用以下所示的简单迭代方法求方程COS(x)-x=O的一个实根。Xn+1=COS(Xn)。迭代步骤如下:(1)取x1初值为0.0; (2)xO=xl,把xl的值赋给xO:(3)x1=COS(x0),求出一个新的x1;(4)若x0-xl的绝对值小于0.000001,则执行步骤(5),否则执行步骤(2); (5)所求x1就是方程COS(x)-x=0的一个实根,作为函数值返回。程序将输出结果 Root=0.739085。#include printf(“Root=%fn”,fun());} 第三题 一、题目要求 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符 串中的前导*号全部移到字符串的尾部。例如,若字符串中的内容为*******A*BC*DEF*G**** 移动后,字符串中的内容应当是A*BC*DEF*G***********。在编写函数时,不得使用C语言提供的字符串函数。 #include { char s[81],*p;int n=0; printf(“enter a string:n”);gets(s);fun(s); printf(“the string after moving:n”);puts(s);} 一、做题分析 【参考答案】 voidfun(char *a){ int i=0,n=0;char *p;p=a; while(*p=='*')/*判断*p是否是*号,并统计*号的个数*/{ n++;p++;} while(*p)/*将前导*号后的字符传递给a*/{ a[i]=*p;i++;p++;} while(n!=0){ a[i]='*';i++;n--;} a[i]=' ';} 二、做题分析 【考点分析】 本题考查:移动字符串中指定字符的位置,一般采用while循环语句,通过指针型变量来完成。 【解题思路】 函数fun的功能:将字符串中的前导*号全部移到字符串的尾部。本题解题思路:(1)定义一个指针并指向字符串的首地址;(2)利用循环语句找出字符串的前导*号的个数n;(3)利用循环语句把剩余的字符拷贝到另一个字符串中;(4)在字符串的末尾接上n个*号。 第四题 题目要求 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数最高的学生数据放在h所指的数组中,注意:分数最高的学生可能不只一个,函数返回分数最高的学生的人数。 #include int fun(STREC *a, STREC *b){ } main(){STREC s[N]={{“GA05”,85},{“GA03”,76},{“GA02”,69},{“GA04”,85},{“GA01”,91},{“GA07”,72},{“GA08”,64},{“G A06”,87},{“GA015”,85},{“GA013”,91},{“GA012”,64}, {“GA014”,91},{“GA011”,77},{“GA017”,64}, {“GA018”,64},{“GA016”,72}}; STREC h[N];int i,n;FILE *out;n=fun(s,h); printf(“the %d highest score :n”,n);for(i=0;i printf(“%s%4dn”,h[i].num,h[i].s);printf(“n”); out=fopen(“out15.dat”,“w”);fprintf(out, “%dn”,n);for(i=0;i 二、做题分析 1、应该先用for循环找出这些学生中成绩最高的然后再利用for循环结构把和最高成绩一样的找出来并用j记录最高成绩的个数。注:本题主要考察结构体的应用。故函数如下intfun(STREC*a, STREC *b){ int i,j=0,max=a[0].s;/*找出最大值*/for(i=0;i if(max for(i=0;i if(max==a[i].s)b[j++]=a[i]; /*找出成绩与max相等的学生的记录,存入结构体b中*/return j; /*返回最高成绩的学生人数*/} 第五题 一、题目要求 #in假定输入的字符串中只包含字母和*号。 请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其他*号全部删除。在编写函数时,不得使用c语言提供的字符串函数。例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是****ABCDEFG。 #include printf(“enter astring:n”);gets(s);fun(s); printf(“the string after deleted:n”);puts(s);} 二、做题分析 1、首先判断*p前几个字符中中是否含有*,记录*截止的位置,然后再判断字符数组中其他的英文字符。故函数程序如下 Int i=0; char *p=a; while(*p&&*p==’*’){a[i]=*p;i++;p++;} while(*p){if(*p!=’*’){a[i]=*p;i++;} p++;} 第六题 一、题目要求(18) 请编写一个函数void fun(char *tt,int pp[]),统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。例如,当输入字符串abcdefgabcdeabc后,程序的输出结果应该是:3 3 3 2 2 1 1 0 0O 0 0 O O 0 0 0 0 0 0 0 0 0 0 0 O #include void fun(char *tt, int pp[]){} main() {char aa[1000];intbb[26], k, n;clrscr(); printf(“nPlease entera char string:”);scanf(“%s”, aa);fun(aa, bb); for(k = 0;k < 26;k++)printf(“%d ”, bb[k]); printf(“n”);} 一、做题分析 本题考查:for循环语句,注意循环变量取值范围以及循环体语句作用。数组元素初始化和赋值操作。if语句条件表达式,需注意条件表达式的逻辑运算。字符串结束标识 要求统计在tt所指字符串中'a'到'z'26个小写字母各自出现的次数,并依次放在pp所指数组中。首先for循环语句体中初始化pp数组中分别用来统计26个字母的个数。再使用循环判断语句对tt所指字符串中的字符进行逐一比较操作,同时存入相对应的pp数组中。故程序如下 void fun(char *tt, int pp[]){ int i; for(i=0;i<26;i++)pp[i]=0; for(;*tt!=' ';tt++) if(*tt>='a'&&*tt<='z')pp[*tt-'a']++;} 目 录 Linux 第一次上机(运行环境RedHat)................................................................................1 调试运行CD唱片应用程序.......................................................................................1 运行过程............................................................................................................1 心得体会............................................................................................................3 编写shell脚本,求1到100的和..............................................................................3 运行过程............................................................................................................3 源代码...............................................................................................................4 编写shell脚本,从键盘输入两个数,求这两个数的和.................................................4 运行过程............................................................................................................4 源代码...............................................................................................................5 等待特定用户登录,每30秒确认一次.......................................................................5 运行过程............................................................................................................5 源代码...............................................................................................................6 找出系统中当前消耗磁盘容量最大的前10个用户,并向他们发送警告邮件...............6 运行过程............................................................................................................6 源代码...............................................................................................................8 查找输入文件的路径.................................................................................................8 运行过程............................................................................................................8 源代码...............................................................................................................9 Linux 第二次上机(运行环境RedHat)................................................................................9 定制自己的ls命令。提供至少三种带参数的执行方式................................................9 运行过程............................................................................................................9 源代码..............................................................................................................11 调试编译串行口通信程序p6.5.c...............................................................................16 运行过程..........................................................................................................16 Linux 第三次上机(运行环境RedHat,CentOS)...............................................................16 创建一个系统监听守护进程,一旦接收到其他进程发来的信号,马上给出报告........16 运行过程..........................................................................................................16 源代码.............................................................................................................18 分别利用本地socket套接字和INTENET套接字实现进程间文件传输......................20 本地socket套接字运行过程.............................................................................20 本地socket套接字服务器server1.c源代码........................................................22 本地socket套接字客户端client1.c源代码.........................................................23 INTENET套接字运行过程...............................................................................25 INTENET套接字服务器server2.c源代码..........................................................28 INTENET套接字客户端client2.c源代码...........................................................29 感谢与收获....................................................................................................................30 Linux 第一次上机(运行环境RedHat)调试运行CD唱片应用程序 运行过程 图表 1第一步,使用./CD 命令运行CD脚本 图表 2进入选项界面 图表 3增加CD 图表 4查找CD 图表 5查询数目 图表 6退出 心得体会 通过运行书上的CD唱片应用程序,进一步地了解到shell编程的方法,以及编写程序的思路。 编写shell脚本,求1到100的和 运行过程 图表 7使用./sum1to100运行 源代码 图表 8使用cat sum1to100查看源代码 编写shell脚本,从键盘输入两个数,求这两个数的和 运行过程 图表 9使用./sumAandB 运行 源代码 图表 10使用cat sumAandB查看源代码 等待特定用户登录,每30秒确认一次 运行过程 已知特定用户是zzx,我首先让root用户登录并运行程序,可以发现每隔30s提醒一次 图表 11使用./checkuser运行 当我切换到zzx用户,并再次运行程序,可得如下结果 源代码 图表 12使用cat checkuser查看代码 找出系统中当前消耗磁盘容量最大的前10个用户,并向他们发送警告邮件 运行过程 由于权限等问题,我们使用root用户运行程序 图表 13使用./mymail运行 运行完毕后,我们就可以查看邮件了 图表 14 root用户收到的邮件 图表 15 zzx用户收到的邮件 图表 16 t1用户收到的邮件 源代码 图表 17 使用cat命令查看 查找输入文件的路径 运行过程 由于权限的问题,我们使用root用户运行程序 图表 18 使用./route运行,并按照要求输入文件名 源代码 图表 19 使用cat route查看源代码 Linux 第二次上机(运行环境RedHat)定制自己的ls命令。提供至少三种带参数的执行方式 运行过程 图表 20 使用./ls 运行不带参数ls 图表 21使用./ls-l 运行带参数-l 的ls 图表 22 使用./ls-a运行带参数-a的ls 图表 23使用./ls-al 运行带参数-al的ls 源代码 #include #include int do_ls(char *dir,char *filename,int lflag){ int n;struct stat buf;char out[100];struct passwd *pw; struct group *gr;struct tm *t;if(lflag == 0){ } { } return 0; printf(“%st”,filename);if(lstat(dir,&buf)<0)fprintf(stderr,“stat error:%sn”,strerror(errno));return-1;switch(buf.st_mode & S_IFMT){ case S_IFREG: printf(“-”);break;case S_IFDIR: printf(“d”);break;case S_IFCHR: printf(“c”);break;case S_IFBLK: printf(“b”);break;case S_IFIFO: printf(“p”);break;case S_IFLNK: printf(“l”);break; case S_IFSOCK: printf(“s”);} for(n=8;n>=0;n--){ if(buf.st_mode&(1< break; } } else { } { case 2: printf(“r”);break;case 1: printf(“w”);break;case 0: printf(“x”);break;default: break;} printf(“-”);printf(“ %d”,buf.st_nlink); pw = getpwuid(buf.st_uid);printf(“ %s”,pw->pw_name);gr = getgrgid(buf.st_gid);printf(“ %s”,gr->gr_name);printf(“ %ld”,buf.st_size);t = localtime(&buf.st_atime);printf(“ %d-%d-%d %d:%d” ,t->tm_year+1900 ,t->tm_mon+1 ,t->tm_mday ,t->tm_hour ,t->tm_min); printf(“ %s ”,filename); if(S_ISLNK(buf.st_mode)){ printf(“-> ”);if(readlink(filename,out,100)==-1){ } //printf(“readlink errorn”); } printf(“%s”,out);} printf(“n”);return 0;int ls_prepare(char *w,int aflag,int lflag){ struct stat buf;char name[100];DIR *dir; struct dirent *pdr;if(lstat(w,&buf)<0){ fprintf(stderr,“stat error:%sn”,strerror(errno));return-1;} if(S_ISDIR(buf.st_mode)){ dir = opendir(w);{ } closedir(dir); while((pdr = readdir(dir))!=NULL)if(aflag==0){ if(pdr->d_name[0]=='.') continue;memset(name,0,100); strcpy(name,w); strcat(name,“/”); strcat(name,pdr->d_name);do_ls(name,pdr->d_name,lflag);}else { } memset(name,0,100);strcpy(name,w);strcat(name,“/”);strcat(name,pdr->d_name);do_ls(name,pdr->d_name,lflag);}else { do_ls(w,w,lflag); } { } } return 0;int main(int argc,char **argv)int aflag =0;int lflag =0;char c;int i;while((c = getopt(argc,argv,“al”))!=-1){ } switch(c){ case 'a': aflag =1;break;case 'l': lflag =1;break;default: break;} if(argc == optind){ ls_prepare(“./”,aflag,lflag);} else { } for(i=optind;i 调试编译串行口通信程序p6.5.c 运行过程 由于权限问题,我们在root用户下运行程序 图表 24 使用./mytrunk不带参数运行 图表 25使用./mytrunk /dev/ttyS0 0带参数运行 Linux 第三次上机(运行环境RedHat,CentOS)创建一个系统监听守护进程,一旦接收到其他进程发来的信号,马上给出报告 运行过程 图表 26首先运行守护进程之后查看 当前进程 图表 27可以发现守护进程-jincheng在后台运行,且 PPID=1,PID=4085 图表 28可以发现守护进程向test.txt发送了start 图表 29向守护进程发送终止信号,终止守护进程 图表 30可以发现后台运行的守护进程没了 图表 31可以发现守护进程又向test.txt发送了end 图表 32具体查看test.txt 图表 33具体查看test.txt的内容 源代码 #include if(sig==SIGTERM){ write(fd1,“endn”,5);exit(0);} } int daemon(int nochdir, int noclose){ pid_t pid; pid = fork(); /* In case of fork is error.*/ if(pid < 0) { perror(“fork”); return-1; } /* In case of this is parent process.*/ if(pid!= 0) exit(0); /* Become session leader and get pid.*/ pid = setsid(); if(pid <-1) { perror(“setsid”); return-1; } /* Change directory to root.*/ if(!nochdir) chdir(“/”); /* File descriptor close.*/ if(!noclose) { int fd; fd = open(“/dev/null”, O_RDWR, 0); if(fd!=-1) { dup2(fd, STDIN_FILENO); } dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); if(fd > 2) close(fd); } umask(0027); return 0; } int main(void){ fd1=open(“test.txt”,O_RDWR | O_TRUNC); } write(fd1,“startn”,7);daemon(0,0);signal(SIGTERM,sigintHandler);sleep(1000);return 0; 分别利用本地socket套接字和INTENET套接字实现进程间文件传输 本地socket套接字运行过程 图表 34使用./server1运行服务器,显示服务器等待状态 图表 35当在另外一个终端运行客户端程序时,服务器显示客户连接,并要求输入传输文件名称 图表 36当服务器输入文件名称server1.c后客户端显示接收信息,不过接收到的文件重定向到 test.txt中 图表 37 server1.c的内容 图表 38 客户端接收到显示在test.txt的内容,和server1.c的内容比较,完全一致 本地socket套接字服务器server1.c源代码 #include int filefd,n;//////////////// char file[100],buf[1024];//////////////// int server_sockfd,client_sockfd; int server_len,client_len; struct sockaddr_un server_address; struct sockaddr_un client_address; unlink(“server_socket”); server_sockfd =socket(AF_UNIX,SOCK_STREAM,0); server_address.sun_family =AF_UNIX; strcpy(server_address.sun_path,“server_socket”); server_len =sizeof(server_address); bind(server_sockfd,(struct sockaddr *)&server_address,server_len); listen(server_sockfd,5); while(1) { printf(“server waitingn”); client_len =sizeof(client_address); client_sockfd=accept(server_sockfd,(struct *)&client_address,&client_len); if(client_sockfd!=-1) { printf(“you have a client ,please put the filename to transport!n”); scanf(“%s”,file); if((filefd=open(file,O_RDWR))<0) { perror(“can't find the file”); exit(1); } printf(“filefd= %dn”,filefd); printf(“the file is transported ,please wait...n”); lseek(filefd,0L,0);//每次接受客户机连接,应将用于读的源文件指针移到文件头 write(client_sockfd,file,sizeof(file));//传送文件名 if((n=read(filefd,buf,sizeof(buf)))>0) { } write(client_sockfd,buf,n); sockaddr printf(“you have transport %d bytes and it is end!n”,n); close(client_sockfd); } close(filefd); } } 本地socket套接字客户端client1.c源代码 #include #include int filefd,n,oldfilefd;///////////////// char file[100],buf[1024]; int sockfd; int len; struct sockaddr_un address; int result; sockfd =socket(AF_UNIX, SOCK_STREAM,0); address.sun_family =AF_UNIX; strcpy(address.sun_path,“server_socket”); len=sizeof(address); result=connect(sockfd,(struct sockaddr *)&address,len); if(result ==-1) { perror(“oops:client1”); exit(1); } if(result!=-1) { oldfilefd=open(“test.txt”,O_RDWR); filefd=dup(oldfilefd); read(sockfd,file,sizeof(file)); printf(“the filename you receive is:%sn”,file); if((n=read(sockfd,buf,sizeof(buf)))>0) { write(filefd,buf,n); } printf(“you have received a file which is %d bytes,but the file's context cover the test.txt,so please check into test.txt!n”,n); close(sockfd); } close(filefd); exit(0);} INTENET套接字运行过程 图表 39使用./server2运行服务器,显示服务器等待状态 图表 40当在另外一个终端运行客户端程序时,服务器显示客户连接,并要求输入传输文件名称 图表 41当服务器输入文件名称server2.c后客户端显示接收信息,不过接收到的文件重定向到 test.txt中 图表 42 server2.c的内容 图表 43客户端接收到显示在test.txt的内容,和server2.c的内容比较,完全一致 INTENET套接字服务器server2.c源代码 #include int main(){ int filefd,n;//////////////// char file[100],buf[4096];/////////////////// int server_sockfd,client_sockfd; int server_len,client_len;struct sockaddr_in server_address;struct sockaddr_in client_address;server_sockfd =socket(AF_INET,SOCK_STREAM,0);server_address.sin_family=AF_INET;server_address.sin_addr.s_addr=inet_addr(“127.0.0.1”);server_address.sin_port =9734;server_len=sizeof(server_address);bind(server_sockfd,(struct sockaddr *)&server_address,server_len);listen(server_sockfd,5);while(1) { printf(“server waitingn”); client_len =sizeof(client_address); client_sockfd=accept(server_sockfd,(struct *)&client_address,&client_len); if(client_sockfd!=-1) { printf(“you have a client ,please put the filename to transport!n”);scanf(“%s”,file); if((filefd=open(file,O_RDWR))<0){ sockaddr perror(“can't find the file”); exit(1); } printf(“filefd= %dn”,filefd); printf(“the file is transported ,please wait...n”); lseek(filefd,0L,0);//每次接受客户机连接,应将用于读的源>文件指针移到文件头 write(client_sockfd,file,sizeof(file));//传送文件名 if((n=read(filefd,buf,sizeof(buf)))>0) { write(client_sockfd,buf,n); } printf(“you have transport %d bytes and it is end!n”,n); close(client_sockfd); } close(filefd); } } INTENET套接字客户端client2.c源代码 #include int main(){ int filefd,n,oldfilefd;//////////////////// char file[100],buf[4096];int sockfd;int len;struct sockaddr_in address;int result;sockfd =socket(AF_INET,SOCK_STREAM,0);address.sin_family =AF_INET;address.sin_addr.s_addr =inet_addr(“127.0.0.1”);address.sin_port =9734;len =sizeof(address); result=connect(sockfd,(struct sockaddr *)&address,len); if(result ==-1) { perror(“oops:client2”); exit(1); } if(result!=-1){ oldfilefd=open(“test.txt”,O_RDWR); filefd=dup(oldfilefd); read(sockfd,file,sizeof(file)); printf(“the filename you receive is:%sn”,file); if((n=read(sockfd,buf,sizeof(buf)))>0) { write(filefd,buf,n); } printf(“you have received a file which is %d bytes,but the file's context cover the test.txt,so please check into test.txt!n”,n); close(sockfd);} close(filefd); exit(0);} 感谢与收获 通过这几次上机实习,使我更加扎实的掌握了有关Linux C编程方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过编程,使我们掌握的知识不再是纸上谈兵。 过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! 实践课诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。 我认为,在这学期的课程设计中,不仅培养了独立思考、动手操作的能力,在各种 其它能力上也都有了提高。更重要的是,在课程设计上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。 回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。第二篇:c语言上机实习报告
第三篇:c语言上机实习填空题
第四篇:c语言上机实习编程题
第五篇:linux上机实习报告