第一題:doit()函數(shù)即可完成前移工作和輸出工作

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),武勝企業(yè)網(wǎng)站建設(shè),武勝品牌網(wǎng)站建設(shè),網(wǎng)站定制,武勝網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,武勝網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
#include stdio.h
const L=10;
void doit(int *a, int pos)
{
int i;
if(pos0 || posL-1)
{
printf("a[%d]不存在!\n", pos);
return;
}
else for (i=pos; iL-1; i++)
a[i] = a[i+1];
for(i=0; iL-1; i++) printf("%d ", a[i]);
printf("\n");
}
void main()
{
int a[L] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int n, i;
printf("數(shù)組原來的數(shù)據(jù): \n");
for(i=0; iL; i++) printf("%d ", a[i]);
printf("\n");
printf("從a[n]開始向前移位,其中n=");
scanf("%d", n);
doit(a, n-1);
}
第二題: doit()函數(shù)即可完成將數(shù)組a中所有質(zhì)數(shù)放入數(shù)組b中的任務(wù),最后返回值為b中質(zhì)數(shù)的個數(shù)
#include stdio.h
#include malloc.h
const N=26;
int doit(int *a, int *b)
{
int i, j=-1;
for (i=0; iN; i++)
if (a[i]%2!=0)
{
j++;
b[j] = a[i];
}
return(j+1);
}
void main()
{
int a[N]={0,2,3,4,5,
7,8,11,23,
24,22,211,
45,8,7,14,
16,21,101,
-2,-1,0,9,
100,101,1};
int b[N];
int i, tot;
tot = doit(a, b);
for (i=0; itot; i++)
printf("%d ",b[i]);
printf("\n");
}
太簡單,懶得答,抄來的:
Bubble Sort(冒泡法)
最簡單的排序方法是冒泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的“氣泡”,較小的元素比較輕,從而要往上浮。在冒泡排序算法中我們要對這個“氣泡”序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,并時刻注意兩個相鄰的元素的順序是否正確。如果發(fā)現(xiàn)兩個相鄰元素的順序不對,即“輕”的元素在下面,就交換它們的位置。顯然,處理一遍之后,“最輕”的元素就浮到了最高位置;處理二遍之后,“次輕”的元素就浮到了次高位置。在作第二遍處理時,由于最高位置上的元素已是“最輕”元素,所以不必檢查。一般地,第i遍處理時,不必檢查第i高位置以上的元素,因為經(jīng)過前面i-1遍的處理,它們已正確地排好序。這個算法可實現(xiàn)如下。
Bubble Sort程序:
STL C++程序:(VC++6.0通過)
#include "stdafx.h"
#include "iostream.h"
templateclass T
class doit{
private:
int x,y;
T temp;
public:
doit(T* in,int count)
{
for(y=0;ycount-1;y++)
{
for(x=1;xcount-y;x++)
{
if((*(in+x))(*(in+x-1)))
{
temp=(*(in+x-1));
(*(in+x-1))=(*(in+x));
(*(in+x))=temp;
}
}
}
}
};
int main()
{
double a[4]={1.1,1.3,1.9,2.2};
doitdouble d(a,4);
for(int i=0;i4;i++)
{
couta[i]endl;
}
return 0;
}
C語言程序:(TC 2.0通過)
void doit(float* in,int count)
{
int x;
int y;
float temp;
for(y=0;ycount-1;y++)
{
for(x=1;xcount-y;x++)
{
if((*(in+x))(*(in+x-1)))
{
temp=(*(in+x-1));
(*(in+x-1))=(*(in+x));
(*(in+x))=temp;
}
}
}
}
int doit(int x, int y,int (*fun)(int ,int ))
{
......................
a=(*fun)(x,y);
..................調(diào)用一個函數(shù);
return(a);
}
int max(int x,int y)
{
............
}
int min...................
...........連續(xù)四個函數(shù);
void mian()
{
.................
將tingcase=max ,min, .,............其中一個;就可以實現(xiàn)你要的功能了;
result=doit(x,y,tingcase);
}
主干部分就是這樣了,函數(shù)的實現(xiàn)部分。應(yīng)該知道了吧,望采納哦。嘻嘻
簡單來說:宏定義又稱為宏代換、宏替換,簡稱“宏”。宏替換是C/C++的預(yù)處理中的一部分,在C++標(biāo)準(zhǔn)中有4條規(guī)則來定義替換。
規(guī)則1:實參替換。
本條規(guī)則描述帶參數(shù)的宏的替換過程。
對于宏定義中的形參,在替換列表中,如果不是作為#或##的操作數(shù),那么將對應(yīng)實參完全
展開(相當(dāng)于對實參進行求值),然后將替換列表中的形參替換掉.如果是#或##的操作數(shù),
那么不進行替換。
規(guī)則2:多次掃描。
在所有的形參替換為實參后,對結(jié)果進行再次掃描,如果發(fā)現(xiàn)還有可替換的宏,則進行替換,
否則中止。
規(guī)則3:遞歸替換抑制。
如果在替換列表中發(fā)現(xiàn)當(dāng)前正在展開的宏的名字,那么這里不進行替換.更進一步,在嵌套
的替換過程中發(fā)現(xiàn)已經(jīng)替換過的宏的名字,則不進行替換。
規(guī)則4:遞歸預(yù)處理抑制。
如果替換后的結(jié)果形成預(yù)處理指令,則不執(zhí)行這條預(yù)處理指令。
看幾個C++標(biāo)準(zhǔn)中的例子:
#define x 3
#define f(a) f(x * (a))
#undef x
#define x 2
#define g f
#define z z[0]
#define h g(~
#define m(a) a(w)
#define w 0,1
#define t(a) a
f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
g(x+(3,4)-w) | h 5) m(f)^m(m);
其結(jié)果分別是
f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
f(2 * (2+(3,4)-0,1)) | f(2 * ( ~ 5)) f(2 * (0,1))^m(0,1);
對于第一個,主要在于t(t(g)(0) + t)(1)的展開。
容易計算出最外層的t的實參是f(2 * (0)) + t,而作為t的參數(shù)傳入時其中的t是
正在被展開的宏,所以根據(jù)規(guī)則3,不對這個t進行處理,保持不變,得到f(2 * (0)) + t(1)。
對于第二個,h 5)被替換為g(~5),應(yīng)用規(guī)則2,被替換為f(2 * ( ~ 5))。
而m(m)首先被替換為m(w),然后應(yīng)用規(guī)則2再次進行替換,但是m已經(jīng)是替換過的了,所以保持
不變,只對w進行替換。
#define str(s) # s
#define xstr(s) str(s)
#define debug(s, t) printf("x" # s "= %d, x" # t "= %s", \
x ## s, x ## t)
#define INCFILE(n) vers ## n /* from previous #include example */
#define glue(a, b) a ## b
#define xglue(a, b) glue(a, b)
#define HIGHLOW "hello"
#define LOW LOW ", world"
debug(1, 2);
fputs(str(strncmp("abc\0d", "abc", ’\4’) /* this goes away */
== 0) str(: @\n), s);
#include xstr(INCFILE(2).h)
glue(HIGH, LOW);
xglue(HIGH, LOW)
其結(jié)果分別是
printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
fputs("strncmp(\"abc\\0d\", \"abc\", ’\\4’) = = 0" ": @\n", s);
#include "vers2.h"
"hello";
"hello" ", world"
關(guān)鍵是glue和xglue.
對于glue(HIGH, LOW),首先有一個規(guī)則1的抑制,得到HIGHLOW;的結(jié)果,然后二次掃描,得到
"hello";
對于xglue(HIGH, LOW)沒有抑制效果,所以對參數(shù)求值,分別得到HIGH和LOW ", world",即
glue(HIGH, LOW ", world")。
然后進行連接操作得到HIGHLOW ", world",最后再掃描一次得到"hello" ", world"
如果考慮字符串的自然的連接,就可以得到"hello, world"了。
擴展資料
宏語言是一類編程語言,其全部或多數(shù)計算是由擴展宏完成的。宏語言并未在通用編程中廣泛使用,但在文本處理程序中應(yīng)用普遍。例如, C preprocessor C預(yù)處理器Internet Macros(iOpus) M4(如前所述,源于ATT,捆綁于Unix)
宏定義
c程序提供的預(yù)處理功能之一。包括帶參數(shù)的宏定義和不帶參數(shù)的宏定義。具體是指用一個指定的標(biāo)志符來進行簡單的字符串替換或者進行闡述替換。形式為:
#define標(biāo)志符[(參數(shù)表)] 字符串
宏名
在上定義中的標(biāo)志符被稱為“宏名”。
宏展開
在c程序編譯時將宏名替換成字符串的過程稱為“宏展開”。
宏語言是一類編程語言,其全部或多數(shù)計算是由擴展宏完成的。宏語言并未在通用編程中廣泛使用, 但在文本處理程序中應(yīng)用普遍。例如,
C preprocessorC 預(yù)處理器
Internet Macros(iOpus)
M4(如前所述,源于ATT,捆綁于Unix)
參考資料來源:百度百科-宏
//此程序可計算四則混合運算,輸入時直接輸入數(shù)學(xué)表達式,如2+9*5/3-1.......
//應(yīng)注意的是,若有除法則只能取整。
#includemath.h
#includestdio.h
#includestring.h
#includestdlib.h
#includealloc.h
#define N 30
char *qkh(char *p);
char *ccf(char *p);
char *jjf(char *p);
char *zkh(char *p);
void hy(char *temp,char *p,int n);
int i=0;
void main()
{
char *s2,*p1=NULL,*temp;s2=(char *)malloc(N);clrscr();
gets(s2);
for(;*(s2+i)!='\0';i++)
{
p1=zkh(s2);
if(p1!=NULL)
{
i=1;
while(*(p1+i)!=')')
i++;
temp=qkh(p1);
hy(temp,p1-1,i+2);
i=0;
}
else
{
s2=ccf(s2);
s2=jjf(s2);
}
}
printf("\nthe value is %s",s2); getch();
}
char *qkh(char *p)
{
char *p1;
*(p+i)='\0';
p1=(char *)malloc(strlen(p));
strcpy(p1,p);
p1=ccf(p1);
p=jjf(p1);
return p;
}
void hy(char *sum,char *s2,int n)
{
strcat (sum,s2+n);
strcpy(s2,sum);
}
char *ccf(char *s2)
{
int i;
char *a,*b,*sum,*temp,*a1,*b1;
for (i=1;*(s2+i)!='*'*(s2+i)!='/'*(s2+i);i++);
if(*(s2+i)=='\0')
return s2;
else
{
char f1=*(s2+i),f2;
int x=1;
for (;(i-x)(*(s2+i-x)!='+'*(s2+i-x)!='-');x++);
*(s2+i)='\0';
if(i-x) a1=s2+i-x+1;
else
a1=s2+i-x;
a=(char *)malloc(strlen(a1));
strcpy(a,a1);
*(s2+i)=f1;
for(x=2;*(s2+i+x)!='+'*(s2+i+x)!='-'*(s2+i+x)!='*'*(s2+i+x)!='/'*(s2+i+x);x++);
f2=*(s2+i+x);
*(s2+i+x)='\0';
b1=s2+i+1;
b=(char *)malloc(strlen(b1));
strcpy(b,b1);
*(s2+i+x)=f2;
{
int a1,b1;
sum=(char *)malloc(strlen(a)+strlen(b));
a1=atoi(a);b1=atoi(b);
if(f1=='*')
itoa(a1*b1,sum,10);
else
itoa(a1/b1,sum,10);
}
{
int m=i;while(*(s2+m)!='+'*(s2+m)!='-'m)m--;
if(m)hy(sum,s2+m+1,i-1-m+x);
else
hy(sum,s2,i+x);}
for(i=1;(*(s2+i)!='*'*(s2+i)!='/')*(s2+i);i++);
if(*(s2+i)=='\0')
return s2;
else
ccf(s2);
}
}
char *zkh(char *p)
{
int i;
for (i=0;*(p+i)!=')'*(p+i);i++);
if(!(*(p+i))) return NULL;
else
{
int a;
for (a=i-1;*(p+a)!='(';a--);
return p+a+1;
}
}
char *jjf(char *s2)
{
int i;
char *a,*b,*sum,*temp,*a1,*b1;
for (i=1;*(s2+i)!='+'*(s2+i)!='-'*(s2+i);i++);
if(*(s2+i)=='\0')
return s2;
else
{
char f1=*(s2+i),f2;
int x=1;
*(s2+i)='\0';
a1=s2;
a=(char *)malloc(strlen(a1));
strcpy(a,a1);
*(s2+i)=f1;
for(x=2;*(s2+i+x)!='+'*(s2+i+x)!='-'*(s2+i+x);x++);
f2=*(s2+i+x);
*(s2+i+x)='\0';
b1=s2+i+1;
b=(char *)malloc(strlen(b1));
strcpy(b,b1);
*(s2+i+x)=f2;
{
int a1,b1,m;
sum=(char *)malloc(strlen(a)+strlen(b));
a1=atoi(a); b1=atoi(b);
if(f1=='+')
{m=a1+b1; itoa(m,sum,10); }
else
{m=a1-b1; itoa(m,sum,10);}
}
hy(sum,s2,i+x);
for(i=1;(*(s2+i)!='+'*(s2+i)!='-')*(s2+i);i++);
if(*(s2+i)=='\0')
return s2;
else
jjf(s2);
}
}
轉(zhuǎn)了我同學(xué)的 貌似還要改下才能符合要求
宏是一種預(yù)處理指令,它提供了一種機制,可以用來替換源代碼中的字符串。
1、條件編譯:
C語言中,預(yù)處理過程讀入源代碼,檢查包含預(yù)處理指令的語句和宏定義,并對源代碼進行相應(yīng)的轉(zhuǎn)換,預(yù)處理過程還會刪除程序中的注釋和多余的空白符號。
預(yù)處理指令是以#開頭的代碼行,#必須是該行除了空白字符外的第一個字符。#后是指令關(guān)鍵字,在#和指令關(guān)鍵字之間允許存在若干空白字符。
使用宏進行條件編譯的用法與使用宏防止多重引用類似。示例如下:
使用條件編譯,方便程序員在調(diào)試程序的過程中,執(zhí)行一些在程序發(fā)布后并不需要執(zhí)行的指令。只要在需要調(diào)試的代碼前加上_DEBUG的定義,就可以在調(diào)試程序的過程中輸出調(diào)試信息。
這樣方便查看程序在運行過程中有沒有出現(xiàn)錯誤,定位錯誤出現(xiàn)的地方。而在程序發(fā)布之前,取消_DEBUG的定義就可以不再執(zhí)行調(diào)試代碼。
2、宏函數(shù):
函數(shù)的調(diào)用是需要一定的時間和空間代價的。因為系統(tǒng)在調(diào)用函數(shù)時,需要保留"現(xiàn)場",即將程序要執(zhí)行的指令的下一條指令的位置壓入棧,然后轉(zhuǎn)入調(diào)用函數(shù)去執(zhí)行,調(diào)用完函數(shù)后再返回主調(diào)函數(shù),恢復(fù)"現(xiàn)場",返回到棧里保存的的下一條指令的位置繼續(xù)執(zhí)行。
所以函數(shù)的調(diào)用需要額外的時間和空間代價。
而宏函數(shù)則不存在上述問題,宏函數(shù)在預(yù)編譯時,同函數(shù)定義的代碼來替換函數(shù)名,將函數(shù)代碼段嵌入到當(dāng)前程序,不會產(chǎn)生函數(shù)調(diào)用。
所以會省去普通函數(shù)保留現(xiàn)場恢復(fù)現(xiàn)場的時間,但因為要將定義的函數(shù)體嵌入到當(dāng)前程序,所以不可避免的會占用額外的存儲空間。
在頻繁調(diào)用同一個宏的時候,該現(xiàn)象尤其明顯。宏函數(shù)的示例定義如下:
#define MAX(a,b) ((a)(b)?(b):(a))
宏函數(shù)的優(yōu)點在于避免函數(shù)調(diào)用,提高程序效率。
同時需要注意的是inline標(biāo)識符。inline也將函數(shù)定義為內(nèi)聯(lián)的。但是使用內(nèi)聯(lián)函數(shù)需要注意的是:函數(shù)體必須十分簡單,不能含有循環(huán)、條件、選擇等復(fù)雜結(jié)構(gòu),否則就不能作為內(nèi)聯(lián)函數(shù)了。
事實上,有時候即便你沒有將函數(shù)指定為內(nèi)聯(lián)函數(shù),編譯器也會將一些簡單的函數(shù)作為內(nèi)聯(lián)函數(shù)處理,而對于一些復(fù)雜的函數(shù),即使聲明為內(nèi)聯(lián)函數(shù),編譯器也不會理會的。
inline函數(shù)的瓶頸就在于此,使用inline標(biāo)識符將函數(shù)聲明為內(nèi)聯(lián)的,但這只是一種提示,到底編譯器有沒有優(yōu)化還依賴于編譯器的實現(xiàn),而使用宏函數(shù)則完全由代碼本身控制。
但在使用宏函數(shù)的時候,需要明確的是宏函數(shù)只是簡單的替換,需要注意括號的使用。
擴展資料:
宏的更多規(guī)則特性:
(1)宏名一般用大寫。
(2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便于修改。例如:數(shù)組大小常用宏定義。
(3)預(yù)處理是在編譯之前的處理,而編譯工作的任務(wù)之一就是語法檢查,預(yù)處理不做語法檢查。
(4)宏定義末尾不加分號。
(5)宏定義寫在函數(shù)的花括號外邊,作用域為其后的程序,通常在文件的最開頭。
(6)可以用#undef命令終止宏定義的作用域。
(7)宏定義不可以嵌套。
(8)字符串" "中永遠(yuǎn)不包含宏。
(9)宏定義不分配內(nèi)存,變量定義分配內(nèi)存。
(10)宏定義不存在類型問題,它的參數(shù)也是無類型的。
參考資料:
百度百科--宏定義
名稱欄目:包含c語言doit函數(shù)的詞條
文章來源:http://chinadenli.net/article29/dseicch.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站設(shè)計公司、小程序開發(fā)、網(wǎng)站策劃、微信小程序、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)