A. 如果c語言函數參數太多,可以怎麼優化
一個函數的參數的數目沒有明確的限制,但是參數過多(例如超過8個)顯然是一種不可取的編程風格。參數的數目直接影響調用函數的速度,參數越多,調用函數就越慢。另一方面,參數的數目少,程序就顯得精練、簡潔,這有助於檢查和發現程序中的錯誤。因此,通常應該盡可能減少參數的數目,如果一個函數的參數超過4個,你就應該考慮一下函數是否編寫得當。 如果一個函數不得不使用很多參數,你可以定義一個結構來容納這些參數,這是一種非常好的解決方法。在下例中,函數print_report()需要使用10個參數,然而在它的說明中並沒有列出這些參數,而是通過一個RPT_PARMS結構得到這些參數。 # include <atdio. h> typedef struct ( int orientation ; char rpt_name[25]; char rpt_path[40]; int destination; char output_file[25]; int starting_page; int ending_page; char db_name[25]; char db_path[40]; int draft_quality; )RPT_PARMS; void main (void); int print_report (RPT_PARMS* ); void main (void) { RPT_PARMS rpt_parm; /*define the report parameter structure variable * / /* set up the report parameter structure variable to pass to the print_report 0 function */ rpt_parm. orientation = ORIENT_LANDSCAPE; rpt_parm.rpt_name = "QSALES.RPT"; rpt_parm. rpt_path = "Ci\REPORTS" rpt_parm. destination == DEST_FILE; rpt_parm. output_file = "QSALES. TXT" ; rpt_parm. starting_page = 1; rpt_pann. ending_page = RPT_END; rpt_pann.db_name = "SALES. DB"; rpt_parm.db_path = "Ci\DATA"; rpt_pann. draft_quality = TRUE; /*call the print_report 0 function; paaaing it a pointer to the parameteM inatead of paMing it a long liat of 10 aeparate parameteM. * / ret_code = print_report(cu*pt_parm); } int print_report(RPT_PARMS*p) { int rc; /*acccM the report parametcra paaaed to the print_report() function */ oricnt_printcr(p->orientation); Kt_printer_quality((p->draft_quality == TRUE) ? DRAFT ; NORMAL); return rc; } 上例唯一的不足是編譯程序無法檢查引用print_report()函數時RPT_PARMS結構的10個成員是否符合要求。
B. vc++ 感覺無法優化了,但速度還是比c#慢是怎麼回事
C++的基礎是C語言,C語言更加接近底層一些,最接近底層的是匯編語言,一般做底層開發(比如驅動程序)都使用匯編或c語言。如果開發過程中不涉及到底層開發,大可不必學習C++或C語言,直接使用可視化開發工具進行開發,比如VB或C#。現在很多開發
C. 請問我這個c語言代碼還能更加優化嗎!
優化0:題目要求輸入學生個數上限,所以輸入n那裡需要驗證。
優化1:減少循環次數,題目沒有說找最大最小必須單獨循環。那麼直接在輸入循環的時候就能得結果。
優化2:你的j每次只循環一次,沒有必要。
優化3:輸入那裡用臨時變數傳遞,沒必要,直接用數組地址。
優化4:數組最大值定義常量,便於後期程序修改參數。
下面代碼,我完全按照你的寫法寫的,你拿來參考。(要是學過指針,比大小那裡試試換成指針更好)
#include <stdio.h>
#define MS 40//最大學生人數
int main()
{
int n=0,i;
int a[MS][2];
int minmark,maxmark,minxuehao,maxxuehao;
while(!n || n>MS)
printf("請輸入學生數量:"),scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("請輸入學生學號:");
scanf("%d",&a[i][0]);
printf("請輸入學生成績:");
scanf("%d",&a[i][1]);
if(i==0)
minmark=maxmark=a[0][1];
else{
if(minmark>a[i][1]) minmark=a[i][1],minxuehao=a[i][0];
if(maxmark<a[i][1]) maxmark=a[i][1],maxxuehao=a[i][0];
}
}
printf("最高分為%d,學號為%d ",maxmark,maxxuehao);
printf("最高分為%d,學號為%d ",minmark,minxuehao);
return 0;
}
D. c語言優化,有滿意答案給100分
我路過,說一句:程序執行時代碼是保存在代碼區的,這個區是只讀的,也就是說你不能在運行時改變你的代碼!所以你的想法是不現實的!當然高手有辦法實現,通過程序該exe文件然後加多進程的方式,但你說你只會一點C語言,那這個方法就~~~難於上那什麼天了哈!!!
不過我提醒你一下
ID雞蛋炒韭菜 正解,別聽anan640925瞎扯,故作高深!!!只是 ID雞蛋炒韭菜 沒說詳細而已!
把大循環做成兩個版本的代碼,版本1,加入那一段你要重復調用的代碼,版本2,不加你要重復調用的代碼,這樣,當那個什麼狀態為否的時候,調用版本1,為是的時候呢,就調用版本2!下面是偽代碼:
if(狀態為是)
{
for(i=0;i<10000;i++)
{
版本2;//調用了和狀態相關的代碼
}
}
else
{
for(i=0;i<10000;i++)
{
版本1;//不調用和狀態相關的代碼
}
}
這樣其實也就是實現了你的那個想法!當然咯,會在內存空間上帶來那麼一點點浪費!!!
你要想繼續優化內存空間呢,那麼就做三個函數,也就是把你大循環中要做的事拆成3部分:
第一個,你大循環中要在調用的那個和條件關的部分的前面那部分,然後是相關部分,然後是後面部分,對應的偽代碼是
if(a==0)
{
for(i=0;i<10000;i++)
{
前部分
相關代碼
後部分
}
}
else
{
for(i=0;i<10000;i++)
{
前部分
後部分
}
}
這樣是不是就更貼合你的想法了呢?
不過你繼續看下去,我又要潑冷水了,呵呵!
雖然這樣子看起來既省時間又省空間,但是不可忽視的一個耗時部分就是函數調用時的堆棧操作,最開始的方案中會有1n個調用,第二個方案中會有3n或者2n個調用!!!這個算起來,遠遠 ID雞蛋炒韭菜 說的設一個標志再判斷這個標志的時間要多!!!懂了嗎?
再回過頭看看你的想法,你覺得插入一段函數代碼,再跳到這個緩沖區不要花時間嗎?你絕對這個時間花費比一句if(flag==0)要少么?
我告訴你,一句if(flag==0),編譯器之後也就一句JNE指令,而你說的那個想法,至少要一對MOV指令再加一句JMP指令,你現在說 哪個更省時?
再啰嗦一句,程序優化是比較高級的東西,沒看到你代碼,不好發言!時間和空間是矛盾的,要麼選第一個方案,以空間換時間,要麼選判斷標志,以時間換空間!
跟你說個例子,我的一個老師做的單片機程序,我用C語言做的 編譯出來700多位元組,他改成了匯編的 13條指令完美解決 空間優化了幾十倍!!! 那設計,太巧妙了。所以說優化無止境,量力而行。
回歸正題:答案還是 ID雞蛋炒韭菜 正解!標準的以少量時間換空間的方法。
我說的第一個方案是以空間換時間的方法!
你自己斟酌用那個方法!
E. 幾種C語言優化代碼技巧
以下內容摘自李亞鋒先生的《經典C面試真題精講》
1.結構體設計為成員最長類型長度的整數倍;
2.減少函數參數的個數,不需要返回值的函數定義為void類型;
3.if...else....多條件分支語句中,把出現頻率高的條件放在前面;
4.同時聲明多個相同類型變數優於分別單獨聲明變數;
5.減少定義全局變數;
6.使用#define定義常量和小的函數實現;
7.有些情況嵌套匯編語句效率更高;
8.佔用大的存儲空間可以減少執行時間,同理時間也可以換取空間;
9提高程序演算法效率;
F. c語言防止優化
編譯器編譯命令里有設置選項,通過設置,你可以要求 不優化,也可以要求用哪種優化。
具體選項有哪些,要查自己編譯器的幫助文件。
例如,MS VC++ 6.0 編譯器編
優化選項:
/O1:優化使產生的可執行代碼最小
/O2:優化使產生的可執行代碼速度最快
/Oa:指示編譯器程序里沒有使用別名,可以提高程序的執行速度
/Ob:控制內聯(inline)函數的展開
/Od:禁止代碼優化
/Og:使用全局優化
/Oi:用內部函數去代替程序里的函數調用,可以使程序運行的更快,但程序的長度變長
/Op:提高浮點數比較運算的一致性
/Os:產生盡可能小的可執行代碼
/Ot:產生盡可能塊的可執行代碼
/Ow:指示編譯器在函數體內部沒有使用別名
/Ox:組合了幾個優化開關,達到盡可能多的優化
/Oy:阻止調用堆棧里創建幀指針
/O2 為了加速,會優化掉。 選 /Od 不優化。
G. c語言函數優化
c函數是一個獨立的程序段,它執行具體的、明確的任務
特點:
一個函數只能返回一個值
一個程序可以有一個或多個函數
函數可以嵌套調用,但不能在一個函數中定義另一個函數
無論函數是否有參數,一定要有括弧
函數在定義或使用前應在main() 函數中進行聲明
H. 【50分】c語言程序優化
本題一個完整的c程序如下,在win-tc和Dev-c++下調試通過。
這里沒有使用結構體,也可以改寫為結構體。這里利用的是交換數組的編號,同時程序可以判斷當輸入職工號重復時,提醒重新輸入,效果不錯。
/*職工管理系統
該系統的功能包括輸入、排序、查找。主程序中包括3個函數其中input()函數的功能是:
輸入職工的姓名和職工號。sort()函數的功能是:按職工號由小到大排序,姓名順序也隨之調整。 search()函數的功能是:根據主函數提供的職工號進行查找,若找到該職工則輸出對應職工的姓名, 若找不到則輸出「not find」。
*/
#include<stdio.h>
#include"string.h"
#define NUMMAX 100
int order[NUMMAX];
void input(int a[],char b[][20],int n)
{
int i=0,j,k,flag;
do
{ flag=0;
printf("please input No.%d worker's code:\n",i+1);
scanf("%d",&a[i]);
printf("please input No.%d worker's name:\n",i+1);
scanf("%s",b[i]);
for(j=0;j<i;j++)
{ for(k=j+1;k<i+1;k++)
if(a[k]==a[j])
{ printf("The code has been inputted! Please input again!\n");
flag=1;
break; /*如有重復立即退出該層循環,提高判斷速度*/
}
if(flag==1)
break; /*如有重復立即退出該層循環,提高判斷速度*/
}
if(flag==0)
{ order[i]=i;
i++;
}
}while(i<n);
}
void sort(int a[],int n)
{
int i,j,k;
char t[20];
for(i=0;i<n-1;i++) /* 選擇排序 */
for(j=i+1;j<n;j++)
if(a[order[i]]>a[order[j]]) /* 交換的是次序不是元素 */
{k=order[i]; /* 這是處理不用結構體使數據一起移動的一種好方法 */
order[i]=order[j];
order[j]=k;
}
}
void search(int n,int num,int a[],char b[][20])
{int i,flag=0;
for(i=0;i<n;i++)
if(num==a[order[i]])
{printf("The worker you find is:%s\n",b[order[i]]);
flag=1;
}
if(flag==0)
printf("Not find!\n");
}
int main()
{
char c,name[NUMMAX][20]; /*職工號數值應在int可以表示的范圍內*/
int i,n,code[NUMMAX],num,flag=1;
printf("please input number of workers(<100):\n");
scanf("%d",&n);
input(code,name,n);
sort(code,n);
printf("The sequence of workers after sort are:\n");
for(i=0;i<n;i++)
printf("%-10d%s\n",code[order[i]],name[order[i]]);
while(flag==1)
{
printf("\nInput code to search:");
scanf("%d",&num);
search(n,num,code,name);
printf("\ncontinue or not(Y/N)?");
c=getch();
if(c=='N'||c=='n')
flag=0;
}
return 0;
}