重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如果连续函数在给定区间不单调,很有可能中值*下界值和中值*上界值都大于0,那么会跳出认为没有根,而事实上很有可能这个中值点靠近函数极点。而真正用二分法求给定区间的思路是:首先为函数求导,算出导函数的零点,然后再判断零点性质,最后将函数区间分为单调递增和单调递减间隔的形式,对每一段进行二分法求根。
专注于为中小企业提供网站设计制作、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业闽清免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了近1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
#include stdio.h
#include math.h
#define DEFAULT_UPPER (10)
#define DEFAULT_LOWER (-10)
#define DEFAULT_E (0.00000001)
#define _MID(x,y) ((x+y)/2)
#define _VALUE(x) (2*x*x*x-4*x*x+3*x-6)
double _e;
int getRoot(double lower, double upper, double *result);
main()
{
double root;
printf("Enter a deviation:");
scanf("%lf", _e);
if(_e == 0.0)
_e = DEFAULT_E;
if(getRoot(DEFAULT_LOWER, DEFAULT_UPPER, root))
printf("Root:%2.8lf\n", root);
else
printf("Root:No Solution.\n");
}
int getRoot(double lower, double upper, double *result)
{
*result = _MID(lower,upper);
if(upper - lower = _e)
return 1;
if(_VALUE(lower)*_VALUE(*result) = 0)
return getRoot(lower, *result, result);
else if(_VALUE(*result)*_VALUE(upper) = 0)
return getRoot(*result, upper, result);
else
return 0;
}
那就得看有没有传入参数
/*1.无参函数的定义:如果函数不接收用户传递的数据,那么定义时可以不带参数,既是不用
添加参数列表。*/
#include stdio.h
int sum()
{
int i, sum=0;
for(i=1; i=100; i++){
sum+=i;
}
return sum;
}
int main()
{
int a = sum();
printf("The sum is %d\n", a);
return 0;
}
/*2.有参函数的定义:如果函数需要接收用户传递的数据,那么定义时就要带参数,就是得加
参数列表*/
#include stdio.h
int max(int a, int b)
{
if (ab)
{
return a;
}
else
{
return b;
}
}
int main(){
int num1, num2, maxVal;
printf("Input two numbers: ");
scanf("%d %d", num1, num2);
maxVal = max(num1, num2);
printf("The max number: %d\n", maxVal);
return 0;
}
最后附上
函数定义的一般格式为:
返回值类型 函数名 (参数列表)
{
声明
语句
}
这是一个加密字符串的程序。
首先来分析这个程序的几个函数:
1.int gcd(int a ,int b);函数
从函数名就能看出这个函数是用来计算a和b的最大公约数的。该函数计算最大公约数的方法很简单,就是穷举1到min(a,b)的数,找出最大的约数。如果楼主对求最大公约数感兴趣可以搜搜“辗转相除法”
2.int encrypt(int m,int k1,int k2);
从函数名也能看出这个函数的用途,就是加密(encrypt)。该加密采用字符映射的方法,将m经过线性运算(a1*m+a2)的结果映射成0-26中的一个数字。%是取模运算,加密算法或HASH算法中最常用的非线性运算符,楼主感兴趣可以搜索“HASH”、“模运算”
3.main函数
main函数的第一个for循环是初始化字符数组m和c的过程,将m和c中的内容都手动赋值为0。
接下来是分别请求用户输入待加密字符串m和加密密钥key1和key2的语句,非常简单,不需多解释。
在接下来的while循环语句是验证key1和key2是否满足加密要求,如果不满足则会要求用户再次输入key1和key2,直至满足要求为止。为什么要对key1和key2有要求呢?因为这个算法采用的是字符映射的方法加密,如果key1和key2都是26的倍数,那么该程序就相当于没有加密效果,举例说明,如果要加密的算法是某一个字符是w,根据加密函数可知w会被映射成下面这个东西:
(w*key1+key2)%26 == (w*key1)%26 + key2%26 == w + 0 == w
所以说根本就没有加密效果。(虽然程序中未对key2进行检查,但key2的影响也是很大的)
最后一个for循环就是具体的加密过程,循环对字符串中的每一个字符进行加密,先用encrypt函数将字符串映射成0-26中的一个数字(很容易看出来这代表26个字母),然后再加上ASCII码'a'(即90),的到最后的结果。
以加密helloworld为例,密钥为123和321,结果看截图:
long
f1(int
p)
//定义了一个函数f1
{
int
k;
//定义整形变量
long
r;
//定义长整型变量
long
f2(int
q);
定义了函数f2
k=p*p;
k等于p的平方
r=f2(k);
调用函数f2,并且传过去参数k
return
r;
返回值为r
}
long
f2(int
q)
定义后面带参数q的函数f2
{
long
c=1;
//定义了长整型变量,并给赋值
int
i;
//定义整型变量
for(i=1;i=q;i++)
从i=1开始循环,每循环一次i就加1,知道循环到i等于q的时候退出循环
c=c*i;
//这是一个累乘的过程,每循环一次都把i的值乘到c中
return
c;
//c是返回值
}
main()
主函数
{
int
i;
定义了一个整型变量
long
s=0;
长整型变量并赋值0
for
(i=2;i=3;i++)
从i=2
开始循环,到i=3时结束
s=s+f1(i);
调用函数f1(i)
其中i是参数
printf("\ns=%ld\n",s);
输出s
代码如下:
头文件:
2_1.h
#ifndef _2_1_H
#define _2_1_H
typedef void SeqList;
typedef void SeqListNode;
//创建线性表
SeqList * SeqList_Create(int capacity);
//销毁线性表
void SeqList_DesTroy(SeqList * list);
void SeqList_Clear(SeqList* list);
int SeqList_Length(SeqList* list);
int SeqList_Capacity(SeqList* list);
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
SeqListNode* SeqList_Get(SeqList* list, int pos);
SeqListNode* SeqList_Delete(SeqList* list, int pos);
#endif
源文件:
// 顺序线性表.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include malloc.h
#include stdlib.h
#include "2_1.h"
typedef unsigned int TSeqListNode;
typedef struct {
int len; //长度
int capacity;//总长度
TSeqListNode * node;//每个节点的指针
} TSeqList;
int main()
{
SeqList* list = SeqList_Create(5);//创建线性表
int i = 6;//赋值6个变量,已超过线性表最大值 5
int j = 1;
int k = 2;
int x = 3;
int y = 4;
int z = 5;
int index = 0;
SeqList_Insert(list, i, 7); //将这6个变量插入线性表中
SeqList_Insert(list, j, 0);
SeqList_Insert(list, k, 0);
SeqList_Insert(list, x, 0);
SeqList_Insert(list, y, 0);
SeqList_Insert(list, z, 0);
//遍历
for(index=0; indexSeqList_Length(list); index++)
{
int* p = (int*)SeqList_Get(list, index);
printf("%d ", *p);
}
printf("\n");
//删除操作
while( SeqList_Length(list) 0 )
{
int* p = (int*)SeqList_Delete(list, 0);
printf("删除了: %d\n", *p);
}
SeqList_Clear(list);
SeqList_DesTroy(list);
system("pause");
return 0;
}
//创建线性表
SeqList * SeqList_Create(int capacity)
{
TSeqList* ret = NULL ;
if(capacity = 0)
{
ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity); //为线性表分配空间,包含结 //构体和节点的总大小
}
if(NULL != ret)
{
ret-len = 0;
ret-capacity = capacity;
ret-node = (TSeqListNode*)(ret + 1);//将节点指向上述分配到的空间的后部分
}
return ret;
}
//销毁
void SeqList_DesTroy(SeqList * list)
{
free(list);
}
//清空
void SeqList_Clear(SeqList* list)
{
TSeqList * ret = (TSeqList*)list;
if(NULL != ret)
{
ret-len = 0;
}
}
//获得线性表的长度
int SeqList_Length(SeqList* list)
{
TSeqList * ret = (TSeqList*)list;
int len = -1;
if(NULL != ret)
{
len = ret-len;
}
return len;
}
//线性表的总长度
int SeqList_Capacity(SeqList* list)
{
TSeqList * ret = (TSeqList*)list;
int capacity = -1;
if(NULL != ret)
{
ret-capacity = capacity;
}
return capacity;
}
//插入
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
TSeqList * sList = (TSeqList*)list;
int i,ret = -1;
if((sList != NULL) (pos = 0) sList-capacity = sList-len+1)
{
if(pos = sList-len)
{
pos = sList-len;
}
for(i = sList-len; i pos; i--)
{
sList-node[i] = sList-node[i-1];
}
sList-node[i] = (TSeqListNode)node;
++sList-len;
ret = 1;
}
return ret;
}
//获得指定位置的节点
SeqListNode* SeqList_Get(SeqList* list, int pos)
{
TSeqList * sList = (TSeqList*)list;
TSeqListNode* node = NULL;
if(NULL != sList pos=0 pos sList-len)
{
node = (TSeqListNode*)sList-node[pos];
}
return node;
}
//删除
SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
TSeqList * sList = (TSeqList*)list;
SeqListNode * node = SeqList_Get( list, pos);
int i;
if(sList != NULL pos = 0 pos sList-len)
{
for( i=pos+1; isList-len; i++)
{
sList-node[i-1] = sList-node[i];
}
sList-len--;
}
return node;
}
演示:
资料拓展:
线性表是最基本、最简单、也是最常用的一种数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。
我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。
在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。
线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。