编程的心得体会
作业要求:
考试总分排序。
(1) 从文件(.txt)读入你班10个学生的有关信息:学号(int),姓名 (字符数组),三门课成绩(int数组)。要求用结构体数组存放学生 信息。
(2) 求各个学生的总成绩。
(3)按总分成绩从高到低的顺序将学生的各信息(学号、姓名、三门课成 绩、总成绩)输出到另一文件(.txt)中保存。
作业目的:
主要考察我们对结构体的认识,数组的掌握,文件操作的掌握。
本程序涉及定义一个结构体,字符数组,int数组,冒泡法排序,文本文件的读入,创建,输出。
#include<stdio.h>
#include<stdlib.h>
struct student
{
int id;
char name[20];
int score[3];
int total;
}st[10],t; //结构体变量的定义
main()
{
FILE *fp;
int i=0,j;
fp=fopen(“d:\\chengji.txt”,”r”);//文本文件的打开
if(fp==NULL)
{ printf(“file open error!\n”);
exit(0);
}
else
printf(“file open ok!\n”); //文本文件是否正确打开的判断
while(!feof(fp))
{
fscanf(fp,”%d %s %d %d %d”,&st[i].id,st[i].name,&st[i].score[0],&st[i].score[1],&st[i].score[2]);
st[i].total=st[i].score[0]+st[i].score[1]+st[i].score[2];
i++;
} //从文本文件读取10个学生的成绩并计算总成绩
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
{
if(st[i].total<st[j].total)
{
t=st[i];
st[i]=st[j];
st[j]=t;
}
} //冒泡法排序10个学生的成绩
fclose(fp); //关闭文本文件
fp=fopen(“d:\\chengjic.txt”,”w”);
if(fp==NULL)
{ printf(“file open error!\n”);
exit(0);
}
else
printf(“file open ok!\n”); //打开输入的文本文件
fprintf(fp,”学号 姓名 成绩1 成绩2 成绩3 总成绩 \n”);
for(i=0;i<=9;i++)
fprintf(fp,”%-6d %-8s %-4d %-4d %-4d %-4d\n”,st[i].id,st[i].name,st[i].score[0],st[i].score[1],st[i].score[2],st[i].total); //数据输出
}
不同之处:
我认为我的程序与一般的程序没有太多想法不同的地方。若要说的话就是在读取数据时,在打开文本文件时,先判断文本文件能否正确打开。同时算出学生的总成绩,没有另外用一个循环来算总成绩。输出信息到文本文件时,用了一个表头,下方的数据设置与表头对齐。
改进之处:
还需改进之处就是文本文件的打开位置与文件名能由用户来决定。排序方法还可以继续改进,现在的冒泡法需要很繁琐的运行,若数据较多时,运算时间就会很长。可以用一些高级的排序方法,来减短时间。
心得体会:
在编程的时候还犯了一些错误。比方说字符数组与整型数组在赋值时,老是在字符数组与整型数组前,哪个该加地址符搞混淆。有时候在行尾,忘记加分号。
在写文件操作时,有时会忘记一些指令。一些指令会打错。有时会忘记数组是从0开始的。
编程并不需要去死记硬背一些指令,而是去理解。学习一年的编程,会发现C语言还是有规律可循的,一些指令在理解的基础上去编,会发现很简单。
我感觉编程是一个需要耐心的工作,你在编程的过程会遇到各种各样的困难,如果你没有耐心,你就很容易打退堂鼓,那你做不好编程这件事。你要有耐心,知道有错误后,就得从头到尾反复地看,去发现错误。所以编程是一个培养一个人耐心的过程。
编程也是一个让人变得更严谨的过程,使人的思维更加缜密。因为你必须毫无差错地发一个指令,计算机才会去执行。你必须一步一步,稳打稳扎地去做,不得有半点马虎,也不能偷工减料。编程也会激发人的思维,使人的思维更加活跃。你必须自己想算法去做,久而久之,会发现很有创造性。
有人会说,编程是一个枯燥乏味的过程,但我不完全赞同,编程的过程是一个创造的过程,当你编完后,再运行成功了,你会感觉非常的快乐,特别有成就感。
经过一年的学习,我发现学习C语言,让我学会和懂得了很多。
第二篇:程序设计实践实验报告
程序设计实践实验报告
实 验 报 告
课程名称 ___ 程序设计实践__
实验项目 _______子程序设计
实验仪器 PC __
系 别_ 计算机科学与工程
专 业 软件工程
班级/学号 B软工0701/**
学生姓名 _ XX
实验日期 20XX-3-26_
成 绩
指导教师 _XX_
实验二 子程序设计
一、实验目的
1. 学习和掌握参数传递的方法;
2.学习和掌握递归调用;
3.了解goto语句的使用;
4.了解降低嵌套深度的方法;
5.了解复杂度的度量。
二、实验要求
1.通过编程实现,学习和理解参数传递和递归调用的使用。
2.使用goto语句编写程序,用非goto语句改写程序;
3.了解减少嵌套层次和度量复杂度的方法。
三、实验内容和结果
1. 参数传递
(1)创建控制台应用程序项目(CLR)。定义函数swap,swap函数有两个整型形参x,y,swap的功能为交换x和y的值,并依次显示出交换后的x,y的值。主函数定义两个整型变量a,b,并赋不同的初值,依次显示a和b的值,调用swap函数,a,b作为实参,再在主函数中依次显示a和b的值。(值传递)
编写并运行以上程序,分析运行结果,思考值传递中是否会改变实参的值。
(2)创建控制台应用程序项目,修改(1)中程序,使 swap函数的参数为两个指向整型的指针,swap函数中交换指针所指向的内容;主函数中调用swap函数,交换整型变量a和b的值。
编写并运行修改后的程序,比较与(1)中程序运行结果的不同之处及原因。
(3)创建控制台应用程序项目,修改(1)中程序,采用引用方式传递函数的参数。
编写并运行修改后的程序,比较与(1)、(2)中程序运行结果的异同以及(2)、(3)程序中改写的难易程度。
int swap1(int x,int y){int temp;
temp=x;
x=y;
y=temp;
return 0;} //实参传递函数
int swap2(int &x,int &y){int temp;
temp=x;
x=y;
y=temp;
return 0;}//形参传递函数
int swap3(int *x,int *y){int temp;
temp=*x;
*x=*y;
*y=temp;
return 0;}//指针传递函数
int main()
{
int a,b;
Console::WriteLine ("plesae input a and b interger:");
a=Int32::Parse(Console::ReadLine());
b=Int32::Parse(Console::ReadLine());
Console::WriteLine ("实参传递函数交换a和b:");
Console::WriteLine ("起始a和b:"+a+" "+b);
swap1(a,b);
Console::WriteLine ("交换后a和b:"+a+" "+b);
Console::WriteLine ("-------------------");
Console::WriteLine ("形参传递函数交换a和b:");
Console::WriteLine ("起始a和b:"+a+" "+b);
swap2(a,b);
Console::WriteLine ("交换后a和b:"+a+" "+b);
Console::WriteLine ("++++++++++++++++");
Console::WriteLine ("指针传递函数交换a和b:");
Console::WriteLine ("起始a和b:"+a+" "+b);
swap3(&a,&b);
Console::WriteLine ("交换后a和b:"+a+" "+b);
Console::WriteLine ( "%%%%%%%%%%%%%%%%%" );
Console::ReadLine();
return 0;
}
2.递归调用
使用递归时,请注意如下原则:a.确认递归能够停止(子程序中至少含有一条非递归的路径);b.把递归限制在一个子程序内;c.留心栈空间;使用递归前,先考虑可否用其他方式编写程序,可能效果更好。
创建控制台应用程序项目,用递归方式计算阶乘,编写计算阶乘的函数,输入参数n,函数返回值为n的阶乘。编写程序并运行结果。(注意溢出)
创建控制台应用程序项目,用循环方式去计算阶乘。编写程序并运行结果。(注意溢出)
long double digui(long double n)
{
if(n==0||n==1)
{return(1);}
else
{return (digui(n-1)*n);}
}//递归函数
long double xhuan(long double n)
{
long double x=1;
if(n==0||n==1)
{return(1);}
else
{
for(int i=1;i<=n;i++)
{
x=x*i;
}
}
return x;
}//循环函数
int main(array<System::String ^> ^args)
{
Console::WriteLine("please input an integer n:");
long double n=Int32::Parse(Console::ReadLine());
while(n<0)
{Console::WriteLine("n<0,please reinput an integer n:");
n=Int32::Parse(Console::ReadLine());
}
Console::WriteLine("循环输出阶乘n!="+xhuan(n));
Console::WriteLine("递归输出阶乘n!="+digui(n));
Console::ReadLine();
return 0;
}
3.goto语句
(1)创建控制台应用程序项目,编写和运行如下程序。主函数如下:
int data;
int isend;
do
{
Console::WriteLine("please input two number ");
isend= Int32::Parse(Console::ReadLine());
data= Int32::Parse(Console::ReadLine());
if (isend==0){
goto LOOP_EXIT;}
Console::WriteLine("no exit");
}while(data!=-1);
LOOP_EXIT:
Console::ReadLine();
isend不为0时,data为-1:
isend不为0时, data不为-1:
isend为0:
(2)将上述程序改写为没有goto语句的如下程序
int data;
int isend;
Console::WriteLine("please input two number");
isend= Int32::Parse(Console::ReadLine());
data= Int32::Parse(Console::ReadLine());
while((isend!=0)&&(data!=-1))
{
Console::WriteLine("no exit");
Console::WriteLine("please input two number");
isend= Int32::Parse(Console::ReadLine());
data= Int32::Parse(Console::ReadLine());
}
Console::ReadLine();
isend不为0,data为-1:
isend不为0,data不为-1:
isend为0:
比较结果与(1)的不同。
当isend不为0,data为-1时两次显示结果不同,第二次没有“no exit”字样
(3)将(1)中程序改写为没有goto的程序,且运行结果要求与(1)中一致。
(4)编写并运行下列带goto语句的程序
int a[4];
for(int i=0;i<4;i++)
{
Console::WriteLine("please input number");
a[i]= Int32::Parse(Console::ReadLine());
}
if (a[0]==0)
{
Console::WriteLine("a0=0");
goto END_PROC;
}
if (a[1]==0)
{
Console::WriteLine("a1=0");
goto END_PROC;
}
if (a[2]==0)
{
Console::WriteLine("a2=0");
goto END_PROC;
}
if (a[3]==0)
{
Console::WriteLine("a3=0");
goto END_PROC;
}
END_PROC:
Console::WriteLine("end_proc");
Console::ReadLine();
执行goto语句:
不执行goto语句:
(5)改写(4)中程序,要求利用嵌套的if-else语句消除goto的代码,得到与(4)相同的运行结果。
int main(array<System::String ^> ^args)
{
int a[4];
for(int i=0;i<4;i++)
{
Console::WriteLine("please input number");
a[i]= Int32::Parse(Console::ReadLine());
}
if (a[0]==0)
Console::WriteLine("a0=0");
else
{
if (a[1]==0)
Console::WriteLine("a1=0");
else
{
if (a[2]==0)
Console::WriteLine("a2=0");
else
{
if (a{[3]==0)
Console::WriteLine("a3=0");
}
}
}
END_PROC:
Console::WriteLine("end_proc");
Console::ReadLine();
return 0;
}
结果:
观察用if嵌套的程序与使用goto语句的程序的代码特点。
4. 嵌套层次控制
(1)运行以下程序
int a[4];
for(int i=0;i<4;i++)
{
Console::WriteLine("please input number");
a[i]= Int32::Parse(Console::ReadLine());
}
if (a[0]==0)
{
Console::WriteLine("a0=0");
if (a[1]==0)
{
Console::WriteLine("a1=0");
if (a[2]==0)
{
Console::WriteLine("a2=0");
if (a[3]==0)
{
Console::WriteLine("a3=0");
}
}
}
}
Console::ReadLine();
结果:
(2)用重复测试的非嵌套代码重写上程序,减少嵌套深度。
提示:if语句部分可以用如下思路来重写
using namespace System
int main(array<System::String ^> ^args)
{
int a[4];
for(int i=0;i<4;i++)
{
Console::WriteLine("please input number");
a[i]= Int32::Parse(Console::ReadLine());}
if ((a[0]==0)&& (a[1]==0)&& (a[2]==0))
{
Console::WriteLine("a0=0");
Console::WriteLine("a1=0");
Console::WriteLine("a2=0");
if (a[3]==0)
{
Console::WriteLine("a3=0");}
}
else
{
if((a[0]==0)&& (a[1]==0))
{
Console::WriteLine("a0=0");
Console::WriteLine("a1=0");
if(a[2]==0)
{
Console::WriteLine("a2=0");}
}
else
{
if(a[0]==0)
{
Console::WriteLine("a0=0");
if(a[1]==0)
{
Console::WriteLine("a1=0");}
}
}
}
Console::ReadLine();
return 0;
}
截图:
思考(2)中的代码与(1)中的代码相比的优缺点。
一中代码量较少,但是难度增加,二中代码量多,难度减少
(3)调试和运行如下程序。
int quantity;
quantity= Int32::Parse(Console::ReadLine());
if (quantity<30){
if(quantity<20){
if(quantity<10){
Console::WriteLine("quantity <10");
}
else{
Console::WriteLine("20> quantity>=10");
}
}
else{
Console::WriteLine("30> quantity>=20");
}
}
else{
Console::WriteLine("quantity>=30");
}
(4)使用if-else if-…else改写程序(3),减少(3)中的嵌套深度。
int main(array<System::String ^> ^args)
{
int quantity;
Console::WriteLine("please input number");
quantity= Int32::Parse(Console::ReadLine());
if (quantity <10)
Console::WriteLine("quantity<10");
else if(quantity<20)
Console::WriteLine("10<=quantity<20");
else if(quantity<30)
Console::WriteLine("20<=quantity<30");
else
Console::WriteLine("quantity>=30");
Console::ReadLine();
return 0;
}
四.总结
通过本次训练,对c#语言有较大了解,心得有一个,就是每个程序右面应该有一个输入语句,以便观察运行结果,本次感悟最深的是if语句和循环语句等。希望多实践