第一篇:GPS模拟C语言
GPS模拟
# include
using namespace std;
ifstream fin(“1.txt”);//ofstream fout(“data_out.txt”);
// 1 double x[5] = {-1, 0, 300, 0, 300};double y[5] = {-1, 450, 450, 0, 0};double t[5];double A, B, D,c = 2982000, p, r;double pi = 3.141592653;double xx, yy;
//三角形算法
void cal(int sign, double t1, double t2, double x1, double y1, double x2, double y2, double px, double py){
double tt1 = c * t1, tt2 = c * t2;
double q, ac;
A = x2 *(x1*x1 + y1*y1x1 *(x2*x2 + y2*y2tt1*tt1)tt2*tt2);
D = tt1 *(x2*x2 + y2*y2tt2 *(x1*x1 + y1*y1ac;
r =(x1*x1 + y1*y10)< 1e-6)
{
switch(h)
{
case 1:
cal(-1, t[2], t[4], 300, 0, 300,-450, 0, 450);
break;
case 2: cal(-1, t[1], t[3],-300, 0,-300,-450,300, 450);
break;
case 3: cal(1, t[1], t[2], 0, 450, 300, 450, 0, 0);
break;
case 4: cal(1, t[1], t[2],-300, 450, 0, 450, 300, 0);
break;
}
break;
} } system(“pause”);return 0;声源定位
#include
double ti[10][3];double det(double a[Max][Max],int n)
{ int i,j,start;double k,temp,result=1;for(start=0;start<=n-2;start++){
i=1;
while(a[start][start]==0&&start+i<=n-1)
{
for(j=start;j<=n-1;j++)
{
temp=-1*a[start][j];
a[start][j]=a[start+i][j];
a[start+i][j]=temp;
}
i++;
}
if(start+i==n)continue;
for(i=start+1;i<=n-1;i++)
{
k=a[i][start]/a[start][start];
for(j=start;j<=n-1;j++)
a[i][j]=a[i][j]-k*a[start][j];
} } for(i=0;i<=n-1;i++)
result*=a[i][i];return result;} int equalation(double a[Max][Max+1],double r[Max],int n)
{ double det(double a[Max][Max],int n);double det0[Max][Max],det1[Max][Max];int i,j,k;
for(i=0;i<=n-1;i++)
for(j=0;j<=n-1;j++)
det0[i][j]=a[i][j];if(det(det0,n)==0)return 0;
for(k=0;k<=n-1;k++){
for(i=0;i<=n-1;i++)
for(j=0;j<=n-1;j++)
{
det0[i][j]=a[i][j];
det1[i][j]=a[i][j];
}
for(i=0;i<=n-1;i++)
det1[i][k]=a[i][n];
r[k]=det(det1,n)/det(det0,n);} return 1;} double sqr(double x){ return x*x;} double g(double x,double y,double c,double xi,double yi,double ti){ return sqr(xi-x)+sqr(yi-y)-sqr(c*ti);} double fx(double x,double y,double c,int k)
{ int i;double sum=0;for(i=0;i<=N-1;i++)
sum+=g(x,y,c,xi[i],yi[i],ti[i][k-1])*(xi[i]-x);return sum;} double fy(double x,double y,double c,int k)
{ int i;double sum=0;for(i=0;i<=N-1;i++)
sum+=g(x,y,c,xi[i],yi[i],ti[i][k-1])*(yi[i]-y);return sum;} double fc(double x,double y,double c,int k)
{ int i;double sum=0;for(i=0;i<=N-1;i++)
sum+=g(x,y,c,xi[i],yi[i],ti[i][k-1])*sqr(ti[i][k-1]);return sum;} double fxx(double x,double y,double c,int k)
{ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*sqr(xi[i]-x)-g(x,y,c,xi[i],yi[i],ti[i][k-1]);return sum;} double fxy(double x,double y,double c,int k){ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*(yi[i]-y)*(xi[i]-x);return sum;} double fxc(double x,double y,double c,int k){ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*c*sqr(ti[i][k-1])*(xi[i]-x);return sum;} double fyx(double x,double y,double c,int k){ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*(xi[i]-x)*(yi[i]-y);return sum;} double fyy(double x,double y,double c,int k)
{ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*sqr(yi[i]-y)-g(x,y,c,xi[i],yi[i],ti[i][k-1]);return sum;} double fyc(double x,double y,double c,int k){ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*c*sqr(ti[i][k-1])*(yi[i]-y);return sum;} double fcx(double x,double y,double c,int k){ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*(xi[i]-x)*sqr(ti[i][k-1]);return sum;} double fcy(double x,double y,double c,int k){ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*(yi[i]-y)*sqr(ti[i][k-1]);return sum;} double fcc(double x,double y,double c,int k){ int i;double sum=0;for(i=0;i<=N-1;i++)
sum=sum-2*c*sqr(sqr(ti[i][k-1]));return sum;} int main(){ int i=0,k;double x,y,c,x0,y0,c0;double a[Max][Max+1],r[Max];freopen(“1.txt”, “r”, stdin);freopen(“1_out.txt”, “w”, stdout);
for(i=0;i<=9;i++){
} cin>>xi[i]>>yi[i];xi[i] /= 10;yi[i] /= 10;
cin>>ti[i][0]>>ti[i][1]>>ti[i][2];for(k=1;k<=3;k++){ cin>>x>>y;
c=0.2;do {
x0=x;y0=y;c0=c;i++;
a[0][0]=fxx(x,y,c,k);a[0][1]=fxy(x,y,c,k);a[0][2]=fxc(x,y,c,k);a[1][0]=fyx(x,y,c,k);a[1][1]=fyy(x,y,c,k);a[1][2]=fyc(x,y,c,k);a[2][0]=fcx(x,y,c,k);a[2][1]=fcy(x,y,c,k);a[2][2]=fcc(x,y,c,k);a[0][3]=x*a[0][0]+y*a[0][1]+c*a[0][2]-fx(x,y,c,k);a[1][3]=x*a[1][0]+y*a[1][1]+c*a[1][2]-fy(x,y,c,k);a[2][3]=x*a[2][0]+y*a[2][1]+c*a[2][2]-fc(x,y,c,k);
if(equalation(a,r,3)==0){
cout<<“第”< return 0; } x=r[0];y=r[1];c=r[2];} while(abs(x-x0)+abs(y-y0)+abs(c-c0)>=1e-6);cout<<“第”< <<“x=”< <<“y=”< <<“参考波速为:c=”< 一、实验目的 通过设计一个ATM机模拟操作的程序,全面运用课程的主要知识点,巩固对模块化程序设计、文件操作的理解,提高软件编程能力。 二、实验要求 要求每人独立完成设计,编写一个ATM机模拟操作程序。提交实验报告、源程序、程序运行截图。 1.程序具有以下功能: 1)登录系统: 输入卡号(16位)、密码(6位),只有卡号、密码同时正确(帐户信息存放在文件中)才能进入系统; 2)操作功能: 查询:查询帐户的存款余额。按任意键返回主菜单; 修改密码:连续输入两次新密码(两次输入结果完全相同)后,新密码取代旧密码,并存放到帐户信息文件中。之后可返回主菜单; 取款:输入50或100的倍数模拟为取款金额,请注意:取款金额不得超过帐户余额,操作后帐户余额应相应减少。之后可返回主菜单; 存款:输入50或100的倍数模拟为存款金额,现假设存款金额不得超过20000元,操作后帐户余额应相应增加。之后可返回主菜单; 转帐:先输入一个帐户号(已保存在帐户信息文件中),然后显示一部分用户名(如:张*山),储户确认无误后,再输入50或100的倍数模拟为转帐金额,请注意:转帐金额不得超过帐户余额,操作后帐户余额应相应减少。之后可返回主菜单; 退出:退出系统。 2.定义如下结构体类型: “日期”结构体Date:成员有:year(年)、month(月)、day(日); “帐户”结构体Account:成员有:no(帐户号)、name(姓名)、balance(余额) “存取款记录”结构体Record,:成员有:no(帐户号)、date(日期)、number(数量,可正可负,正表示存款,负表示取款)3.帐户信息存放在accounts.txt文件,储户存取款记录保存在records.txt中; 4.采用模块化程序设计方法来实现,即main()显示主菜单、调用相关函数实现相应功能,起主控作用。5.附加功能: 储户一天内输错密码的次数不能超过3次,否则无法进入系统; 应避免输入存款金额、取款金额为负数等异常情况的出现。 三、程序已经实现的功能点 实验要求均已实现。此外还有: 1.卡号、密码位数输错时,提示并返回重新输入,2.简化取款时的输入 3.转账时,转账账户为原账户时,提示并返回重新输入 4.在多个模块中添加了退出功能,无需回到主菜单即可退出系统 5.在查询模块中加入了存取记录明细查询 四、程序运行截图及说明 1.登陆模块 1)卡号不为16位时,输出提示并返回重新输入 2)卡号不存在时,输出提示并返回重新输入 3)密码位数输错时,输出提示并返回重新输入密码,不作为密码错误处理,也无需重新输入卡号 4)密码连续输错三次时,锁定卡号,今日无法登录 2.登录后的系统主菜单 3.查询模块 1)查询模块主菜单 2)查询明细 4.取款模块 1)当余额不足50时,无法进入取款模块 2)取款模块主菜单 3)便捷取款 4)手动输入取款金额 输错时,返回重新输入 5)取款后的菜单 6)取款完成后选择显示余额 5.存款模块 1)解决输入错误问题 2)存款成功 6.密码修改模块 1)原密码输错时,返回重新输入,不提供退出功能 2)密码位数输错、两次输入新密码不一致时,返回重新输入 3)输入无误时 7.转账模块 1)转入卡号位数输错时,提示并返回重新输入 2)未查找到该卡号时,输出提示,提供退出功能,键入除*外任意键重新输入 3)转入卡号与当前卡号相同时,输出提示 4)输出转入卡账户的部分用户名 5)解决转账金额输错的问题 6)转账成功 五、采用的主要技术 1.宏定义:由于本程序的printf语句较多,为了便于编写,故用PR代替 2.链表:账户信息采用链表结构,内存动态分配,使用内存无限制,可以扩展到所有可以使用的内存 3.switch多分支选择结构 4.文本文件的读写 5.利用time.h头文件,简便地获取系统日期 6.system()函数和fflush()函数的简单使用 六、设计心得 1.各函数的功能要相对独立,逐步求精。 2.如果函数的参数为指针,且仅作为输入参数,则应在类型前加const,以防止该指针在函数体内被意外修改 附:程序代码 /*** * 运行本程序前,请在本程序根目录下建立文件“accounts.txt”,格式如下: * 卡号1(16位) 姓名1 账户余额1 密码1 * 卡号2(16位) 姓名2 账户余额2 密码2 * …… ****/ #include typedef struct { short int year;short int month;short int day;}Date;//日期 typedef struct Account { char no[17];char name[20];double balance;char password[7];struct Account* next;}Account; typedef struct { char no[17];Date date;double number;}Record;//记录 Account *head = NULL;//账户信息链表表头 Account *now_acc = NULL;//当前账户 /************函数申明************/ void InitializeAccount();//导入账户信息 //-------char LockAccountTopic(const char *no);//检测账户是否被锁定 void LockAccount(const char *no);//锁定账户 //-------void Login();//登录 Account* FindbyNo(const char *no);//查找卡号对应账户信息在链表中的地址 //-------void Demand();//查询主菜单 void PrintBalance();//输出余额 void Printetail();//输出明细 //-------void Modifiy();//修改密码 //-------void Withdrawal();//取款主界面 void WithdrawalOt(long money);//取款 //-------void Depositing();//存款 //-------void Transfer();//转账 char *CoverUpName(const char *name);//掩盖部分用户名 //-------void Log(double money, const char *no);//将存款记录写入文件中 void Save();//保存账号信息 void FreeData();//释放链表空间 //------- int main(){ char choose; InitializeAccount();//导入账户信息 Login();//登录 do { system(“cls”);PR(“tt n”);PR(“tt 请选择服务 n”);PR(“tt+-+---------+ +---------+-+n”);PR(“tt|5|33转账| |查询32|1|n”);PR(“tt+-+---------+ +---------+-+nn”);PR(“tt +---------+-+n”); PR(“tt |取款32|2|n”);PR(“tt +---------+-+nn”);PR(“tt +---------+-+n”);PR(“tt |存款32|3|n”);PR(“tt +---------+-+nn”);PR(“tt+-+---------+ +---------+-+n”);PR(“tt|0|33退出系统| |修改密码32|4|n”);PR(“tt+-+---------+ +---------+-+nn”);PR(“请选择服务:”);fflush(stdin);choose = getchar();switch(choose){ case '1': Demand();break;//查询 case '2': Withdrawal();break;//取款 case '3': Depositing();break;//存款 case '4': Modifiy();break;//修改密码 case '5': Transfer();break;//转账 case '0': FreeData();return 0;//退出 default: printf(“输入错误,请重新选择n”);//解决用户可能的输入错误 system(“pause”); } } while(1);return 0;} /**********导入账户信息**********/ void InitializeAccount(){ FILE *fp;Account temp;PR(“系统初始化中,请稍侯...n”);if(!(fp = fopen(“accounts.txt”, “r”))){ PR(“ 7”);//响铃 PR(“读取帐户信息失败,请在本程序根目录建立帐户信息文件(accounts.txt)。格式如下:n”); PR(“卡号1(16位) 姓名1 账户余额1 密码1n”); PR(“卡号2(16位) 姓名2 账户余额2 密码2n”); PR(“……n”); exit(0);} while(fscanf(fp, “%s %s %lf %s”, temp.no, temp.name, &temp.balance, temp.password)== 4) } {//读入账户信息 Account *t = head;head =(Account*)malloc(sizeof(Account));*head = temp;head->next = t;} fclose(fp);system(“cls”);//清除“系统初始化中,请稍侯...”提示 /**********登录**********/ void Login(){ do { char no[17]; system(“cls”); PR(“nnnnttt请输入16位卡号:”); fflush(stdin); gets(no);if(strlen(no)!= 16){ PR(“卡号应为16位n”);system(“pause”);system(“cls”);continue;} if(LockAccountTopic(no)) {//当该卡号被锁定时 PR(“ 7”);//响铃 PR(“nn您的登陆密码今日连续输错三次,已被临时锁定,次日将自动解锁,或当日持本人有效证件到柜台办理密码重置。nn”); system(“pause”); continue; } if(!(now_acc = FindbyNo(no)))//将卡号对应信息在链表的地址赋给now_acc {//当卡号不存在时 PR(“nn此卡号不存在,请重新输入!nn”);system(“pause”);continue;} char a = '2';//计算剩余可输错密码次数 do { char password[7];system(“cls”); PR(“nnnnttt请输入16位卡号:%sn”, now_acc->no); PR(“nnttt请输入6位密码:”); fflush(stdin); scanf(“%s”, password); if(strlen(password)!= 6) { PR(“密码应为6位n”); system(“pause”); system(“cls”); continue; } if(!strcmp(now_acc->password, password)) return;//密码正确,回到主函数 if(a == '0') {//输错密码三次,锁定账户 PR(“nn您的登陆密码今日连续输错三次,已被临时锁定,次日将自动解锁,或当日持本人有效证件到柜台办理密码重置。nn”); } LockAccount(no); break; } PR(“ 7”);//响铃 PR(“密码输入错误,您还可以尝试%c次nn”, a--); system(“pause”);} while(1);} while(1);/**********检测账户是否被锁定**********/ char LockAccountTopic(const char *no)//被锁定则返回0 { FILE *fp; char CruuentTime[11];//当前日期 char ArchiveTime[11];//锁卡档案日期 char t[17];if(!(fp = fopen(“LockAccount.txt”, “a+”)))//课本上讲以“a”方式打开文件,若文件不存在,会出错。VS2013实测,并不会出错,而是新建。为免第一次使用本程序时,根目录下没有LockAccount.txt而导致出错,故此处不采用“r”方式。 { PR(“ 7”);//响铃 PR(“LockAccount.txt无法打开nn”); exit(0);} rewind(fp);{//获取当前日期 time_t rawtime; struct tm * timeinfo; time(&rawtime);//获取时间,以秒计,从1970年1月一日起算,存于rawtime timeinfo = localtime(&rawtime);//转为当地时间,tm 时间结构 strftime(CruuentTime, 11, “%Y-%m-%d”, timeinfo);//格式化时间 } fgets(ArchiveTime, 11, fp);//获取锁卡档案时间 if(strcmp(ArchiveTime, CruuentTime)) {//若无锁卡档案,或锁卡档案日期与当前日期不同,则无账户被锁定 fclose(fp);return 0;} while(fscanf(fp, “%s”, t)== 1){ if(!strcmp(t, no)){//锁卡档案中,包含此卡号,返回1 fclose(fp); return 1;} } fclose(fp);return 0;//锁卡档案中,不含此卡号,返回0 } /**********查找卡号对应账户信息在链表中的地址**********/ Account* FindbyNo(const char *no){ for(Account *i = head;i;i = i->next){ if(!strcmp(i->no, no)) return i;} return NULL;} /**********锁定账户**********/ void LockAccount(const char *no){ FILE *fp; char CruuentTime[11];//当前日期 char ArchiveTime[11];//锁卡档案日期 if(!(fp = fopen(“LockAccount.txt”, “r”))){ PR(“ 7”);//响铃 PR(“error on open LockAccount.txt file!nn”);exit(0);} {//获取当前日期 time_t rawtime;struct tm * timeinfo;time(&rawtime);//获取时间,以秒计,从1970年1月1日起算,存于rawtime timeinfo = localtime(&rawtime);//转为当地时间,tm 时间结构 strftime(CruuentTime, 11, “%Y-%m-%d”, timeinfo);//格式化时间 } fgets(ArchiveTime, 11, fp);fclose(fp);if(strcmp(ArchiveTime, CruuentTime)){//若档案日期与当前日期不同,则说明档案已过期或无档案,新建记录。 if(!(fp = fopen(“LockAccount.txt”, “w”))){ PR(“ 7”);//响铃 } } PR(“error on open LockAccount.txt file!nn”);exit(0);} fprintf(fp, “%sn”, CruuentTime);else//若记录日期与当前日期相同,则追加记录 { if(!(fp = fopen(“LockAccount.txt”, “a”))){ } } PR(“ 7”);//响铃 PR(“error on open LockAccount.txt file!nn”);exit(0);//添加记录 fprintf(fp, “%sn”, no);fclose(fp);/**********查询函数主菜单**********/ void Demand(){ char choose;do { system(“cls”); PrintBalance(); PR(“ttttt +---------+-+n”); PR(“ttttt |查询明细32|1|n”); PR(“ttttt +---------+-+nn”); PR(“tt+-+---------+ +---------+-+n”); PR(“tt|0|33退出系统| | 返回 32|2|n”);PR(“tt+-+---------+ +---------+-+nn”);PR(“请选择服务:”);fflush(stdin);choose = getchar();switch(choose){ case '1': Printetail();break;//查询明细 case '2': return;//返回 case '0': FreeData();exit(0);//退出系统 default: printf(“输入错误,请重新选择n”);//解决用户可能的输入错误 } system(“pause”);} } while(1);/**********输出余额**********/ void PrintBalance(){ system(“cls”);PR(“nnnnnnnnntt+---------------+---------------+n”); } PR(“tt| 您的账户余额 32|%-15.2f|n”, now_acc->balance);PR(“tt+---------------+---------------+nnnnnnn”);/**********输出明细**********/ void Printetail(){ FILE *fp;Record temp;int flag = 1;//当有记录时,置0 if(!(fp = fopen(“records.txt”, “r”))){ PR(“无存取记录,请进行存取后再使用本功能nn”); system(“pause”); return;} system(“cls”);PR(“+---------+--------------+n”);PR(“| 日期 | 存取金额 |n”);PR(“+---------+--------------+n”);while(fscanf(fp, “%s%d-%d-%d%lf”, temp.no, &temp.date.year, &temp.date.month, &temp.date.day, &temp.number)== 5){ if(!(strcmp(temp.no, now_acc->no))) { flag = 0; PR(“|%d-%d-%d|%-14.2f|n”, temp.date.year, temp.date.month, temp.date.day, temp.number); PR(“+---------+--------------+n”); } } PR(“| 日期 | 存取金额 |n”);//未免记录太多看不到表头,在最后加个表头 PR(“+---------+--------------+n”);if(flag) } { system(“cls”);//无记录时,清除表头 PR(“该卡号未有任何存取记录nn”);system(“pause”);return;} system(“pause”);//当有存取记录时,输出后等待 /**********将存款记录写入文件中**********/ void Log(double money, const char *no){ FILE *fp;Date CruuentTime;//当前日期 if(!money)//存取为零时 return;if(!(fp = fopen(“records.txt”, “a”))){ PR(“ 7”);//响铃 PR(“error on open records.txt file!”); exit(0);} {//获取当前日期 time_t rawtime; struct tm * timeinfo; time(&rawtime);//获取时间,以秒计,从1970年1月1日起算,存于rawtime timeinfo = localtime(&rawtime);//转为当地时间,tm 时间结构 CruuentTime.year = timeinfo->tm_year + 1900, CruuentTime.month = timeinfo->tm_mon + 1, CruuentTime.day = timeinfo->tm_mday;} fprintf(fp, “%sn%d-%d-%dn%fn”, no, CruuentTime.year, CruuentTime.month, CruuentTime.day, money);fclose(fp);} /**********取款主界面**********/ void Withdrawal(){ char choose;if(now_acc->balance < 50.0){//当余额不足50时,无法取款 PR(“ 7”);//响铃 PR(“您的余额不足50,无法取款nn”); } do { system(“pause”);return;system(“cls”);PR(“nn”);PR(“tt+-+---------+ +---------+-+n”);PR(“tt|1|33 100 | | 2000 32|5|n”);PR(“tt+-+---------+ +---------+-+nn”);PR(“tt+-+---------+ +---------+-+n”);PR(“tt|2|33 500 | | 5000 32|6|n”);PR(“tt+-+---------+ +---------+-+nn”);PR(“tt+-+---------+ +---------+-+n”);PR(“tt|3|33 1000 | |其它金额32|7|n”);PR(“tt+-+---------+ +---------+-+nn”);PR(“tt+-+---------+ +---------+-+n”);PR(“tt|4|33退出系统| |返回32|0|n”);PR(“tt+-+---------+ +---------+-+nn”);PR(“请选择服务:”);fflush(stdin);scanf(“%c”, &choose);switch(choose){ case '1': WithdrawalOt(100);break;case '2': WithdrawalOt(500);break;case '3': WithdrawalOt(1000);break;case '4': FreeData();exit(0);case '5': WithdrawalOt(2000);break;case '6': WithdrawalOt(5000);break;case '7': do { long money; PR(“请输入取款金额(50的倍数):”); fflush(stdin); scanf(“%ld”, &money); if(money < 0 || money % 50) {//解决输入金额为负数、不是50的倍数的情况 PR(“输入有误,请重新输入n”); system(“pause”); continue; } WithdrawalOt(money); } break;} while(1);break;case '0': return;default: } PR(“ 7”);//响铃 printf(“输入错误,请重新选择n”);//解决用户可能的输入错误 system(“pause”);continue;{//取款完成后的菜单 char choose;system(“cls”);PR(“nn”);PR(“tt +---------+-+n”);PR(“tt |继续取款32|1|n”);PR(“tt +---------+-+nn”);PR(“tt +---------+-+n”);PR(“tt |显示余额32|2|n”);PR(“tt +---------+-+nn”);PR(“tt n”);PR(“tt n”);PR(“tt nn”);PR(“tt+-+---------+ +---------+-+n”); PR(“tt|0|33退出系统| |返回32|3|n”); PR(“tt+-+---------+ +---------+-+nn”); PR(“请选择服务:”); fflush(stdin); scanf(“%c”, &choose); switch(choose) { case '1': continue;//继续取款 case '2': PrintBalance();system(“pause”);break;//输出余额 case '3': return;//返回主函数 case '0': FreeData();exit(0);//退出系统 default: PR(“ 7”);//响铃 printf(“输入错误,请重新选择n”);//解决用户可能的输入错误 system(“pause”); } } } while(1);/**********取款**********/ void WithdrawalOt(long money){ if(now_acc->balance < money){ } PR(“ 7”);//响铃 PR(“您的余额不足%ldnn”, money);system(“pause”);return;PR(“正在处理,请稍候...n”);now_acc->balance-= money;Save();Log(-money, now_acc->no);PR(“取款成功nn”);system(“pause”);} /**********存款**********/ void Depositing(){ long money;do { } PR(“请输入存款金额(50的倍数),单次存款金额不得超过20000元:”);fflush(stdin);scanf(“%ld”, &money);if(money < 0 || money > 20000 || money % 50){//解决输入金额为负数、超过20000、不是50的倍数的情况 PR(“ 7”);//响铃 PR(“输入有误,请重新输入n”); system(“pause”); continue;} PR(“正在处理,请稍候...n”);now_acc->balance += money;Save();//保存账户数据 Log(money, now_acc->no);//保存存取数据 PR(“存款成功nn”);system(“pause”);break;} while(1);/**********保存账户信息**********/ void Save(){ FILE *fp;int i = 1;char ch;if(!(fp = fopen(“accounts.txt”, “w”))){ } } PR(“ 7”);//响铃 PR(“读取帐户信息失败!accounts.txt无法打开n”);exit(0);for(Account *i = head;i;i = i->next)//写入账户信息 fprintf(fp, “%s %s %f %sn”, i->no, i->name, i->balance, i->password);fclose(fp);/**********修改密码**********/ void Modifiy(){ char oldpass[7], newpass1[7], newpass2[7];do { PR(“请输入原密码:”); fflush(stdin); gets(oldpass); if(strlen(oldpass)!= 6) { PR(“密码应为6位n”); system(“pause”); continue; } if(strcmp(oldpass, now_acc->password)) {//解决密码输入有误,出于安全性的考虑,原密码输入错误时不提供返回功能 PR(“密码有误,请重新输入nn”); system(“pause”); continue; } else break;} while(1);do { PR(“请输入六位新密码:”); fflush(stdin);scanf(“%s”, newpass1);if(strlen(newpass1)!= 6){ } PR(“密码应为6位n”);system(“pause”);continue;PR(“请再次输入新密码:”);fflush(stdin);scanf(“%s”, newpass2);if(strcmp(newpass1, newpass2)) {//两次输入密码不一致时 PR(“密码不一致(输入*取消修改)n”); fflush(stdin); if(getchar()== '*') break; } else {//输入一致时 strcpy(now_acc->password, newpass1);//修改密码 Save();//保存用户数据 PR(“密码修改成功!nn”); system(“pause”); break; } } while(1);} /**********转账**********/ void Transfer(){ Account* aimsite;//转入卡号在链表中的地址 long money;//转账金额 if(now_acc->balance < 50){//当账户余额不足50时 PR(“ 7”);//响铃 PR(“您的余额不足50,无法转账nn”);system(“pause”);return;} do { char aim[17];//转入卡号 PR(“请输入转入卡/折号(16位):”);fflush(stdin);gets(aim);if(strlen(aim)!= 16){ PR(“卡号应为16位n”);system(“pause”);continue;} if(!(strcmp(aim, now_acc->no))){//解决转账双方卡号相同的情况 PR(“双方账户相同,请核对后重试(输入*取消转账)n”);if(getchar()== '*') return;continue;} if(aimsite = FindbyNo(aim))break;//找到转入卡号对应信息时 else { PR(“未找到该卡号,输入*取消转账n”); if(getchar()== '*') return; continue;} } while(1);PR(“汇款目标用户名为:%sn”, CoverUpName(aimsite->name));PR(“是否确认无误?(输入*确认,否则退出)”);fflush(stdin);if(getchar()!= '*')return;do { PR(“请输入转账金额(50的倍数):”);fflush(stdin);scanf(“%lu”, &money);if(now_acc->balance < money){ PR(“ 7”);//响铃 PR(“您的余额不足%lu,请重新输入转账金额nn”, money); system(“pause”); continue;} if(money % 50) } {//当输入金额不是50的倍数时 PR(“ 7”);//响铃 PR(“输入有误,请重新输入n”);continue;} PR(“转账中,请稍候...n”);now_acc->balance-= money;aimsite->balance += money;Save();//保存账户数据 Log(-money, now_acc->no);//当前账户存取记录 Log(money, aimsite->no);//转入卡存取记录 PR(“转账成功nn”);system(“pause”);break;} while(1);/**********掩盖部分用户名**********/ char *CoverUpName(const char *name){ char temp[20];strcpy(temp, name); int words = 0;//用于存放姓名的字数 for(char* i = temp;*i;i += 2)words++;//计算姓名的字数 switch(words){ case 2: temp[0] = '*', temp[1] = '*';//当姓名字数为2时,掩盖姓 strcpy(temp + 1, temp + 2);//消除一个*号 break;case 3: temp[2] = '*', temp[3] = '*';//当姓名字数为3时,掩盖名字中的第一个字 strcpy(temp + 3, temp + 4);//消除一个*号 break;default: temp[0] = '*', temp[1] = '*', temp[2] = '*', temp[3] = '*';//姓名字数大于3时,掩盖姓和名字中的第一个字 strcpy(temp + 2, temp + 4);//消除两个*号 } return temp;} /**********释放链表空间**********/ void FreeData(){ Account* t;while(head){ t = head; head = head->next; free(t);} } 单选题 下列关于单目运算符++、--的叙述中正确的是(D)。 A、它们的运算对象可以是int型变量,但不能是double型变量和float型变量 B、它们的运算对象可以是任何变量和常量 C、它们的运算对象可以是char型变量和int型变量,但不能是float型变量 D、它们的运算对象可以是char型变量、int型变量和float型变量 执行下列程序后,其输出结果是(D)。main(){int a=9;a+=a-=a+a;printf(“%dn”,a);} A、18 B、-9 C、9 D、-18 详解: 优先级:a+=(a-=(a+a))1a+a:18 ○2a-=18:此时a=-9;注意,a已经不是9,而是-9了 ○3a+=-9:即a=a+(-9)=(-9)+(-9)=-18 ○ 打印语句printf(“sTUDENDbTrS”);在屏幕上正确的输出形式是(C).A、sTUDENDS B、TUDENTS C、STUDENT D、sTUDENTS 详解: 知识点:b表示退格; r表示回车,即将当前位置一道“本行”开头 ○1sTUDEND ○2 sTUDENT ○3 STUDENT 已知键盘输入a=4,b=3,下面程序输出的结果是(C).main(){ int a,b,s;scanf(“%d%d”,&a,&b);s=a;if(a 若给定条件表达式(m)?(a++):(a--),则其中表达式m(B)。 A、和(m==0)等价 B、和(m!=0)等价 C、和(m==1)等价 D、和(m!=1)等价 注意: 此处不能选C,因为“非零的数即表示真”。如当m=2时,值为真,结果是a++;但是若选C,则结果为a--.执行语句 for(i=1;i++<4;);后变量 i 的值是(B)。 A、3 B、5 C、4 D、不定 以下描述中正确的是(C)。 A、由于 do-while 循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句 B、do-while 循环中,根据情况可以省略 while C、在 do-while 循环体中,必须有能使循环退出的操作。 D、do-while 循环由do开始,用while结束,在 while(表达式)后面不能写分号 int a[10];合法的数组元素的最小下标值为(D)。 A、10 B、9 C、1 D、0 题意是a[]的括号内最小数可以是多少,而不是说定义的时候int a[]的括号里最小的数是多少。注意看清题目意思。 以下正确的函数定义是(C).A、double fun(int x, int y){ z=x+y;return z;} B、fun(x, y){ int x, y;double z;z=x/y;return z;} C、float f(int x, int y){float z;z=x/y;return z;} D、fun(int x, y){ int z;return z;} char a1[]=“abc”,a2[80]=“1234”;将a1串连接到a2串后面的语句是(A)。 A、strcat(a2,a1);B、strcat(a1,a2);C、strcpy(a1,a2);D、strcpy(a2,a1); 若有 char s1[]=“abc”,s2[20],*t=s2;gets(t);则下列语句中能够实现当字符串s1大于字符串s2时,输出s2的语句是(C)。 A、if(strcmp(s2,s1)>0)puts(s2);B、if(strcmp(s2,t)>0)puts(s2);C、if(strcmp(s1,t)>0)puts(s2);D、if(strcmp(s1,s1)>0)puts(s2);strcmp()括号里可以是字符串本身,也可以是字符串的地址(首地址) 已知有宏定义#define SQR(a)2*a*a,则SQR(3+4)的值为(A).A、22 B、32 C、98 D、18 若有说明:int *p,m=5,n;以下正确的程序段是(D)。 A、scanf(“%d”,&n);*p=n;B、p=&n;scanf(“%d”,*p)C、p=&n;scanf(“%d”,&p);D、p=&n;scanf(“%d”,p);注意指针必须先初始化才能进行运算 char h,*s=&h;可将字符H通过指针存入变量h中的语句是(A)。 A、*s='H';B、s='H' C、*s=H;D、s=H; 定义结构体的关键字是(A)。 A、struct B、typedef C、enum D、union 判断题 若 a=3,b=2,c=1 则关系表达式“(a>b)==c” 的值为“真”。T a=(b=4)+(c=6)是一个合法的赋值表达式。T C语言程序中输入一个中间带有空格的字符串时,可以用scanf函数.F 格式字符%e以指数形式输出实数数字部分小数位数7位.F 设g=1,h=2,k=3,则逻辑表达式k+g||!h&&k-h的值为0。F 求解表达式max=(a>b)?a:b的步骤是,先求解条件表达式(a>b),再根据它的值将a或b赋给max.T 语句if(a>b)printf(“%d”,a);else printf(“%d”,b);可以用条件表达式a>b?a:b取代.F break语句能够终止当前进行的多层循环.F for循环的三个表达式都可以省略.T for语句的循环体至少执行一次.F(do …… while 才是)字符串“Da lian”在内存中的存储长度是7.F(因为自动加 )定义 int x[5],n;则x=x+n;或x++;都是正确的.F 若有定义 int a[10];则 for(i=0;i<=10;i++)a[i]=i;编译时无语法错误.T 数组名作为函数调用时的实参,实际上传递给形参的是数组第一个元素的值.F 当变量的存储类型定义缺省时,系统默认为变量的存储类型为auto类型,分配在动态区.F 两个字符串中的字符个数相同时才能进行字符串大小的比较.F 如果被包含文件中有全局静态变量,它们在用#include命令的源文件中有效.T 假设有int a[10], *p;则p=&a[0]与p=a等价.T 共用体变量中起作用的成员是最后一次存放的成员.T 下面的定义和语句是合法的:file *fp;fp=fopen(“a.txt”,“r”);F 填空题 若有定义:int a=10,b=9,c=8;接着顺序执行下列语句后,变量c中的值是 _____.c=(a-=(b-5));c=(a%11)+(b=3);9 下列语句输出的结果是_____,int a=-1;printf(“%x”,a);(在vc环境下)ffffffff(8个f,因为是4字节) 设a=3,b=4,c=4,则表达式a+b>c&&b==c&&a||b+c&&b==c的值为_____.1 以下程序段要求从键盘输入字符,当输入字母为'Y' 时,执行循环体,则下划线处应填写_____.ch=getchar();while(ch ____ 'Y')ch=getchar();== static int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};其中a[1][2]的值为_____.6 静态变量和外部变量的初始化是在_____阶段完成的,而自动变量的赋初值是 在_____时进行的.(编译),(运行/函数调用/调用)1752 将函数func的入口地址赋给指针变量p的语句是_____.p=func; 设有以下结构类型说明和变量定义,则变量b在内存所占字节数是 _____。21 struct stud { short int age;char num[3];float s[2];double ave;} b,*p; 程序设计题 /*-----------------【程序设计】1685------------------- 功能:能计算从1开始到n的自然数的和,n由键盘输入,并在main()函数中输出。 -----------------*/ #include “stdio.h” int fun(int n){ /*********Begin**********/ int sum=0,i;for(i=1;i<=n;i++)sum=sum+i;return(sum); /********** End **********/ } main(){ int m;void TestFunc();printf(“Enter m: ”);scanf(“%d”, &m);printf(“nThe result is %dn”, fun(m));TestFunc();} void TestFunc(){ FILE *IN,*OUT;int t;int o;int c;IN=fopen(“in.dat”,“r”);if(IN==NULL){ printf(“Read File Error”);} OUT=fopen(“out.dat”,“w”);if(OUT==NULL){ printf(“Write File Error”);} for(c=1;c<=5;c++){ fscanf(IN,“%d”,&t);o=fun(t);fprintf(OUT,“%dn”,o);} fclose(IN);fclose(OUT);} /*-----------------【程序设计】1599------------------- 功能:调用函数fun判断一个三位数是否“水仙花数”。 在main函数中从键盘输入一个三位数,并输 出判断结果。请编写fun函数。 说明:所谓“水仙花数”是指一3位数,其各位数字立方和 等于该数本身。 例如:153是一个水仙花数,因为153=1+125+27。 -----------------*/ #include “stdio.h” int fun(int n){ /*********Begin**********/ int bw,sw,gw;bw=n/100;sw=(n-bw*100)/10;gw=n%10;if(n==bw*bw*bw+sw*sw*sw+gw*gw*gw)return 1;else return 0; /********** End **********/ } TestFunc(){ FILE *IN,*OUT;int iIN,i;int iOUT;IN=fopen(“in.dat”,“r”);if(IN==NULL){ printf(“Please Verify The Currernt Dir..It May Be Changed”);} OUT=fopen(“out.dat”,“w”);if(OUT==NULL){ printf(“Please Verify The Current Dir..It May Be Changed”);} for(i=0;i<10;i++){ fscanf(IN,“%d”,&iIN);iOUT=fun(iIN);fprintf(OUT,“%dn”,iOUT);} fclose(IN);fclose(OUT);} main(){ int n,flag;scanf(“%d”,&n);flag=fun(n);if(flag)printf(“%d 是水仙花数n”,n);else printf(“%d 不是水仙花数n”,n);TestFunc();} 程序改错题 /*-----------------------【程序改错】1246------------------------- 功能:有一数组内放10个整数,要求找出最小数和它的下标,然后 把它和数组中最前面的元素即第一个数对换位置.-----------------------*/ #include “stdio.h” main(){ int i,a[10],min,k=0;printf(“n please input array 10 elementsn”);for(i=0;i<10;i++)/***********ERROR***********/ scanf(“%d”, a[i]);//scanf(“%d”,&a[i]);for(i=0;i<10;i++)printf(“%d”,a[i]);min=a[0];/***********ERROR***********/ for(i=3;i<10;i++)//for(i=1;i<10;i++)for(i=0;i<10;i++)// for(i=1;i<=9;i++)for(i=0;i<=9;i++) /***********ERROR***********/ if(a[i]>min)// if(a[i] /*-----------------------【程序改错】1906------------------------- 功能:以下程序把两个数按由大到小的顺序输出来.-----------------------*/ #include “stdio.h” /***********ERROR***********/ void swap(int *p1,*p2)//swap(int *p1,int *p2)void swap(int *p1,int *p2){ int p;p=*p1;*p1=*p2;*p2=p;} main(){ int a,b, *p,*q;printf(“input a,b:”);/***********ERROR***********/ scanf(“%d%d”,a,b);//scanf(“%d%d”,&a,&b);p=&a;q=&b;if(a 程序填空题 /*------------------------【程序填空】1324-------------------------- 题目:本程序的功能是输入一段数字后,将输出的数字颠倒输出。 请填空。 ------------------------*/ #include “stdio.h” main(){ int numb,rdigit;scanf(“%d”,&numb);/***********FILL***********/ while(_____)// numb!=0 numb { rdigit=numb%10;/***********FILL***********/ printf(“%d”,_____);// rdigit numb/=10;} printf(“n”);} /*------------------------【程序填空】1573-------------------------- 题目:本程序用printf函数输出字符串“I am student”,完善程序。 ------------------------*/ #include “stdio.h” main(){ int i;char *s1=“I am student”;/***********FILL***********/ for(i=0;s1[i]!=____;i++)// ' ' /***********FILL***********/ printf(“_____”, s1[i]);//%c } 学C语言有感 姓 名: 李文丽 学 号:034108048 班 级:083411 指导老师:张印 2009年12月 学C语言有感 第1页 学C语言有感 摘要:C语言既有高级语言的特点,又具有汇编语言的特点;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言C语言版本。首先按照学习C语言的顺序分别介绍了我在学习C语言过程中所遇到的问题,叙述了在C语言学习过程,学习C语言的重点,难点,以及易出错的地方,并且用具体的案例做解释。然后阐述了学习C语言的体会:C语言的语法部分是学好C语言的基础,学习c语言不能停留在学习它的语法规则,只有通过上机才能检验自己是否掌握c语言、自己编写的程序是否能够正确地解题。最后总结学习c语言,既是件有趣的事情,又是件艰苦的事情。静下心来学习,我们会有所收获,更会其乐无穷的。 关键词:运算符 表达式 优先级 语句 变量 一、C语言的学习中的问题 在这个学期里,我们工商管理专业的学生在专业老师张印的带领下进行了实用c语言简明教程的学习。经过这一个学期的学习,我们已经对c语言这门课程有了一定的了解。C语言是一门最基础的语言,也是一门广泛使用的语言。所以学习C语言义不容辞 首先,在学习的最初几节课,老是主要向我们讲述了C语言的特点,学习C语言的意义,以及学习C语言能给我们所带来的方便优越之处。 C语言是一种结构化语言。它层次清晰,简洁紧凑、灵活方便,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强,语法限制不太严格、程序设计自由度大。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作,适用范围大,可移植性好。总之,C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,有是一个使用的程序设计语言;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言C语言版本。 当然,C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数族下标越界不作检查等。从应用的角度,C语言比其他高级语 学C语言有感 第2页 言较难掌握。 下面我给大家说一说我在学习C语言过程中所遇到的问题。 在第二章,我们学习的是数据描述与基本操作。在这一章,我们主要讲了数据类型,运算符与表达式,和不同类型数据间的混合运算。其中比较难以理解和掌握的是自加、自减运算符。 自加、自减运算符作用是使变量的值增1或减1;当符号在前,变量在后,++i/--i 变量的值先加1或先减1,然后再参与其它运算。当符号在后,变量在前,++i/--i 变量的值先参与其它运算,然后再加1或先减1。例如: # include 1.自加运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式,如6++或(a+b)++都是不合法的。因为5是常量,常量的值是不能改变的。(a+b)++也不可能实现,假如a+b的值为5,那么自加后得到的6放在什么地方? 2.++和--的结合方向是“自右向左”。负号运算符和++运算符同优先级,而结合方向为“自右向左”,即它相当于-(i++),如果有printf(“%d”,-i++),则先取出i的值3,输出-i的值-3,然后i增值为4。注意-(i++)是先用i的原值3加上负号输出-3,再对i加1,不要认为加完1后再加负号,输出-4,这是不对的。 例如,x=a*b+c%d 无所谓; 例如,a=3;y=a*++a;不同的编译系统有两种处理方式,结果不同: A)按从左到右的顺序处理为:先取a的值3,再计算++a,a的值 自增为4,子表达式++a的值也为4,所以相乘的结果为12; 学C语言有感 第3页 B)按从右到左的顺序处理为:先计算++a,a的值自增为4,子表达式++a的值也为4,再取a的值为4,所以相乘的结果为16。 在第三章我们讲的是顺序结构程序设计,其中所涉及的主要问题说优先级。 说到优先级什么叫优先级?比方说,我们在公交车终点站排座队时总会遇到70岁以上的老人不需要排队就能上车的情景,这就是优先级的涵义。C程序在运行时也象排队坐车一样,首先照顾那些优先级高的运算符,若是优先级相同,那么就象遇到两位(或两位以上)70岁以上的老人那样,让他们依次上车。 下面我们通过几个例子来说明: (1)3*20/4%10 这个表达式中出现3种运算符,是同级运算符,运算顺序按从左至右结合,因此先计算3 * 20=60,然后被4除,结果为15,最后是%(求余数)运算,所以表达式的最终结果为15%10 = 5(2)a = 3;b = 5;c =++ a* b ;d =a + +* b; 例子中的“;”是C语言的语句分隔符,执行顺序为从左到右,第1条语句执行后a的值为3,第2条语句执行后b的值为5,第3条语句中有两个运算符前置+ +和*,按表中所列顺序,+ +先执行,*后执行,所以+ + a执行后,a的值为4,由于+ +为前置运算,所以a的值4参与运算,C的值为20,最后执行第4条语句,由于a + +为后置运算,所以a值为4参与运算,使得d的值仍为20,而a参与运算后其值加1,值为5。这个例子执行后,a的值为5,b的值为5,c的值为20,d的值也是20。(3)a = 3,b = 5,b+ = a,c = b* 5 例子中的“,”是逗号结合运算,上式称为逗号表达式,自左向右结合,最后一个表达式的结果值就是逗号表达式的结果,所以上面的逗号表达式结果为40,a的值为3,b的值为8,c的值为40。 但是C语言中的优先级的运算并不是千篇一律的,只能说是在大多数情况下,有些运算符的优先级有其自己的特点,因此这点大家要注意。例如条件表达式:条件?结果1:结果2,这种表达式很多朋友都知道,它的作用与IF…ELSE…条件判断语句很雷同,它运算时的优先级就不是按照C语言的规则来完成的。所以说对于优先级各位编程爱好者一定灵活掌握,不要死记硬背。 第三四章的选择结构程序设计和循环结构设计说我们这学期所学内容的重点。在这里,学者结构程序设计比较简单,我们就不多说了,主要谈一下循结构环程序设计。 学C语言有感 第4页 循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提昌用goto循环,所以下面我们重点讲解另外的三种循环。 用while和do—while循环时,循环变量的初始化的操作应在循环体之前,而for循环是在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do—while循环是先执行循环体后判断表达式,也就是说do—while的循环体最少被执行一次,而while 循环和for就不一定了。这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,不能用break和 continue语句进行控制。这三种结构并不是彼此孤立的,在循环中可能出现分支、顺序结构,分支中也可能出现循环、顺序结构而把循环、分支看成一个语句,它又是构成顺序结构的一个元素,因此这三种结构相互结合,就能实现各种算法,设计出解题程序,但若是很大的题目,这样编出的程序往往很长,重复结构多,并且可阅读性差,因此我们常将C程序设计成模块化结构。 二、C语言学习的重点、难点 针对我个人而言,在C语言学习过程,学习C语言的重点,难点,以及易出错的地方主要有以下几个方面: 如果对几个变量赋予同一个初值,应写成: int a=3,b=3,c=3;表示a、b、c的初值都是3。不能写成: int a=b=c=3;2 强制类型转换其一般形式为(类型名)(表达式)表达式应该用括号括起来。如(int)(x+y)表示将x+y的值转换成整形如果写成(int)x+y则表示将x转换成整形,然后与y相加。使用scanf函数注意的问题: ①“格式控制”后面应当是变量地址,而不应是变量名。如 scanf(“%d”,a)是不对的,应改为scanf(“%d”,&a);②scanf函数格式控制最后面不能有n否则将没有结果输出如scanf(“%dn”,&a);是不对的。③输入数据时不能规定精度,如scanf(“%7.2f”),&a);是不合法的 ④如果在%后有一个“*”附加说明符,表示跳过它指定的列数。 学C语言有感 第5页 三、学习c语言的体会 在经过了一个学期的学习之后,对于学习c语言心得体会也总结了一下: 1、既然是一门语言,他就汉语,英语一样,都有自己的语法规则,学习一门语言,就是要按照它的语法来编程。C语言的语法部分是学好C语言的基础,只有学好了这些语法,才会写程序,看程序。所以对一个初学者来说,加深对课堂讲授内容的理解,要扎实地熟悉每一个语法,并能根据这些语法来编程。 2、课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。 3、学习c语言不能停留在学习它的语法规则,而是利用学到的知识编写c语言程序,解决实际问题。即把c语言作为工具,描述解决实际问题的步骤,由计算机帮助我们解题。只有通过上机才能检验自己是否掌握c语言、自己编写的程序是否能够正确地解题。学习C语言是没有什么捷径的,打好基础,做好每章的练习才是关键。尤其是书本里的习题,不能因为简单就不去实践,学习C语言,乃至于学习所有的电脑知识都是一样的,实践练习永远处于最为重要的地位,须知电脑是要实际操作的,对于C语言,更是要是把这个程序自己编出来并且运行成功,知识点才记得最为深刻。 通过上机实验来验证自己编制的程序是否正确,恐怕是大多数同学在完成老师作业时的心态。但是在程序设计领域里这是一定要克服的传统的、错误的想法。因为在这种思想支配下,可能你会想办法去“掩盖”程序中的错误,而不是尽可能多地发现程序中存在的问题。自己编好程序上机调试运行时,可能有很多你想不到的情况发生,通过解决这些问题,可以逐步提高自己对c语言的理解和程序开发能力。学习c语言更为重要的是掌握编程的思想,如何用简捷的方法解决一个问题。同样做一个循环问题,可能有人要做300次循环,而有的人要做100次,这就是差距。平时,我们学习的时候要注意掌握每个概念,当然理论的学习是离不开实践的,尤其是c语言,需要你编写大量的程序,最初可以学着别人的程序打,慢慢就应该独立出来,把自己的想法用c语言描述出来,这是一件十分快乐的事情。建议初学者不要看高级编程,先勤写代码、多看代码、培 学C语言有感 第6页 养风格、熟悉语法、最关键的还是把握思想。当你能够信手拈来的时候,你的c语言才可以说学会了。一定要养成自己独立写完一个程序的能力,这样可以有一种成就感。不断培养这种成就感,循序渐进,进步是自然的事情。 四、总结 学习c语言,既是件有趣的事情,又是件艰苦的事情。说它有趣,是因为从中你能得到快乐,能使你的计算机整体水平上升一大步。说它艰苦,是因为学习它的过程比起学习其他计算机知识,要难得多 C语言只是一门计算机语言,说到底就是一种工具。它的用处就是可以让你用它编出能够运行的程序来,而这些程序可以实现某些人需要的功能。人通过学习c语言也可以更加深入的了解计算机,所以很多人都把c语言作为计算机入门的第一门语言来学习,因为他学习起来相对简单一些。至于实际的意义,无非是让你多学会一门技能,让你更加深入对计算机的了解,为学习其他计算机语言打下好的基础。 学习最好抱着一种踏踏实实的心态,老是想着有什么实际的好处并不会促进我们的学习,因为知识对人的影响是潜移默化的,静下心来学习吧,我相信我们会有收获的!而且如果你真的用心学习,会发现学起来越来越有意思,也会给你带来无穷的乐趣的! 学C语言有感 第7页 参考文献: [1] 3 沈其益等编著,棉花病害——基础理论与防治,北京:科学出版社,1992.7 [2] 3 沈其益、张三等编著,棉花病害——基础理论与防治,北京:科学出版社,1992.7。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。参考文献(不少于10篇,中文参考文献不少于7篇,英文不少于3篇) 学C语言有感 第8页 学C语言有感 第9页 如何学C语言 (一)“项目驱动”式教学 目前最著名、最有影响、应用最广泛的windows、linux和UNIX三个操作系统都是用C语言编写的。0S是计算机系统(由软硬件两个子系统构成)的核心和灵魂,它是软件中最庞大最复杂的系统软件。既然如此庞大复杂的0S都可以用c语言编写,从狭义而言,还有什么系统软件和应用软件不能用c语言编写呢?由此可以肯定的说,c语言是一门十分优秀而又重要的语言。 c语言程序设计是过程性程序设计语言,它的发展贯穿了计算机发展的历程,它蕴含了程序设计的基本思想,囊括了程序设计的基本概念,所以它是理工科高等院校的一门基础课程。从市面上有关c语言的书籍和高等院校采用的教材来看,它们有一个共性,那就是:脱离了实际应用(全是小打小闹的小例子),纯粹的过程性程序设计,没有软件工程思想的体现,没有一定程序设计风格,仅仅是为了让大家明白什么是c语言而已。 高等院校开设c语言程序设计的目的是让学生对程序设计有个入门,有个直观的理解,同时为其他后续课程作铺垫。但是如果教学仅仅以此为目的,那么教学本身就效果而言是个大大的失败。 大家知道,在商业上讲究唯利是图,“利”是商业追求的目标,离开了“利”经商,则商无动力,其结果是必败无疑。在c语言程序设计教学当中,教师应该把“唯用是图”作为教学的首要目标。如果抛开了实际应用进行程序设计教学,就是纸上谈兵,就是“说明书”式的教学。印度的程序设计课程采用“事件驱动式”教学,我认为在中国的c语言程序设计教学中应该采用“项目驱动式”教学。“项目驱动式”教学就是以项目为目的,以c语言理论教学为过程,最终能用c语言设计项目,实现项目的要求。“项目驱动式”教学的关键在于培养学生“如何做什么”和“可以干什么”。一个项目就是一个工程,在“项目驱动式”教学中,首先应该让学生简单了解什么是软件工程思想,其次在c语言理论教学过程中,让学生懂得面向对象的程序设计的风格,最后引导他们来设计项目。 (二)“项目驱动”式教学应注意的问题 1.c语言程序设计教学要帮助学生树立面向工程的观点 在计算机行业中,软件是通过人们的智力活动、把知识与技术转化成信息的一种产品。软件的设计已经用工程的观念来进行管理。软件设计工作被当作一项系统工程来对待。软件的的生存周期一般可分为以下阶段:问题定义、可行性研究、需求分析、概要设计、详细设计、编码、测试、运行与维护。我们不难看出软件工程的复杂程度是很大的。理工科高等院校把c语言作为一门基础课程,也是为了给社会培养信息技术人才。众所周知,养成一个好的习惯是非常重要的,所以c语言程序设计作为大多数工科院校学生接触的第一门程序设计语言(有的院校讲pascal),就应该让学生树立正确的观点。那么当前的程序设计教学也必须以切合将来软件工程开发的实际需要为第一目标,使学生在学习程序设计的初级阶段就树立正确的软件工程观点。这样做不仅可以为学生将来从事计算机应用设计打下良好的基础,而且有利于培养学生分析问题的完备性,以及统筹全局,协调关系的基本素质。 2.理论教学应从单一的“结构化程序设计”向“结构化与面向对象并举”转变 “结构化程序设计”方法是程序设计的基础,必须让学生掌握得坚实可靠。结构化程序设计的过程是培养学生思维能力的过程,在教学中经常发现有些学生的思维混乱。这些都是缺乏思维训练的结果。结构化程序设计的训练不仅可以让学生养成良好的程序设计习惯,而且可以有效地培养学生思维的条理性和逻辑性。所以在授课过程中要注意讲解结构化程序设计的思想时应突出两点:(1)程序的质量首先取决于它的结构。(2)程序设计的基本方法是自顶向下地逐步求精和模块化。 在c程序教学过程中,越到后面的章节,学生越会产生设计程序逐渐变难的感觉,这是不符 合逻辑的一种怪现象。按照常理,C语言学的越多,说明你的程序设计知识越多,设计起程序来应该更加得心应手,那么出现这种现象的原因何在呢?当然该问题的出现的原因是多方面的,但是其中最重要的一点就是长期以来程序设计的观念不是以如何处理好对象为出发点,而是以如何使用好语言为基本点。受这种思想的影响,我们的程序设计教学大多数不是以如何解决好问题为重点,而是以讲解语法规则和语句格式为重点,是“说明书”式的教学。这样做造成的结果就是见到一个程序后学生首先想到是该用哪条语句,而不是思考怎样合理的解析。要切实解决这个问题,首先应该改变程序设计的观念。“面向对象程序设计”思想是目前最为流行、极为实用的一种程序设计方法,但是让学生直接接触“面向对象程序设计”,肯定不能对程序设计打下牢固的基础。“结构化与面向对象并举”是现代计算机程序设计的发展趋势,应该认真探索研究,让学生有一个较为轻松的学习过程。程序设计的实质就是编写处理对象的过程,所以将c与c++有机的融为一体的教材应该是首选教材,在教学过程中,我们应该从社会发展的角度进行探索研究,将目前最为流行又极为实用“面向对象程序设计”思想融合到c语言教学中。 3.c语言教学应培养学生良好的程序设计风格 具有良好的设计风格应该是程序员所具备的基本素质,在实际的项目中程序员往往都有自己的一些编程风格。目前95%以上的程序设计书籍不注重程序设计风格问题,这导致了很多学生没有良好的程序设计风格,在他们刚刚毕业踏入社会时,如果周围的同事没有良好的编程风格,那么很难通过环境来使自己提高这方面的素质,即使有提高也不容易比较全面的提高。因此在学生接触的第一门程序设计语言教学中,就应该培养学生良好的程序设计风格,使他们一进工作环境就具备这个素质。 Pascal设计者N.Writh教授十分重视程序设计风格的养成,他坚信“教给学生们以表达他们思维的语言会深深地影响他们思维和创造发明的习惯,而正是这些语言本身的混乱直接影响着学生们的程序设计的风格”,他这里所指的“这些运用”是当时那些主要用于程序设计教学的计算机语言。对学生来讲,一开始就强调程序设计风格很有必要,良好的程序设计风格不仅有助于提高程序的可靠性、可理解性、可测试性、可维护性和可重用性,而且也能够促进技术的交流,改善软件的质量。所以培养良好的程序设计风格对于初学者来说非常重要。程序设计风格,实际上是指的是编码风格。在教学过程中应从源程序文档化,数据说明的原则,输入/输出方法这三个方面培养学生的编码风格,进而从编码原则探讨提高程序的可读性、改善程序质量的方法。 (1)源程序文档化。编码的目的是产生程序,但是为了提高程序的可维护性。源代码是需要实现文档化的。源程序文档化包括选择标识符(变量和标号)的名字、安排注释以及标准的书写格式等。 ①选择标识符的命名规则。标识符包括模块名、变量名、常量名、标号名、子程序名等。这些名字应能反映它所代表的实际东西,应有一定实际意义,使其能顾名思义。另外在模块名、变量名、常量名、标号名、子程序名中使用下划线是一种风格。使用这一技术的一种广为人知的命名规则就是匈牙利命名法(变量类型由一个或两个字符表示,并且这些字符将作为变量名的前缀)。当然使用匈牙利命名法与否都没有错误,重要的是要保持一致性——在整个程序中使用相同的命名规则。这就是说,如果你在一个小组环境中编程,你和其他小组成员应该制定一种命名规则。并自始至终使用这种规则。如果有人使用了别的命名规则,那么集成的程序读起来将是很费劲的。此外,你还要与程序中用到的第三方库(如果有的话)所使用的风格保持一致。如果可能的话,你应该尽量使用与第三方库相同的命名规则,这将加强你的程序的可读性和一致性。 ②注释。程序中的注释是程序设计者与程序阅读者之间通信的重要手段。注释能够帮助读者理解程序,并为后续测试维护提供明确的指导信息。因此,注释是十分重要的,大多数程序 设计语言提供了使用自然语言来写注释的环境,为程序阅读者带来很大的方便。注释分为功能性注释和序言性注释。 a.功能性注释。功能性注释在源程序中,用以描述其后的语句或程序段是在做什么工作,也就是解释下面要“做什么”,而不是解释下面怎么做。对于书写功能性注释,要注意以下几点:第一描述一段程序,而不是每一个语句。第二利用缩进和空行,使程序与注释容易区别。第三注释要准确无误。 b.序言性注释。序言性注释通常位于每个程序模块的开头部分,它给出程序的整体说明,对于理解程序具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出。有关内容包括:程序标题;有关该模块功能和目的的说明;主要算法;接口说明:包括调用形式,参数描述,子程序清单;有关数据描述;模块位置(在哪一个源文件中,或隶属于哪一个软件包);开发简历:模块设计者、复审考、复审日期。③用标准的书写格式。源程序清单的书写建议采用以下几点: a.每行只写一条语句; b.用分层缩进的写法显示嵌套结构层次,这样可使程序的逻辑结构更加清晰,层次更加分明。c.书写表达式时适当使用空格或圆括号作隔离符。 d.在注释段周围加上边框; e.注释段与程序段、以及不同的程序段之间插入字行; (2)数据说明采用的原则。在编写程序时,要注意数据说明的风格。 数据说明的次序如果规范,将有利于测试,排错和维护。首先说明的先后次序要固定,例如,按常量说明、简单变量类型说明、数组说明用数据块说明、所有的文件说明的顺序说明。当然在类型说明中还可进一步要求,例如按如下顺序排列:整型量说明、实型量说明、字符量说明、逻辑说明。 其次当用一个语句说明多个变量名时,应当对这些变量按字母的顺序排列。 最后对于复杂数据结构,应利用注释说明实现这个数据结构的特点。 (3)输入/输出方法。输入/输出的方式和格式应当尽量避免因设计不当给用户带来的麻烦。这就要求,源程序的输入/输出风格必须满足能否为用户接受这一原则。所以在设计程序时,应考虑以下原则:输入数据时,要使输入的步骤和操作尽可能简单,应允许使用自由格式输入;应允许缺省值;对输入的数据要进行检验,以保证每个数据的有效性。 (三)结束语 在教学过程中,我们让学生设计一个程序模拟体育彩票的销售与对奖的过程,取得了良好的效果。他不仅启发和诱导了学生独立思考、积极思维的主动性,而且充分调动了学生学习的自觉性和积极性,使学生融会贯通地掌握了所学知识,提高了分析问题和解决实际问题的能力。 搞好c程序设计的教学工作涉及的因素很多,如果以项目来驱动教学,首先让学生树立面向工程的思想,其次把教学从单一的“结构化程序设计”向“结构化与面向对象并举”转变,最后特别要培养学生养成良好的编码风格,从而使他们学会能够“干什么”,那么我们认为教学目的就达到了。第二篇:C语言模拟ATM机
第三篇:北航C语言期末模拟试题2012
第四篇:c语言
第五篇:如何学C语言