c語言函數編寫
A. c語言如何編寫
C語言是個基礎的語言,是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。
int main()是主函數的意思 int 整型函數,也是基本的整型函數,整型函數有long , short等等整型函數,除了整型函數還有很多的函數,想知道自己去查。
printf是個輸出的工具,scanf是輸入的工具(這個怎麼用,有機會再說)我們將我們想說的話寫在printf後面,那麼就可以了
還有幾點要強調,1就是要用英文符號,不然會出錯;2{}括弧裡面每一段都要用分號;3return0;可寫不寫,對初學者沒要求;4int main()寫一次就可以了,一個程序只有一個主函數
最後我講一下C語言概括:C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環境支持便能運行的高效率程序設計語言。盡管C語言提供了許多低級處理的功能,但仍然保持著跨平台的特性,以一個標准規格寫出的C語言程序可在包括類似嵌入式處理器以及超級計算機等作業平台的許多計算機平台上進行編譯。
C語言是一門面向過程的計算機編程語言,與C++、C#、Java等面向對象編程語言有所不同。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、僅產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。C語言描述問題比匯編語言迅速、工作量小、可讀性好、易於調試、修改和移植,而代碼質量與匯編語言相當。C語言一般只比匯編語言代碼生成的目標程序效率低10%-20%。因此,C語言可以編寫系統軟體。
B. C語言庫函數如何編寫
/***
*printf.c - print formatted
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout ''PRINT'', ''F''ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);//斷言宏。如果輸出格式字元串指針為空,則在DEBUG版下斷言,報告錯誤。
_lock_str2(1, stdout);
buffing = _stbuf(stdout);//stdout:指定輸出到屏幕
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
_unlock_str2(1, stdout);
return(retval);
}
以上為printf()的源代碼
1、從含有可選參數函數中獲得可選參數,以及操作這些參數
typedef char *va_list;
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
假定函數含有一個必選參數和多個可選參數,必選參數聲明為普通數據類型,且能通過參數名來獲得該變數的值。可選參數通過宏va_start、va_arg和va_end(定義在stdarg.h或varargs.h中)來進行操作,即通過設置指向第一個可選參數指針、返回當前參數、在返回參數後重新設置指針來操作所有的可選參數。
va_start:為獲取可變數目參數的函數的參數提供一種便捷手段。設置arg_ptr為指向傳給函數參數列表中的第一個可選參數的指針,且該參數必須是va_list類型。prev_param是在參數列表中第一個可選參數前的必選參數。
va_arg:返回由arg_ptr所指向的參數的值,且自增指向下一個參數的地址。type為當前參數的類型,用來計算該參數的長度,確定下一個參數的起始位置。它可以在函數中應用多次,直到得到函數的所有參數為止,但必須在宏va_start後面調用。
va_end:在獲取所有的參數後,設置指針arg_ptr為NULL。
下面舉例說明:
#include
#include
int average( int first, ... );
void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
返回值為:
Average is: 3
Average is: 8
Average is: 0
綜上所述,在printf()函數中,可以只輸出一個字元串,也可按照一定的形式輸出含有多個可選參數的字元串信息。因此,首先就要通過這些宏來獲取所有的可選參數。在上面的源碼可以看出printf()中,只使用了宏at_start,將可選參數的首地址賦給了arglist。
2、鎖定字元串及輸出字元串到屏幕
#define _lock_str2(i,s) _lock_file2(i,s)
void __cdecl _lock_file2(int, void *);
#define _unlock_str2(i,s) _unlock_file2(i,s)
void __cdecl _unlock_file2(int, void *);
int __cdecl _stbuf(FILE *);
void __cdecl _ftbuf(int, FILE *);
int __cdecl _output(FILE *, const char *, va_list);
在output函數中,讀取格式字元串中的每一個字元,然後對其進行處理,處理方式根據每一個字元所代表的意義來進行,如:普通字元直接利用函數WRITE_CHAR(ch, &charsout);輸出到控制台。
其中的主要部分是對轉換說明符(d,c,s,f)的處理,現在將對其中的部分代碼進行詳細說明,這里只說明最基本的轉換說明符,對這些須基本的轉換說明符進行修飾的修飾符,程序中單獨進行處理。下面是函數output()(output.c)部分源代碼:
case ST_TYPE:
//表示當前處理的字元的類型為轉換說明符。
...
switch (ch) {
//下面對參數的獲取都是利用宏va_arg( va_list arg_ptr, type );來進行的。
case ''c'': {
//從參數表中獲取單個字元,輸出到緩沖字元串中,此時,type=int
buffer[0] = (char) get_int_arg(&argptr); /* get char to print */
text = buffer;
textlen = 1; /* print just a single character */
}
break;
case ''s'': {
//從參數表中獲取字元串,輸出到緩沖字元串中,此時,type=char*
int i;
char *p; /* temps */
text = get_ptr_arg(&argptr);
...
}
break;
case ''w'': {
//對寬字元進行處理
...
} /* case ''w'' */
break;
...
case ''e'':
case ''f'':
case ''g'': {
//對浮點數進行操作
...
#if !LONGDOUBLE_IS_DOUBLE
/* do the conversion */
if (flags & FL_LONGDOUBLE) {
_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, LONGDOUBLE);
//對長雙精度型進行處理,此時,type=long double
}
else
#endif /* !LONGDOUBLE_IS_DOUBLE */
{
//對雙精度型進行處理,此時,type=double
_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, DOUBLE);
}
...
break;
//對整型變數處理
case ''d'':
case ''i'':
...
goto COMMON_INT;
case ''u'':
radix = 10;
goto COMMON_INT;
case ''p'':
...
goto COMMON_INT;
case ''o'':
...
註:對於浮點型double和long double,有相應的轉換說明符(%f表示雙精度型,%lf表示長雙精度型),而float卻沒有。其中的原因是,在K&RC下,float值用於表達式或用作參數前,會自動轉換成double類型。而ANSI C一般不會自動把float轉換成double。有些程序已假定其中的float參數會被轉換成double,為了保護大量這樣的程序,所有printf()函數的float參數還是被自動轉換成double型。因此,在K&RC或ANSI C下,都無需用特定的轉換說明符來顯示float型。
綜上所述,轉換說明符必須與待列印字元的類型。通常,用戶有種選擇。例如,如要列印一個int類型的值。則只可以使用%d,%x或%o。所有這些說明符都表示要列印一個int類型的值;它們只不過提供了一個數值的幾種不同表示。類似一,可以用%f、%g和%e來表示double類型的值。但如果轉換說明與類型不匹配,將會出現意想不到的結果。為什麼呢?問題就在於C向函數傳遞信息的方式。
這個失敗的根本細節與具體實現相關。它決定了系統中的參數以何方式傳遞。函數調用如下:
float n1;
double n2;
long n3;
long n4;
...
printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);
這個調用告訴計算機,要把變數n1,n2,n3和n4的值交給計算機,它把這些變數放進稱作棧(stack)的內存區域中,來完成這一任務。計算機把這些值放進棧中,其根據是變數的類型而不是轉換說明符,比如n1,把8個位元組放入棧中(float被轉換成double),類似地,為n2放了8位元組,其後給n3和n4各放了4個位元組。接著,控制的對象轉移到printf();此函數從棧中讀數,不過在這一過程中,它是在轉換說明符的指導下,讀取數值的。說明符%ld指定printf()應讀4個位元組(va_arg( va_list arg_ptr, type )中type=long),因此printf()讀入棧中的4個位元組,作為它的第一個值。但是這只是n1的前半部分,這個值被看成一個long整數。下一個說明符%ld讀入4個位元組,這正是n1的後半部分,這個值被看成第二個long整數。類似地,第三、第四次又讀入n2的前後兩部分。因此,盡管我們對n3和n4使用了正確的說明符,printf()仍然會產生錯誤。
C. c語言編寫一個函數
C語言中一個完整的函數由函數首部和函數體構成,而且定義函數時兩者都是必不可少的。函數定義的一般形式如下:類型標識符 函數名(形參表列) // 這是函數首部 // 以下{ }內的是函數體 { 說明部分執行部分 } 舉例說明如下: // 定義一個不帶返回值的函數 // 函數功能:輸出形參的值 void fun(int a, int b) { printf("%d, %d\n", a, b); } // 定義一個帶返回值的函數 // 函數功能:返回2個整數數的最大值 int fun(int a, int b) { return a>b ? a : b; }
D. 如何用c語言定義一個函數
函數是用戶與程序的介面,在定義一個函數前,首先要清楚以下三個問題。 1) 函數的功能實現及演算法選擇。演算法選擇會在後續文章詳細講解,本節重點關注函數的功能實現。一般選取能體現函數功能的函數名,且見名知意,如求和函數的函數名可取為 add,求最大值的函數名可取為 max,排序函數可取名為 sort 等。 2) 需要用戶傳給該函數哪些參數、什麼類型,即函數參數。 3) 函數執行完後返回給調用者的參數及類型,即函數返回值類型。 函教定義格式 函數定義的一般格式為: 返回類型 函數名 (類型參數1,類型參數2,…) { 函數體 } 也可以不含參數,不含參數時,參數表中可寫關鍵字 void 或省略,為規范起見,教程中對沒有參數的函數,參數表中統一寫 void。例如: 類型 函數名 () { 函數體 } 等價於: 類型 函數名 (void) //建議的書寫方式 { 函數體 } 如果該函數沒有返回類型,則為 void 類型。例如: void add (int x,int y) { printf ("sum=%d\n", x+y); } 除了 void 類型外,在函數體中,均需要顯式使用 return 語句返回對應的表達式的值。 函教返回值 函數的值是指調用函數結束時,執行函數體所得並返回給主調函數的值。 關於函數返回值說明如下。 1) 帶返回值的函數,其值一般使用 return 語句返回給調用者。其格式為: return 表達式; 或者 return (表達式); 例如: int add (int a, int b) { return (a + b); //return 後為表達式 } 函數可以含一個或多個 return 語句,但每次調用時只能執行其中一個 return 語句。 例如,求整數絕對值的函數: int f (int n) //含多個return語句,但每次調用只執行一個 { if (n >= 0) return n; else return -n; }
E. 如何寫C語言函數
1、打開C-Free,按ctrl+N創建一個新的文件。
F. c語言如何編寫自己的函數
int
getdata(int
a,int
b)//括弧是形式參數,前面int
是函數返回值類型
{
...
return
a;//返回值
}
...是實現的代碼。
自己看看書上的函數定義和實現形式很容易的。
G. C語言編寫函數
在C語言中,一個標準的函數定義語句塊必須包含函數返回值的類型標識符、函數名、形參類型及數量、函數體、返回值表達式。如果函數返回值類型為 void (即無返回值),則在兩個大括弧之間不能寫帶有返回值表達式的 return 語句,否則編譯器就會報錯。你寫的 test 函數返回值類型為 void,而你在函數定義語句塊內寫下了 return 語句,編譯器自然會報錯了。
你可以將這個函數修改為以下形式:
int test(int n)
{
int m = n / 2;
return m;
}
H. 請教,如何用C語言編寫一個函數。
一個函數(function)是一個可以從程序其它地方調用執行的語句塊。以下是函數定義格式:
type name ( argument1, argument2, ...) statement
說明:
type 是函數返回的數據的類型
name 是函數被調用時使用的名
argument 是函數調用需要傳入的參量(可以聲明任意多個參量)。每個參量(argument)由一個數據類型後面跟一個標識名稱組成,就像變數聲明中一樣(例如,int x)。參量僅在函數范圍內有效,可以和函數中的其它變數一樣使用, 它們使得函數在被調用時可以傳入參數,不同的參數用逗號(comma)隔開.
statement 是函數的內容。它可以是一句指令,也可以是一組指令組成的語句塊。如果是一組指令,則語句塊必須用花括弧{}括起來,這也是我們最常見到情況。其實為了使程序的格式更加統一清晰,建議在僅有一條指令的時候也使用花括弧,這是一個良好的編程習慣。
示例:每一個C語言程序有且只有一個main函數,本身main就是一個函數。結合上面的格式,自己理解一下。
intmain()
{
return0;
}
I. c語言中編寫函數
C語言函數參數是不能有指定值(預設值),這個是C++才有的
如
int
test(int
x=10);
你調用
test();
就相當於調用
test(10);
J. c語言編寫函數
思路:用數組操作,將自然數先求出他的長度,再將它換成對應位的權積存入數組中,然後累加得到結果。
#include<iostream>
using
namespace
std;
#include<math.h>
int
fun(int
n)
{
int
a[10],cnt(1),m(n),k(0);
while(m>10)
//while循環求數字的長度,看是幾位數
{
cnt++;
m/=10;
}
for(int
i=0;i<cnt;i++)
//將每一位和點到循序後的位權乘積存入數組中,並球累加和
{
int
s=pow(10,i+1);
int
t=pow(10,i);
int
r=pow(10,cnt-i-1);
a[i]=(n%s)/t*r;
k+=a[i];
}
return
k;
}
int
main()
{
cout<<fun(23456);
//用了多組數測試均成功!!!
return
0;
}