1. C語言中的函數不可以單獨進行編譯。這句話為什麼不對
C語言中的函數可以單獨進行編譯,編譯為目標文件,要鏈接成可執行文件時,需要主函數以及庫。
2. 下面的程序有什麼問題,為什麼函數單獨編譯的時候能通過,二整體通不過
不知道你的"二整體通不過"是什麼意思.可能原因:沒有聲明函數.
在主函數里聲明一下:
main()
{
float a, b,c,d,e;
float f,g,h,i,j;
float fun0( float a,float b,float c,float d,float e);
float fun1( float a,float b,float c,float d,float e);
float fun2( float a,float b,float c,float d,float e);
float fun4( float a,float b,float c,float d,float e,float g);
....
}
其他沒怎麼看,你的代碼重復過多.可以精簡一下的.
3. 寫了一段代碼函數,能通過編譯但結果不對,看了好久都沒找出錯誤,求大牛指出。
較的,查找效率依賴比較次數,其實理想的查找希望不經比較,一次存取便能得到所查記錄,那就必須在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關系f,這樣查找k時,只要根據這個對應關系f找到給定值k的像f(k)。這種對應關系f叫哈希(hash)函數。按這種思想建立的表叫哈希表(也叫散列表)。哈希表存取方便但存儲時容易沖突(collision):即不同的關鍵字可以對應同一哈希地址。如何確定哈希函數和解決沖突是關鍵。
1.哈希函數的構造方法
直接定址法:H(k)=k 或H(k)=a*k+b(線形函數)
如:人口數字統計表
地址 1 2 3 ... 100
年齡 1 2 3 ... 100
人數 67 3533 244 ... 4
數字分析法:取關鍵字的若干數位組成哈希地址
如:關鍵字如下:若哈希表長為100則可取中間兩位10進制數作為哈希地址。
81346532 81372242 81387422 81301367 81322817 81338967 81354157 81368537
平方取中法:關鍵字平方後取中間幾位數組成哈希地址
折疊法:將關鍵數字分割成位數相同的幾部分(最後一部分的位數可以不同)然後取幾部分的疊加和(捨去進位)作為哈希地址。
除留余數法:取關鍵字被某個不大於表長m的數p除後所得的余數為哈希地址。
H(k)=k mod p p<=m
隨機數法:H(k)=rondom(k)。
2.處理沖突的方法
假設地址集為0..n-1,由關鍵字得到的哈希地址為j(0<=j<=n-1)的位置已存有記錄,處理沖突就是為該關鍵字的記錄找到另一個"空"的哈希地址。在處理中可能得到一個地址序列Hi i=1,2,...k
0<=Hi<=n-1),即在處理沖突時若得到的另一個哈希地址H1仍發生沖突,再求下一地址H2,若仍沖突,再求H3...。怎樣得到Hi呢?
開放定址法:Hi=(H(k)+di) mod m (H(k)為哈希函數;m為哈希表長;di為增量序列)
當di=1,2,3,... m-1 時叫線性探測再散列。
當di=12,-12,22,-22,32,-32,...,k2,-k2時叫二次探測再散列。
當di=random(m)時叫偽隨機探測序列。
例:長度為11的哈希表關鍵字分別為17,60,29,哈希函數為H(k)=k mod 11,第四個記錄的關鍵字為38,分別按上述方法添入哈希表的地址為8,4,3(隨機數=9)。
再哈希法:Hi=RHi(key) i=1,2,...,k,其中RHi均為不同的哈希函數。
鏈地址法:這種方法很象基數排序,相同的地址的關鍵字值均鏈入對應的鏈表中。
建立公益區法:另設一個溢出表,不管得到的哈希地址如何,一旦發生沖突,都填入溢出表。
3.哈希表的查找
例:如下一組關鍵字按哈希函數H(k)=k mod 13和線性探測處理沖突所得的哈希表a[0..15]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
14 01 68 27 55 19 20 84 79 23 11 10
當給定值k=84,則首先和a[6]比在依次和a[7],a[8]比結果a[8]=84查找成功。
當給定值k=38,則首先和a[12]比,再和a[13]比,由於a[13]沒有,查找不成功,表中不存在關鍵字等於38的記錄。
5.5 查找第k小元素
查找第k小元素即在n個元素中(未排序)找到第k小的元素。方法同快速排序,採用遞歸方式。
程序如下:
program kspv;
const n=7;
type
arr=array[1..n] of integer;
var
b:arr;
i,k:integer;
function p(s,t:integer):integer;
var i,j,t1,x:integer;
begin
i:=s;j:=t;x:=b[i];
repeat
while (b[j]>=x) and (j>i) do j:=j-1;
if j>i then begin t1:=b[i]; b[i]:=b[j];b[j]:=t1;end;
while (b[i]<=x) and (i<j) do i:=i+1;
if i<j then begin t1:=b[j];b[j]:=b[i];b[i]:=t1; end
until i=j;
b[i]:=x;
p:=i;
end;
function find(s,t,k:integer):integer;
var p1,q:integer;
begin
if s=t then find:=b[s] else
begin
p1:=p(s,t);
q:=p1-s+1;
if k<=q then find:=find(s,p1,k) else find:=find(p1+1,t,k-q);
end;
end;
begin
write('input data:');
for i:=1 to n do read(b[i]);readln;
write('input k:');read(k);
write('output data:');
writeln('kthsmall:=',find(1,n,k));
end.
4. c語言中的函數可不可以單獨進行編譯
是可以的。
庫函數是把函數放到庫里,供別人使用的一種方式。函數庫是由系統建立的具有一定功能的函數的集合。庫中存放函數的名稱和對應的目標代碼,以及連接過程中所需的重定位信息。用戶也可以根據自己的需要建立自己的用戶函數庫。
使用C語言的語句直接計算sin或cos函數,就需要編寫頗為復雜的程序。因為C語言的語句中沒有提供直接計算sin或cos函數的語句。又如為了顯示一段文字,我們在C語言中也找不到顯示語句,只能使用庫函數printf。
(4)函數為什麼單獨編譯不對擴展閱讀
函數庫的分類
1、字元串、內存和字元函數
需要的包含文件:string.h、mem.h、ctype.h或string.h;
2、數學函數
需要的包含文件:math.h;
3、動態存儲分配
需要的包含文件:alloc.h或stdlib.h ;
5. C語言函數編譯後不正確
#include<stdio.h>
void main ()
{
int i=0;
char p[20];
for(i=0;i<8;i++)
{
printf("請輸入8個數:\n");
scanf("%c",&p[i]);
if(p[i]==13)
break;
}
for(i=0;i<8;i++)
if(p[i]==13)
break;
else if(p[i]+10>122)
p[i]='a'+(p[i]-112);
else
p[i]=p[i]+10;
printf("每個字母向後推10位以後變為:\n");
for(i=0;i<8;i++)
if(p[i]!=13)
printf(" %c",p[i]);
printf("\n");
printf("\n");
}
你本身用for語句i<8限制了只能輸入8個數,你有加上條件if(p[i]==13)來結束for語句,這很沒必要!再說要你輸入8個數,你輸入8個數就行了,用enter(字元代碼為13)來控制不好控制,如果你想控制,你可以用\0來控制比較好,上面寫的可以滿足你的要求,你試試!!!
6. 為什麼C/C++頭文件單獨編譯會失敗
估計是你編譯器設置不對或者還沒設置,找不到iostream這個文件,程序至少有一個入口,不然也是出錯的
#include<iostream>
int main(void)
{
return 0;
}
這個是最簡單的了,至少有這個才可以編譯成可執行文件的
7. 這個函數定義為什麼不能過編譯
定義數組的時候不能用arr[n],中括弧裡面要是一個常數。題目中應該會告訴你數字最多有幾個,定義的時候用最大數。在函數中循環時再用n
8. 如下的函數調用為什麼會在編譯的時候出錯
在函數聲明和定義的時候,如果參數列表為空,可以設為void,但調用的時候,因為參數列表為空,說明沒有傳遞參數。
定義一個函數如下:
int getNum( int nNum )
{
return nNum;
}
則,調用的時候必須要給nNum賦值的,總不能在main()函數中這樣調用吧
int main(){
getNum( int nNum );
}
所以調用的時候不用加void;
9. 在C語言程序中,只有main函數才可單獨進行編譯,哪裡錯了
有函數的都可以單獨進行編譯,編譯是指把程序語句翻譯為機器代碼,對於C語言就是把.c文件翻譯為.obj文件。
此外,必須要有main函數的才可以完成連接為exe文件。
10. 每個函數都可以被單獨編譯對嗎
A、main函數是不能被任何函數調用的,所以a錯了
B、函數可以單獨編譯,每個函數都能單獨寫成一個文件,所以B對的
C、函數都要通過main函數的調用才能正確的運行,main函數是一個程序的唯一入口
D、函數是不可以嵌套使用的