如果連續(xù)函數(shù)在給定區(qū)間不單調(diào),很有可能中值*下界值和中值*上界值都大于0,那么會跳出認為沒有根,而事實上很有可能這個中值點靠近函數(shù)極點。而真正用二分法求給定區(qū)間的思路是:首先為函數(shù)求導,算出導函數(shù)的零點,然后再判斷零點性質(zhì),最后將函數(shù)區(qū)間分為單調(diào)遞增和單調(diào)遞減間隔的形式,對每一段進行二分法求根。
專注于為中小企業(yè)提供網(wǎng)站設計制作、網(wǎng)站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)閩清免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了近1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
#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;
}
那就得看有沒有傳入?yún)?shù)
/*1.無參函數(shù)的定義:如果函數(shù)不接收用戶傳遞的數(shù)據(jù),那么定義時可以不帶參數(shù),既是不用
添加參數(shù)列表。*/
#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.有參函數(shù)的定義:如果函數(shù)需要接收用戶傳遞的數(shù)據(jù),那么定義時就要帶參數(shù),就是得加
參數(shù)列表*/
#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;
}
最后附上
函數(shù)定義的一般格式為:
返回值類型 函數(shù)名 (參數(shù)列表)
{
聲明
語句
}
這是一個加密字符串的程序。
首先來分析這個程序的幾個函數(shù):
1.int?gcd(int?a?,int?b);函數(shù)
從函數(shù)名就能看出這個函數(shù)是用來計算a和b的最大公約數(shù)的。該函數(shù)計算最大公約數(shù)的方法很簡單,就是窮舉1到min(a,b)的數(shù),找出最大的約數(shù)。如果樓主對求最大公約數(shù)感興趣可以搜搜“輾轉(zhuǎn)相除法”
2.int?encrypt(int?m,int?k1,int?k2);
從函數(shù)名也能看出這個函數(shù)的用途,就是加密(encrypt)。該加密采用字符映射的方法,將m經(jīng)過線性運算(a1*m+a2)的結果映射成0-26中的一個數(shù)字。%是取模運算,加密算法或HASH算法中最常用的非線性運算符,樓主感興趣可以搜索“HASH”、“模運算”
3.main函數(shù)
main函數(shù)的第一個for循環(huán)是初始化字符數(shù)組m和c的過程,將m和c中的內(nèi)容都手動賦值為0。
接下來是分別請求用戶輸入待加密字符串m和加密密鑰key1和key2的語句,非常簡單,不需多解釋。
在接下來的while循環(huán)語句是驗證key1和key2是否滿足加密要求,如果不滿足則會要求用戶再次輸入key1和key2,直至滿足要求為止。為什么要對key1和key2有要求呢?因為這個算法采用的是字符映射的方法加密,如果key1和key2都是26的倍數(shù),那么該程序就相當于沒有加密效果,舉例說明,如果要加密的算法是某一個字符是w,根據(jù)加密函數(shù)可知w會被映射成下面這個東西:
(w*key1+key2)%26?==?(w*key1)%26?+?key2%26??==??w?+?0??==?w
所以說根本就沒有加密效果。(雖然程序中未對key2進行檢查,但key2的影響也是很大的)
最后一個for循環(huán)就是具體的加密過程,循環(huán)對字符串中的每一個字符進行加密,先用encrypt函數(shù)將字符串映射成0-26中的一個數(shù)字(很容易看出來這代表26個字母),然后再加上ASCII碼'a'(即90),的到最后的結果。
以加密helloworld為例,密鑰為123和321,結果看截圖:
long
f1(int
p)
//定義了一個函數(shù)f1
{
int
k;
//定義整形變量
long
r;
//定義長整型變量
long
f2(int
q);
定義了函數(shù)f2
k=p*p;
k等于p的平方
r=f2(k);
調(diào)用函數(shù)f2,并且傳過去參數(shù)k
return
r;
返回值為r
}
long
f2(int
q)
定義后面帶參數(shù)q的函數(shù)f2
{
long
c=1;
//定義了長整型變量,并給賦值
int
i;
//定義整型變量
for(i=1;i=q;i++)
從i=1開始循環(huán),每循環(huán)一次i就加1,知道循環(huán)到i等于q的時候退出循環(huán)
c=c*i;
//這是一個累乘的過程,每循環(huán)一次都把i的值乘到c中
return
c;
//c是返回值
}
main()
主函數(shù)
{
int
i;
定義了一個整型變量
long
s=0;
長整型變量并賦值0
for
(i=2;i=3;i++)
從i=2
開始循環(huán),到i=3時結束
s=s+f1(i);
調(diào)用函數(shù)f1(i)
其中i是參數(shù)
printf("\ns=%ld\n",s);
輸出s
代碼如下:
頭文件:
2_1.h
#ifndef? _2_1_H
#define? _2_1_H
typedef void SeqList;
typedef void SeqListNode;
//創(chuàng)建線性表
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;//每個節(jié)點的指針
} TSeqList;
int main()
{
SeqList* list = SeqList_Create(5);//創(chuàng)建線性表
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;
}
//創(chuàng)建線性表
SeqList * SeqList_Create(int capacity)
{
TSeqList* ret = NULL ;
if(capacity = 0)
{
ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity);? //為線性表分配空間,包含結 //構體和節(jié)點的總大小
}
if(NULL != ret)
{
ret-len = 0;
ret-capacity = capacity;
ret-node = (TSeqListNode*)(ret + 1);//將節(jié)點指向上述分配到的空間的后部分
}
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;
}
//獲得指定位置的節(jié)點
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;
}
演示:
資料拓展:
線性表是最基本、最簡單、也是最常用的一種數(shù)據(jù)結構。
線性表中數(shù)據(jù)元素之間的關系是一對一的關系,即除了第一個和最后一個數(shù)據(jù)元素之外,其它數(shù)據(jù)元素都是首尾相接的(注意,這句話只適用大部分線性表,而不是全部。比如,循環(huán)鏈表邏輯層次上也是一種線性表(存儲層次上屬于鏈式存儲),但是把最后一個數(shù)據(jù)元素的尾指針指向了首位結點)。
我們說“線性”和“非線性”,只在邏輯層次上討論,而不考慮存儲層次,所以雙向鏈表和循環(huán)鏈表依舊是線性表。
在數(shù)據(jù)結構邏輯層次上細分,線性表可分為一般線性表和受限線性表。一般線性表也就是我們通常所說的“線性表”,可以自由的刪除或添加結點。受限線性表主要包括棧和隊列,受限表示對結點的操作受限制。
線性表的邏輯結構簡單,便于實現(xiàn)和操作。因此,線性表這種數(shù)據(jù)結構在實際應用中是廣泛采用的一種數(shù)據(jù)結構。