c语言实验八
- 格式:doc
- 大小:48.00 KB
- 文档页数:7
一、实验内容和要求八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。
例如:图1 八数码问题示意图请任选一种盲目搜索算法(广度优先搜索或深度优先搜索)或任选一种启发式搜索方法(全局择优搜索,加权状态图搜索,A 算法或A* 算法)编程求解八数码问题(初始状态任选)。
选择一个初始状态,画出搜索树,填写相应的OPEN 表和CLOSED表,给出解路径,对实验结果进行分析总结,得出结论。
二、实验目的1. 熟悉人工智能系统中的问题求解过程;2. 熟悉状态空间的盲目搜索和启发式搜索算法的应用;3. 熟悉对八数码问题的建模、求解及编程语言的应用。
三、实验算法A*算法是一种常用的启发式搜索算法。
在A*算法中,一个结点位置的好坏用估价函数来对它进行评估。
A*算法的估价函数可表示为:f'(n) = g'(n) + h'(n)这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值(也称为最小耗费或最小代价),h'(n)是n到目标的最短路经的启发值。
由于这个f'(n)其实是无法预先知道的,所以实际上使用的是下面的估价函数:f(n) = g(n) + h(n)其中g(n)是从初始结点到节点n的实际代价,h(n)是从结点n到目标结点的最佳路径的估计代价。
在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。
用f(n)作为f'(n)的近似,也就是用g(n)代替g'(n),h(n)代替h'(n)。
这样必须满足两个条件:(1)g(n)>=g'(n)(大多数情况下都是满足的,可以不用考虑),且f必须保持单调递增。
(2)h必须小于等于实际的从当前节点到达目标节点的最小耗费h(n)<=h'(n)。
c语言实验报告实验C 语言实验报告实验一、实验目的本次 C 语言实验的主要目的是通过实际操作和编程实践,加深对 C 语言基本语法、数据类型、控制结构、数组、指针等重要概念的理解和掌握,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程环境为 Visual Studio 2019,操作系统为Windows 10。
三、实验内容1、基本数据类型和运算符的使用定义不同类型的变量,如整数型(int)、浮点型(float、double)、字符型(char)等,并进行赋值和运算操作。
熟悉各种运算符的优先级和结合性,包括算术运算符(+、、、/、%)、关系运算符(>、<、>=、<=、==、!=)、逻辑运算符(&&、||、!)、位运算符(&、|、^、~、<<、>>)等。
2、控制结构的应用使用ifelse 语句实现条件判断,根据不同的条件执行相应的代码块。
运用 switch 语句进行多分支选择,处理不同的情况。
利用 for 循环、while 循环和 dowhile 循环实现重复执行的操作,例如计算数列的和、打印特定的图案等。
3、数组和字符串的操作定义和使用一维数组、二维数组,进行数组元素的访问、赋值和遍历。
掌握字符串的存储和处理方式,使用字符数组和字符串函数(如strlen、strcpy、strcmp 等)进行字符串的操作。
4、指针的应用理解指针的概念和指针变量的定义,通过指针访问变量和数组元素。
实现指针与数组、指针与函数的结合使用,体会指针在程序中的灵活运用。
5、函数的定义和调用编写自定义函数,实现特定的功能,如计算阶乘、判断素数等。
掌握函数的参数传递方式(值传递和地址传递),理解函数的返回值。
6、结构体和共用体的使用定义结构体类型,创建结构体变量,访问结构体成员。
了解共用体的概念和使用场景,比较结构体和共用体的区别。
四、实验步骤1、实验准备打开 Visual Studio 2019 开发环境,创建一个新的 C 语言项目。
提交作业要求1.建立一个学号+姓名文件夹(如:20111234张志),建立一个实验报告文件(实验报告.txt或实验报告.doc均可),将实验步骤和程序运行结果拷贝到.txt文件或.doc文档中(可用Alt+PrtSc组合键抓屏),把每次的实验报告(.txt或.doc)和源程序(.C文件)放在学号+姓名文件夹中,上传到教师机“03/09教学班”下面对应的班级文件夹中,下机前把文件夹删除。
2.课外编程题提交到教师机“程序设计”文件夹中。
上机注意事项●运行程序时,应在英文状态下输入数据。
●上一个程序运行结束后, 要关闭工作区或VC窗口, 重新建立一个文件,输入下一个程序。
●编译时死机,将原程序窗口最小化,将程序拷贝到重新打开的VC文件中,可激活系统。
第一次实验(基本程序设计)★预习: 上机指导P4~10详细阅读上机指导P6~7, 掌握vc++6.0的使用方法。
★实验内容:(1)实验1(P5)①(p6)2. 调试修改(改错:求由键盘输入的任意两个整数的乘积。
)#include<stdio.h>void main(void){ int c;scanf(“%d,%d”,&x,&y);/**********FOUND**********/c=a*b/**********FOUND**********/printf(“The product is:%d\n”,c)}②(p7)3.完善程序(程序填空:求圆面积)#define PI 3.14159#include<stdio.h>void main(void){ float r ;double area;scanf(“%f”, &r);/**********SPACE**********/area=【?】;printf(“area=%f\n”, area);}(2)学习编程:①编写一个两个整数相乘的C程序,要求输出格式为: c=3*4=12②从键盘输入三个整数,计算并输出三个整数的平均值。
C语言实验报告(八)
1. 实验目的
本次实验的目的是进一步巩固和提高学生对C语言的理解和应用能力。
通过完成具体的实验任务,学生能够熟悉C语言的输入输出、条件结构、循环结构等基本知识,同时掌握C 语言程序设计的方法和技巧。
2. 实验环境
•操作系统:Windows 10
•开发工具:Dev-C++、Visual Studio Code
3. 实验要求与实现
3.1 实验要求
本次实验分为两个部分,每个部分都有具体的要求和实现目标。
3.1.1 部分一
编写一个C程序,实现以下功能:
•从键盘输入两个整数A和B;
•根据输入的两个整数,计算并输出以下结果:–A与B的和;
–A与B的差;
–A与B的积;
–A与B的商。
3.1.2 部分二
编写一个C程序,实现以下功能:
•从键盘输入一个整数N;
•根据输入的整数N,计算并输出以下结果:–1到N之间的所有奇数的和;
–1到N之间的所有偶数的和。
3.2 实现过程
3.2.1 部分一
首先,我们需要使用scanf函数从键盘输入两个整数A和B。
然后,我们可以使用四则运算符进行计算,并使用
printf函数输出计算结果。
以下是代码实现的示例:
```c #include <stdio.h>
int main() { int A, B; printf(。
实验一C程序的运行环境及简单程序编写一、实验目的1.了解tc2.0编译系统的基本操作方法,学会独立使用该系统。
2.了解在该系统上如何编辑、编译、连接和运行一个C程序。
3.通过运行简单的C程序,初步了解C源程序的特点。
二、实验内容1.编写一个计算球体体积的程序,要求用户自行录入球体的半径。
参考公式V=4/3πr3.。
2.编写一个程序,要求用户输入一个美金数量,然后显示出如何用最少的20美元、10美元、5美元和1美元来付款。
运行结果:Ener a dollar amount:93$20 bills:4$10 bills:1$5 bills:0$1 bills:3实验二顺序结构程序设计一、实验目的1.熟悉C语言中的基本数据类型,掌握定义常量和变量以及对它们赋值的方法,了解数据输出时所用格式转换符。
2.掌握格式输入/输出函数的用法。
3.学会简单顺序程序的设计。
4.养成良好的程序设计习惯。
二、实验内容1.编写一个程序,对用户录入的产品信息进行格式化。
Enter item number:583Enter unit price:13.5Enter purchase date(mm/dd/yyyy):3/24/2010Item Unit PurchasePrice date583 $ 13.50 3/24/20102.编写一个程序,要求用户输入一个两位数,然后按数位的逆序打印出这个数。
Enter a two-digit number:28The reversal is :82实验三选择结构程序设计一、实验目的1.熟练使用if、switch编写程序。
二、实验内容1.编写一个程序,确定一个数的位数。
Enter a number:374The number 374 has 3 digits假设输入的数最多不超过4位。
提示:利用if语句进行数的判定。
例如,如果数在0到9之间,那么位数为1;如果数在10到99之间,那么位数为2。
C语言程序设计及实验指导练习及习题参考答案(8--10) 8练习参考答案1、练习8-1.如果有定义:intm,n=5,某p=&m;与m=n等价的语句是BA.m=某p;B.某p=某&n;C.m=&n;D.m=某某p;8-2.设计一个程序计算输入的两个数的和与差,要求自定义一个函数um_diff(floatop1,floatop2,float某pum,float某pdiff),其中op1和op2是输入的两个数,某pum和某pdiff是计算得出的和与差。
解答:#includeintmain(void){floatop1,op2,um,diff;voidum_diff(floatop1,floatop2,float某pum,float某pdiff);printf(“inputop1andop2:“);canf(“%f%f”,&op1,&op2);um_d iff(op1,op2,&um,&diff);printf(“%f+%f=%f;%f-%f=%f\\n”,op1,op2,um,op1,op2,diff);return0;}voidum_diff(floatop1,floatop2,float某pum,float某pdiff){某pum=op1+op2;某pdiff=op1–op2;}8-3.两个相同类型的指针变量能不能相加?为什么?解答:不能。
因为指针变量是一种特殊的变量,指针变量的值存放的是所指向变量的地址,两个地址相加并不能保证结果为一个有效的地址值,因而在C语言中指针变量相加是非法的。
8-4.根据表8.2所示,这组数据的冒泡排序其实循环到第6遍(即n-2)时就已经排好序了,说明有时候并不一定需要n-1次循环。
请思考如何改进冒泡排序算法并编程实现(提示:当发现一遍循环后没有数据发生交换,说明已经排好序了)。
解答:设置一个标志变量flag,进入一轮循环前设置为0,在循环中有发生数据交换就改写flag值为1。
实验一1、计算整数各位数字之和(10 分)输入一个3位正整数,将其每一位的数字相加,输出和。
输入格式:输入一个3位正整数。
变量数据类型为unsigned。
输出格式:输出整数每一位相加后的整数和。
输入样例:输出样例:【参考答案】#include ""int main(){ unsigned int a,ge,shi,bai,sum;scanf("%d",&a);ge=a%10;shi=a/10%10;bai=a/100;sum=ge+shi+bai;printf("%d\n",sum);return 0;}2、计算代数表达式(10 分)求:输入格式:输入角度x。
变量数据类型为double。
π为。
输出格式:输出y的值,精确到小数点后2位。
输入样例:输出样例:【参考答案】#include <>#include <>#define PIint main(){double x,y;scanf("%lf",&x);y=sqrt((sin(60*PI/180)+1)*(sin(30*PI/180)+1)/cos(x*PI/180));printf("%.2lf",y);return 0;}3、逆序的三位数(10 分)程序每次读入一个正3位数,然后输出按位逆序的数字。
注意:当输入的数字含有结尾的0时,输出不应带有前导的0。
比如输入700,输出应该是7。
输入格式:每个测试是一个3位的正整数。
输出格式:输出按位逆序的数。
输入样例:输出样例:【参考答案】#include ""int main(){ int a,ge,shi,bai,b;scanf("%d",&a);ge=a%10;shi=a/10%10;bai=a/100;b=ge*100+10*shi+bai;printf("%d\n",b);return 0;}4、求整数均值(10 分)本题要求编写程序,计算4个整数的和与平均值。
常熟理工学院《C语言程序设计》实验指导与报告书______学年第____ 学期专业: ___________________________________________ 学号: ___________________________________________ 姓名: ___________________________________________ 实验地点:___________________________________________ 指导教师:___________________________________________计算机科学与工程学院2014实验10 指针程序设计(1)10.1 实验目的1.理解指针的概念,掌握指针变量的定义、初始化与使用方法。
2.掌握通过指针访问一维数组的编程方法。
3.掌握指针变量作为函数的形参时,参数传递的方法及特点。
4.掌握指针指向字符串的程序设计方法。
10.2 示例程序【实验10.1】在以下程序中,主函数main()调用了3个函数swap1()、swap2()和swap3(),还定义了变量a和b,程序设计的目的是要求通过函数调用,交换main()中变量a和b的值。
请分析在swap1()、swap2()和swap3()这3个函数中,哪个函数可以实现这样的功能。
程序代码:# include <stdio.h>/* swap1的形参为变量x,y,函数的功能为交换变量的值*/void swap1 (int x, int y){ int t;t= x;x = y;y = t;}/* swap2的形参为指针变量px,py,函数的功能为交换指针所指向的变量的值*/void swap2 (int *px, int *py){ int t;t = *px;*px = *py;*py = t;}/* swap3的形参为指针变量px,py,函数的功能为交换指针所指向的变量*/void swap3 (int *px, int *py){ int *pt;pt =px;px = py;py = pt;}int main (void){ int a = 1, b = 2;int *pa = &a, *pb = &b;swap1 (a, b); /* 使用变量a,b调用函数swap1() */printf ("After calling swap1: a=%d b=%d\n", a, b);a = 1;b = 2;swap2(pa, pb); /* 使用指针pa,pb调用函数swap2() */printf ("After calling swap2: a=%d b=%d\n", a, b);a = 1;b = 2;swap3(pa, pb); /* 使用指针pa,pb调用swap3() */printf ("After calling swap3: a=%d b=%d\n", a, b);return 0;}说明:1.运行该程序,分析运行结果。
2.函数swap1使用的是变量调用,也就是值调用,参数的传递是从实参变量到形参变量的单方向值的传递,形参值的改变不会影响到实参值的改变。
调用结束变量a、b的值不会改变。
3.函数swap2使用的形参是指针变量,形实结合时,指针pa指向a,pb指向b,即指针pa与变量a指向同一单元,指针pb与变量b指向同一单元。
当函数中交换了两个指针变量pa与pb所指向变量的值时,实参a与b的值同时改变。
4.函数swap3使用的形参也是指针变量,形实结合与swap2相同,所不同的是,函数中交换的是两个指针变量pa与pb的指向,即指针变量pa指向变量b,指针变量pb指向变量a,而实参变量a与b的值没有改变。
【实验10.2】本实验给出通过指针引用数组元素的各种方法。
方法一:通过下标引用数组元素#include<stdio.h>int main(){ int i,a[10];printf("Please enter 10 integer numbers:");for(i=0; i<10; i++)scanf("%d",&a[i]); /* 通过下标引用数组元素*/for(i=0; i<10; i++)printf("a[%d]=%d\n",i,a[i]);printf("\n");return 0;}方法二:通过数组名引用数组元素#include<stdio.h>#include<time.h> /* 引入头文件*/int main(){ int i, a[10];srand(time(0)); /* 改变随机数发生器的种子*/printf("The passing random numbers endows with a value for several:\n");for(i=0; i<10; i++)*(a+i)=rand()%90+10; /* 随机生成2位的数字赋给数组元素*/ for(i=0; i<10; i++)printf("a[%d]=%d\n",i,*(a+i));printf("\n");return 0;}方法三:通过指针代替数组名引用数组元素#include<stdio.h>int main(){ int i,a[10],*p;p=a;for(i=0; i<10; i++)p[i]=i; /* 变量i的值赋给数组元素*/for(i=0; i<10; i++)printf("a[%d]=%d\n",i,p[i]);printf("\n");return 0;}方法四:通过指针变量引用数组元素#include<stdio.h>int main(){ int i,a[10],*p;p=a;for(i=0; i<10; i++)*(p+i)=i;for(i=0; i<10; i++)printf("a[%d]=%d\n",i,*(p+i));printf("\n");return 0;}说明:1.以上4个例子说明,使用指针指向数组以后,可以灵活、方便地对数组元素进行处理。
事实上系统就是将数组转换为指针进行处理的。
2.如果有一个数组a,则a[i]和*(a+i)无条件等价;若有指针p指向a,则p[i]和*(p+i)也是无条件等价的,并且都可以对数组a的元素进行处理。
要熟记访问数组元素的几种等价形式。
10.3 阅读程序【实验10.3】以下程序通过指针变量p指向数组a的不同位置时,输出当前指针所指的元素。
要求在注释中写出输出结果及含义。
程序代码:#include<stdio.h>int main(){ int i, a[5]={10,11,12,13,14},*p=a;p++;printf("%d\n",*p); /* */p=a;printf("%d\n",*p++); /* */p=a;printf("%d\n",*(p++)); /* */p=a;printf("%d\n",*(++p)); /* */p=a+2;printf("%d\n",*(p--)); /* */p=&a[2];printf("%d\n",*(--p)); /* */p=a;printf("%d\n",++(*p)); /* */return 0;}10.4 完善程序【实验10.4】下面程序的功能是:调用merge函数,实现将指针s所指的字符串的反序和正序连接后形成一个新的字符串并存放在原处。
如字符串为“1234”,执行函数后,字符串为“12344321”。
请完善程序。
程序代码:#include<stdio.h>#include<string.h>int main(){ char str[100];________; /* 声明要调用的函数*/printf("Please enter a string:");gets(str);________; /* 调用函数*/printf("Inverted and connecting after:");puts(str);return 0;}void merge(char *s){ char *p,*q,n;n= ________; /* n为指针s指向的串的长度*/for(p=s+n-1,q=s+n;p>=s;p--,q++)*q=*p; /* 反序存放*/*q='\0';}说明:1.函数的形参为字符指针,调用时指针s指向字符串首地址。
2.函数中定义了指针p和q,循环开始时指针p指向串的最后一个字符,指针q指向最后一个字符后的地址,每循环一次,反序取出串的字符并依次存放到新的位置,直到处理完所有字符。
最后在新字符串的尾部放入字符串结束符'\0'。
10.5 改错程序【实验10.5】本程序的功能是:使用指针输出数组a的10个元素。
请改正程序中的错误,并调试。
注意:改错时不允许增加及删除语句,只允许修改或移动语句的位置。
【含有错误的程序代码】#include<stdio.h>int main(){ int i,a[10],*p=a;printf("Please enter 10 integer numbers:");for(i=0; i<10; i++)scanf("%d",p++);for(i=0; i<10; i++, p++)printf("%3d",*p);printf("\n");return 0;}【实验10.6】本程序的功能是:对a数组中的元素进行降序排列,存放到b数组中,要求不能改变a数组中元素的值。
算法如下:(1)每次循环,从a数组中找到一个最大值,并存放到b数组中。
(2)c数组中各元素的值为a数组中同下标元素是否存入b数组的标记,初始值为0。
(3)每次循环,将与已存入b数组的最大值对应的c数组元素赋值为1,下次不参加比较。