当前位置:文档之家› LRC校验算法C语言程序

LRC校验算法C语言程序

LRC校验算法C语言程序
LRC校验算法C语言程序

LRC校验算法C语言程序

序言

近日用到关于LRC检验算法,网上找了很多资料,其描述方式实在不敢恭维,为方便使用者特写下详细的计算过程,希望对你有所帮助。

By 厦大Jacky 20120814

LRC校验的数据发送格式

起始字符(1个字符)+数据(2n个字符)+校验值(2个字符)+结束字符(2个:回车+换行)。

LRC校验值计算

数据(2n个字符)两两组成一个16进制的数值,然后将这些数值相加,将所得加值与256求模,然后用256减去所得模值,得到的数值即为检验值(即:sum%256后取反,再加1)。

范例

发送数值:01050BE7FF0009

数值分析:-- 起始字符;01050BE7FF00 -- 数据值;09 -- 检验值;其后还有回车换行(未标出)。

数据值拆分:010********* -->0x01 0x05 0x0B 0xE7 0xFF 0x00 求和:0x01+0x05+0x0B+0xE7+0xFF+0x00 =0x01F7;

取模,取反:0x1F7%0x100=0xF7 0xF7 取反0x08

加1:0x08+1=0x09 (校验值)

C语言算法:

uchar data[17]={0x3a,0x30,0x31,0x30,0x35,

0x00,0x00,0x00,0x00,//no

0x00,0x00,0x00,0x00,//status

0x00,0x00, //LRCData

0x0d,0x0a

};

//******************************************************* ************************

// 语法格式:uchar LRC_Check(uchar *data,uchar length);

// 实现功能:LRC数据检测算法程序

// 参数:无

// 返回值:LRC检验值

//******************************************

uchar LRC_Check(uchar *data,uchar length)

{

uchar i;

uint k;

uchar result;

uchar lrcdata[length];

for(i=1;i

{

if(data[i]>0x40)

lrcdata[i-1]=data[i]-0x41+10;

else

lrcdata[i-1]=data[i]-0x30;

}

k=0;

for(i=0;i

{

k+=(lrcdata[2*i]*16+lrcdata[2*i+1]);

}

k=k%256;

k=256-k;

result=k%256;

return result;

}

C语言几种常见的排序方法

C语言几种常见的排序方法 2009-04-2219:55 插入排序是这样实现的: 首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。 从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。 重复2号步骤,直至原数列为空。 插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。 冒泡排序 冒泡排序是这样实现的: 首先将所有待排序的数字放入工作列表中。 从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。 重复2号步骤,直至再也不能交换。 冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法。 选择排序 选择排序是这样实现的: 设数组内存放了n个待排数字,数组下标从1开始,到n结束。 i=1 从数组的第i个元素开始到第n个元素,寻找最小的元素。 将上一步找到的最小元素和第i位元素交换。 如果i=n-1算法结束,否则回到第3步 选择排序的平均时间复杂度也是O(n²)的。 快速排序 现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。 堆排序 堆排序与前面的算法都不同,它是这样的: 首先新建一个空列表,作用与插入排序中的"有序列表"相同。 找到数列中最大的数字,将其加在"有序列表"的末尾,并将其从原数列中删除。 重复2号步骤,直至原数列为空。 堆排序的平均时间复杂度为nlogn,效率高(因为有堆这种数据结构以及它奇妙的特征,使得"找到数列中最大的数字"这样的操作只需要O(1)的时间复杂度,维护需要logn的时间复杂度),但是实现相对复杂(可以说是这里7种算法中比较难实现的)。

C语言调试常见错误及修改方法(附习题)

1.调试 C 程序时常见的错误类型分析 一般情况下,错误主要分为两大类:一、语法错误。对于这种错误,用编译器很容易解决。所以,改错题的第一步是先编译,解决这类语法错误。下面总结了二级C 语言上机改错题中常见的语法错误: (1) 丢失分号,或分号误写成逗号。 (2) 关键字拼写错误,如本来小写变成大写。 (3) 语句格式错误,例如for 语句中多写或者少写分号。 (4) 表达式声明错误,例如:少了() (5) 函数类型说明错误。与main ()函数中不一致。 (6) 函数形参类型声明错误。例如:少* 等。 (7) 运算符书写错误,例如:/ 写成了。二、逻辑错误,或者叫语义错误,这和实现程序功能紧密相关,一般不能用编译器发现。对于逻辑错误可以按这样的步骤进行查找。 (1) 先读试题,看清题目的功能要求。 (2) 通读程序,看懂程序中算法的实现方法。 (3) 细看程序,发现常见错误点。 2.改错题的改错方式总结,当然这些总结只能对大部分改错行有效 1、若错误行是函数首部,可分为以下几种情况: A、该行最后若有分号则删除,中间若有分号则改成逗号 B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m 个元素的指针变量,则第二维的长度必须与main 中对应数组的第二维长度相同 C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return 后变量的类型一致。 2、若错误行是if 或while 语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。 3、若错误行中有if、while 、for 则要特别注意条件表达式的错误问题: A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符 B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号 C、f or 中要用分号分隔表达式,而不是用逗号 4、语法错误 A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。 B、大小写不对,若错误行中有大写字母则一般都改成小写字母。 5、指针变量的运用,若错误行中有指针变量,并且该变量名前没有指针运算符则一般都是加上指针运算符 6、若错误行为return 语句,则首先看是否是缺少分号若是则加上分号即可;否则就是return 后的变量或表达式错误(此时可通过看题意,来分析该返回哪一变量或表达式)

C语言程序设计实验实验指导书及答案

实验一熟悉C程序运行环境 班级学号姓名成绩 一、实验目的 1. 熟悉C语言Visual C++调试环境。 2. 掌握C程序的编辑、调试及运行。 二、实验内容 项目1. 调试并运行下面程序,并写出运行结果: #include <> int main() { printf(“Good morning!\n”); printf(“Hello,world!\n”); return 0; } 运行结果(注意,按照屏幕输出格式写): 项目2. 调试并运行下面程序,并写出运行结果: #include <> int main() { int a , b , sum; /*定义变量*/ a=23; b=56; /*为变量赋值*/ sum=a+b; /*计算两个变量的和*/ printf(“sum is %d\n”,sum); /*输出计算结果*/ return 0; } 运行结果:

项目3. 调试并运行下面程序,并写出运行结果: #include <> int max(int,int); int main() { int a , b , c; /*定义变量*/ a=23; b=56; /*为变量赋值*/ c=max(a,b); /*调用max函数,将得到的值赋给c*/ printf(“max is %d\n”,c); /*输出c的值*/ return 0; } int max(int x,int y) /*定义max函数,函数值为整型*/ { int z; /*定义变量*/ if(x>y) z=x; else z=y; return(z); /*将z的值返回*/ } 运行结果: 三、提高部分 1.试想,如果求10个数中的最大者,则程序该如何编写。 程序代码 运行结果:

c语言各种排序法详细讲解

一插入排序 1.1 直接插入排序 基本思想:每次将一个待排序额记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序。 图解:

1.//直接顺序排序 2.void InsertSort(int r[], int n) 3.{ 4.for (int i=2; i

代码实现: [cpp]view plain copy 1.//希尔排序 2.void ShellSort(int r[], int n) 3.{ 4.int i; 5.int d; 6.int j; 7.for (d=n/2; d>=1; d=d/2) //以增量为d进行直接插入排序 8. { 9.for (i=d+1; i0 && r[0]

基于C语言的多种排序方法的实现

基于C语言地多种排序方法地实现 1 引言 1.1 课题背景 排序问题源远流长,一直是数学地重要组成部分.随着各种信息地快速更新,排序问题也走进了其他领域以及我们地日常生活.如何高效地排序一直困扰着我们. 1.2 课程设计目地 排序是数学地重要组成部分,工作量大是其存在地问题.如何高效地排序?本程序就是解决这个问题而设计.程序中,把数列储存在数组中,采用插入排序等十种排序方法对数组元素进行排序,高效地解决了排序问题.本软件开发地平台为最新地微软公司出版地市面最新系统Windows 2000,而且可以作为自身地运行平台非常广泛,包括 Windows 98/2000/XP/Vista等等. 1.3课程设计内容 本程序把对数列地排序转化为对数组元素地排序,用户可以根据自己地实际问题选择系统提供地七种排序方法地任意一种进行排序.程序通过自身地判断以及处理实现排序.程序最后输出每趟排序及初始排序结果. 2 系统分析与设计方案 2.1 系统分析 设计一个排序信息管理系统,使之能够操作实现以下功能: 1) 显示需要输入地排序长度及其各个关键字 2) 初始化输入地排序序列 3) 显示可供选择地操作菜单

4) 显示输出操作后地移动次数和比较次数 5) 显示操作后地新序列 5) 可实现循环继续操 2.2 设计思路 通过定义C语言顺序表来存储排序元素信息,构造相关函数,对输入地元素进行相应地处理. [2] 2.3 设计方案 设计方案如图2.1所示 图2.1 设计方案 具体流程见图2.2

图 2.2 程序流程图

3功能设计 3.1 SqList顺序表 其中包括顺序表长度,以及顺序表.源代码如下:[1] typedef struct { KeyType key。 //关键字项 InfoType otherinfo。 //其他数据项 }RedType。 typedef struct { RedType r[MaxSize+1]。 //r[0]作为监视哨 int length。 //顺序表长度 }SqList。 3.2 直接插入排序 直接插入排序是将一个记录插入到已排好序地有序表中,从而得到一个新地、记录数增1地有序表 图3.1 直接插入排序示意图 将第i个记录地关键字r[i].key顺序地与前面记录地关键字r[i-1].key,r[i-2].key,……,r[1].key进行比较,把所有关键字大于r[i].key地记录依次后移一位,直到关键字小于或者等于r[i].key地记录

c语言实现简单排序(8种方法)

#include #include //冒泡排序 voidbubleSort(int data[], int n); //快速排序 voidquickSort(int data[], int low, int high); intfindPos(int data[], int low, int high); //插入排序 voidbInsertSort(int data[], int n); //希尔排序 voidshellSort(int data[], int n); //选择排序 voidselectSort(int data[], int n); //堆排序 voidheapSort(int data[], int n); void swap(int data[], inti, int j); voidheapAdjust(int data[], inti, int n); //归并排序 voidmergeSort(int data[], int first, int last); void merge(int data[], int low, int mid, int high); //基数排序 voidradixSort(int data[], int n); intgetNumPos(intnum, intpos); int main() { int data[10] = {43, 65, 4, 23, 6, 98, 2, 65, 7, 79}; inti; printf("原先数组:"); for(i=0;i<10;i++) { printf("%d ", data[i]); } printf("\n"); /*printf("冒泡排序:"); bubleSort(data, 10); for(i=0;i<10;i++) { printf("%d ", data[i]); } printf("\n"); printf("快速排序:"); quickSort(data, 0, 9); for(i=0;i<10;i++) { printf("%d ", data[i]); } printf("\n");

c语言各种排序方法及其所耗时间比较程序

c语言各种排序方法及其所耗时间比较程序 The latest revision on November 22, 2020

#i n c l u d e #include #include #include #include const int N=1000;//数据量,用于检测算法质量 const int M=1000;//执行次数 //冒泡排序(递增) void Bubblesort(int r[],int n) { int flag=1;//flag为0停止排序 for(int i=1;i=i;j--) if(r[j]

while((ir[i]))i++; if(ileft) quicksort(r,left,i-1); if(i=0;i--) creatheap(r,i,n); for(i= n-1;i>=0;i--) { t=r[0]; r[0]=r[i]; r[i]=t; creatheap(r,0,i-1);

linux下C语言使用编译与调试试验

实验四:LINUX 下C语言使用、编译与调试实验 一、目的: 1、练习并掌握Linux提供的vi编辑器来编译C程序 2、学会利用gcc、gdb编译、调试C程序 3、学会使用make工具 二、内容 1、编写C语言程序,用gcc编译并观察编译后的结果,运行生成的可执行文件。 2、利用gdb调试程序。 3、学习编写makefile,并进行编译。 三、操作 1、文件编辑器vi 进入vi,直接执行vi编辑程序。 例:# vitest.c 显示器出现vi的编辑窗口,同时vi会将文件复制一份至缓冲区(buffer)。vi先对缓冲区的文件进行编辑,保留在磁盘中的文件则不变。编辑完成后,使用者可决定是否要取代原来旧有的文件。 1) vi的工作模式 (1)输入模式 输入以下命令即可进入vi输入模式: a 在光标之后加入资料 A 在该行之末加入资料 i 在光标之前加入资料 I 在该行之首加入资料 o 新增一行于该行之下 O 新增一行于该行之上 (2)命令模式 在输入模式下,按ESC可切换到命令模式。命令模式下,可选用下列指令离开vi::q! 离开vi,并放弃刚在缓冲区内编辑的内容 :wq 将缓冲区内的资料写入磁盘中,并离开vi ZZ 同wq :x 同wq :w 将缓冲区内的资料写入磁盘中,但并不离开vi :q 离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:w配合使用 (3)命令模式下光标的移动

h 左移一个字符 j 下移一个字符 k 上移一个字符 l 右移一个字符 0(零)移至该行的行首 $ 移至该行的行尾 ^ 移至该行的第一个字符处 H 移至窗口的第一行 M 移至窗口中间那一行 L 移至窗口的最后一行 G 移至该文件的最后一行 W, w 下一个单词(W 忽略符号) B, b 上一个单词(B 忽略符号) (4) 命令模式下的编辑命令 dd 删除当前光标所在行 yy 复制当前光标所在行 p 将复制的内容粘贴在光标所在的位置后 P 将复制的内容粘贴在光标所在的位置前 x 删除当前光标字符 X 删除当前光标之前字符 u 撤消 ·重做 2、GNU C编译器 1) 使用gcc 通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下: gcc [options] [] 命令行选项指定的编译过程中的具体操作 2) gcc常用选项 当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。 选项含义: -o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE 没有指定,默认文件名是a.out. 例如,

C语言几种排序方法程序

下面是几种排序方法的程序: 1.交换排序 #include #include int main(void) { int a[10] = {1,4,3,0,7,5,2,8,9,6}; int i = 0, j = 0; int temp = 0; for(i = 0; i< 9; i++) { for(j = i+1; j<10; j++) { if(a[i]>a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } } } for(i = 0; i<10; i++) { printf("%d\t", a[i]); if((i+1)%5 == 0) printf("\n"); } // printf("\n"); return 0; } 2.插入排序 #include #include int main(void) { int a[9] = {5,8,3,9,2,0,4,7,10}; int temp = 0, i = 0, j = 0, z=0; for(i=0; i<9; i++)

{ for(j=i+1; j<9; j++) { if(a[j] < a[i]) { temp = a[j]; for(z = j-1; z >= i; z--) { a[z+1] = a[z]; } a[i] = temp; } } } for(i = 0; i<9; i++) { printf("%d\t", a[i]); if((i+1)%5 == 0) printf("\n"); } printf("\n"); return 0; } 3.归并 #include #include int merge(int *a, int begin, int end) { int *c = NULL; int i = 0; int x = 0, y = 0; int mid = 0; mid = (begin+end)/2; x = begin; y = mid+1; c = (int *)malloc((end+1)*4); if(c == NULL) return 0; for(i = begin; i<(end+1); i++) {

C语言程序的创建与调试

目录 ?创建一个新的C语言的工程(查看) ?添加一个文件到一个空的工程中(查看) ?编写程序(查看) ?运行程序(查看) ?调试程序-设置断点(查看) ?调试程序-动态察看变量的值(查看) 创建一个新的C语言的工程 第一步,启动Microsoft Visual C++6.0 启动VC可以通过“开始”菜单,也可以通过桌面快捷方式,或者Quick Launch工具栏等方式。

启动之后,我们看到的是空白的VC开发环境。虽然上面的截图是英文版的VC,但是其中的菜单、窗口都和中文版的一一对应。 跟大多数的Windows应用程序一样,VC最上面是菜单,然后是工具栏,中央是工作区,最下面一行是状态栏。我们现在看到的工作区,左边是Workspace 窗口,右边是灰底的空白窗口。 第二步,创建一个工程 在VC中,一个源程序文件必须属于一个工程;所以我们首先来创建一个工程。

选择菜单: File -->New... 打开下面窗口: 在Projects Tab 页面中,我们看到可以创建许多种类型的工程;并且可以指定工程的名字,和存储位置。 事实上如果要开发简单的C 语言程序,我们只需要创建一种工程:Win32 Console Application,也就是Windows 32控制台程序,或者俗称“黑屏”程序。我们进行如下设置:顺序 选项操作说明1工程类型选择"Win32Console Application" 2Location C:\TEST\ 作为例子,我们暂且把该演示程序保存在C 盘根目录下面的TEST 文件夹中。如果该文 件夹不存在,您需要首先创建它。 该选项不需要手工输入,您可以单击在 “Locaction”右下方的“...”按钮, 来选择该文件夹。 注意: 虽然上面的截屏上显示的是 "C:\Test\DemoQuestion",但那是完成了第

上海理工大学c语言程序调试题复习.docx

5月17日程序调试题复习 1.程序调试题1 调试要求:下列程序包含3个错误,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*******/字样的注释),使其运行能得到正确的结果。将结果(包括C_2_1.C文件和 C_2_1.EXE文件)保存到实验结果文件夹屮。 功能说明:程序从键盘输入5个字符串(每个字符串长度不超过80,且字符串屮不含有空格),程序找出其中最大的字符串放到max中,最后输出该最大的字符串。 如输入: BASIC Java C++ Pascal PHP 则输出:Pascal 带错误原程序(见素材\C_2_1.C): #include #include int main() { int i; char s[81], max[81]={'\0'}; for (i=0; i<5; i++) { gets(s); if (strcmp(s,max)) strcpy(max,s); } puts(max); getchar(); /*木句无错;暂停程序,按任意键继续*/ } 2.程序调试题2 调试要求:下列程序包含3个错误,请按题屮的功能要求,调试并修改该程序(在所修改语句后加/****?**/字样的注释),使其运行能得到正确的结果。将结果(包括C_2_2.C文件和 C_2_2.EXE文件)保存到实验结果文件夹中。 功能说明:函数aver的功能是计算n个整数去掉一个最大值和一个最小值后的平均值,程序 从键盘输入8个整数,通过调用函数aver计算这8个整数去掉一个最大值和一个最小值后的平均值,然后输出(保留一位小数)。 如输入:1 2345678 则输出:average=4.5 带错误原程序(见素材\C_2_2.C): #inelude

基于C语言的多种排序方法的实现

基于C语言的多种排序方法的实现

《基于C 语言的多种排序方法的实现》第 1 页共30页基于C语言的多种排序方法的实现 1 引言 1.1 课题背景 排序问题源远流长,一直是数学地重要组成部分。随着各种信息的快速更新,排序问题也走进了其他领域以及我们地日常生活。如何高效地排序一直困扰着我们。 1.2 课程设计目的 排序是数学的重要组成部分,工作量大是其存在的问题。如何高效地排序?本程序就是解决这个问题而设计。程序中,把数列储存在数组中,采用插入排序等十种排序方法对数组元素进行排序,高效地解决了排序问题。本软件开发的平台为最新的微软公司出版的市面最新系统Windows 2000,而且可以作为自身的运行平台非常广泛,包括Windows 98/2000/XP/Vista等等。 1.3课程设计内容 本程序把对数列的排序转化为对数组元素的排序,用户可以根据自己的实际问题选择系统提供的七种排序方法的任意一种进行排序。程序通过自身的判断以及处理实现排序。程序最后输出每趟排序及初始排序结果。

2 系统分析与设计方案 2.1 系统分析 设计一个排序信息管理系统,使之能够操作实现以下功能: 1) 显示需要输入的排序长度及其各个关键字 2) 初始化输入的排序序列 3) 显示可供选择的操作菜单 4) 显示输出操作后的移动次数和比较次数 5) 显示操作后的新序列 5) 可实现循环继续操 2.2 设计思路 通过定义C语言顺序表来存储排序元素信息,构造相关函数,对输入的元素进行相应的处理。[2] 2.3设计方案 设计方案如图2.1所示 图2.1 设计方案

具体流程见图2.2

VC++6.0中如何能编译运行及调试C语言程序

VC++6.0中如何编译运行调试C语言程序1.启动VC++6.0 (如下图) 2.单个源文件的编译运行 例如下面的源代码 #include void main() { int i,sum=0; for(i=1;i<=10;i++) { sum=sum+i; } printf("sum=%d\n",sum); }

打开VC++6.0,如图1所示 (图1)选择“文件”→“新建”,打开如图2所示 (图2)

选择“文件”项,如图3所示 (图3) 选择“C++ Source File”项,并在“文件名”项目下输入“sum.c”如图4所示 (图4)

单击“确定”,打开如图5所示 (图5) 输入如上源代码,如图6所示 (图6) 选择按编译按钮调试程序,看看有没有错误,有的话改正,没有的话就可以再按连接按钮检查连接(多文件工程时常用,检查文件间是否正常连接)。

(图7) 在下端的输出窗口会有错误和警告的提示,如果没有错误选择“执行”(或按Ctrl+F5组合键)即可出现运行结果,如图8所示 (图8)

3.多个源文件的编译运行 以上是运行单个源文件的情况,但是在程序设计时,往往是由几个人各自独立编写不同的程序,显然这些程序是不能写在一起进行编译的,这时就需要建立项目工作区来完成几个独立程序的编译,具体方法如下。 首先建立两个文本文件,分别命名为“file1.c”和“file.c”,分别在两个文件中输入如下两个源代码,然后保存。 源代码1: #include void main() { void sum(); sum(); } 源代码2: #include void sum() { int i,sum=0; for(i=1;i<=10;i++) { sum=sum+i; } printf("sum=%d\n",sum); } 打开VC++6.0,选择“文件”→“新建”打开如图9所示

c语言版5种排序方法

冒泡排序: #include void Bubblesort(int *a,int n); void main() { int i; int a[]={8,7,6,5,4,3,2}; Bubblesort(a,7); for (i=0;i<7;i++) printf("%d\n",a[i]); } void Bubblesort(int *a,int n) { int i,j,temp; for(i=0;ia[j+1]) //进行两两比较,进行交换,沉下重的数 { temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } 插入排序: #include void insertsort(int *a,int n); void main() { int i; int a[]={8,7,6,5,4,3,2}; insertsort(a,7);

for (i=0;i<7;i++) printf("%d\n",a[i]); } void insertsort(int *a,int n) { int i,j,temp; for(i=1;i=0&&temp #include void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex); void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex); void main() { int i, b[7]; int a[]={8,7,6,5,4,3,2}; MergeSort(a, b, 0, 6); for (i=0;i<7;i++) printf("%d\n",a[i]); }

上海理工大学c语言程序调试题复习

5月17日程序调试题复习 1. 程序调试题1 调试要求:下列程序包含3个错误,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*******/字样的注释),使其运行能得到正确的结果。将结果(包括C_2_1.C文件和C_2_1.EXE文件)保存到实验结果文件夹中。 功能说明:程序从键盘输入5个字符串(每个字符串长度不超过80,且字符串中不含有空格),程序找出其中最大的字符串放到max中,最后输出该最大的字符串。 如输入: BASIC Java C++ Pascal PHP 则输出:Pascal 带错误原程序(见素材\C_2_1.C): #include #include int main() { int i; char s[81], max[81]={'\0'}; for (i=0; i<5; i++) { gets(s); if (strcmp(s,max)) strcpy(max,s); } puts(max); getchar(); /*本句无错;暂停程序,按任意键继续 */ }

2. 程序调试题2 调试要求:下列程序包含3个错误,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*******/字样的注释),使其运行能得到正确的结果。将结果(包括C_2_2.C文件和C_2_2.EXE文件)保存到实验结果文件夹中。 功能说明:函数aver的功能是计算n个整数去掉一个最大值和一个最小值后的平均值,程序从键盘输入8个整数,通过调用函数aver计算这8个整数去掉一个最大值和一个最小值后的平均值,然后输出(保留一位小数)。 如输入:1 2 3 4 5 6 7 8则输出:average=4.5 带错误原程序(见素材\C_2_2.C): #include float aver(int *a, int n) { int i, max, min; float s; s=max=min=a[0]; for (i=0; imax) max=a[i]; if (a[i]>min) min=a[i]; } return (s-max-min)/(n-2); } int main() { int b[8], i; for (i=0; i<8; i++) scanf("%d", b+i); printf("average=%.1f\n", aver(*b,8)); getchar(); /*本句无错;暂停程序,按任意键继续 */ } 3. 程序调试题3

c语言经典排序算法(8种-含源代码)

天行健,君子以自强不息 常见经典排序算法 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序 一.希尔(Shell)排序法(又称宿小增量排序,是1959年由D.L.Shell提出来的) /* Shell 排序法 */ #include void sort(int v[],int n) { int gap,i,j,temp; for(gap=n/2;gap>0;gap /= 2) /* 设置排序的步长,步长gap每次减半,直到减到1 */ { for(i=gap;i= 0) && (v[j] > v[j+gap]);j -= gap ) /* 比较相距gap远的两个元素的大小,根据排序方向决定如何调换 */ { temp=v[j]; v[j]=v[j+gap]; v[j+gap]=temp; } } } } 二.二分插入法

/* 二分插入法 */ void HalfInsertSort(int a[], int len) { int i, j,temp; int low, high, mid; for (i=1; i temp) /* 如果中间元素比但前元素大,当前元素要插入到中间元素的左侧 */ { high = mid-1; } else /* 如果中间元素比当前元素小,但前元素要插入到中间元素的右侧 */ { low = mid+1; } } /* 找到当前元素的位置,在low和high之间 */ for (j=i-1; j>high; j--)/* 元素后移 */ { a[j+1] = a[j]; } a[high+1] = temp; /* 插入 */ } } 三.直接插入法 /*直接插入法*/ void InsertionSort(int input[],int len) { int i,j,temp; for (i = 1; i < len; i++) { temp = input[i]; /* 操作当前元素,先保存在其它变量中 */

C语言程序调试方法.

所谓程序调试是指对程序的查错和排错。 调试程序一般应经过以下几个步骤: 一、先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。 为了更有效地进行人工检查,所编的程序应力求做到以下几点: ①应当采用结构化程序方法编程,以增加可读性; ②尽可能多加注释,以帮助理解每段程序的作用; ③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。 二、在人工检查无误后,再上机调试。 通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。 如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。 三、在改正语法错误(包括“错误(error)”和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程ax2+bx+c=0,输入a、b、c的值分别为1、-2、1时,根x的值是1。这是容易判断的,若根不等于1,程序显然有错。但是,用“试验数据”时,程序运行结果正确,还不能保证程序完全正确。因为有可能输入另一组数据时运行结果不对。例如,用公式

C语言程序调试方法

C语言程序调试方法 所谓程序调试是指对程序的查错和排错。 调试程序一般应经过以下几个步骤: 一、先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。 为了更有效地进行人工检查,所编的程序应力求做到以下几点: ①应当采用结构化程序方法编程,以增加可读性; ②尽可能多加注释,以帮助理解每段程序的作用; ③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。 二、在人工检查无误后,再上机调试。 通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。 如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。 三、在改正语法错误(包括“错误(error)”和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程ax2+bx+c=0,输入a、b、c的值分别为1、-2、1时,根x的值是1。这是容易判断的,若根不等于1,程序显然有错。

C语言上机程序调试功能键及常见错误提示

C语言上机程序调试功能键及常见错误提示1.常用健 : 激活系统菜单 : 将光标在编辑窗口和、信息窗口之间切换 : 加载一个文件 + : 查看程序运行结果 : 得到有关编辑器在线帮助 + : 得到有关C语言的在线帮助 + : 终止正在运行的程序 2.块操作 KB: 定义块首 KK: 定义块尾 KV: 块移动 KC: 块复制 KY: 块删除 KH: 取消块定义 3.查找、替换和删除操作 QF: 查找字符串 QA: 查找并替换字符串 Option: G(全程), B(向文件头), N(直接替换) Y : 删除一行 QY: 删除从光标位置到行末的所有字符 4.编译中的常见错误 (1)警告类错误 ?‘XXX’declare but never used变量XXX已定义但从未用过。 ?‘XXX’is ass igned a value which is never used变量XXX已赋值但从未用过。 ?Code has no effect 程序中含有没有实际作用的代码。 ?Non-portable pointer conversion不适当的指针转换,可能是在应该使用指 针的地方用了一个非0的数值。 ?Possible use of ‘XXX’before definition表达式中使用了未赋值的变量?Redeclaration of ‘main’一个程序文件中主函数main不止一个。 ?Suspicious pointer conversion可疑的指针转换。通常是使用了基本类型不匹配的指针。 ?Unreachable code程序含有不能执行到的代码。 (2)错误或致命错误 ?Compound statement missing } in function main程序结尾缺少括号}。 ?“}”expected;“(”expected等复合语句或数组初始化的结尾缺少“)”;“(”。 ? Case outside of switch case不属于Switch结构,多由于switch结构中的 花括号不配对所致。 ?Case statement missing ‘:’ switch结构中的某个case之后缺少冒号。

相关主题
文本预览
相关文档 最新文档