2017.2.22 周三
c語言 :一門編程語言
用途 :用來編寫程序的,即按照我們的意圖和想法編寫一條條可執(zhí)行的
指令,這些指令在內(nèi)存中運(yùn)行得到一個(gè)我們想要的結(jié)果
程序 :是由多條指令集合而成,他們能工作,并能實(shí)現(xiàn)一定的功能。
程序的特點(diǎn):數(shù)據(jù)結(jié)構(gòu)+算法
數(shù)據(jù)結(jié)構(gòu) :多數(shù)據(jù)的描述,即數(shù)據(jù)以何種形式存在,是計(jì)算機(jī)操作的對(duì)象。
算法 :對(duì)操作的描述。即對(duì)數(shù)據(jù)的操作步驟。
數(shù)據(jù) :一切信息都是數(shù)據(jù),數(shù)據(jù)有可變(變量)和不變(常量)之分。
常量:特點(diǎn)
一個(gè)整型的表示方法:二進(jìn)制,八進(jìn)制,十進(jìn)制,十六進(jìn)制
變量 :1.取名 2.怎么定義一個(gè)變量
基本的數(shù)據(jù)類型 :int short long char float double
標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出:scanf printf
include <stdio.h>
//以.h為后綴的文件為頭文件,c程序的一般函數(shù)的定義都在此頭文件中
void main()
//主函數(shù),整個(gè)程序只有一個(gè)主函數(shù),它是程序開始執(zhí)行和結(jié)束的地方,
void 是函數(shù)的返回值類型,void 說明函數(shù)沒有返回值
{
printf("hello world!\n");
//程序要執(zhí)行的指令,此處為向屏幕輸出雙引號(hào)中的內(nèi)容。'\n':換行,
指令以';'為結(jié)尾
}
/*
編寫一個(gè)c程序:vim 文件名.c 即打開一個(gè).c為后綴的文件,該文件是用
來書寫c源程序,寫完之后:wq保存退出。
編譯 :gcc 文件.c 若文件源程序有語法錯(cuò)誤,在次步驟就會(huì)報(bào)錯(cuò),修
改完成后編譯成功就會(huì)生成計(jì)算機(jī)可直接執(zhí)行的二進(jìn)制文件a.out
運(yùn)行 :./a.out
*/
gcc的4個(gè)步驟:
1.預(yù)處理:gcc -E 1.c -o 1.i
包含頭文件中的內(nèi)容,做一些準(zhǔn)備工作,是整個(gè)程序真正變得完整。
2.編譯:gcc -S 1.i -o 1.s
編譯生產(chǎn)匯編文件
3.匯編:gcc -c 1.s -o 1.o
生產(chǎn)二進(jìn)制文件
4.鏈接:gcc 1.o -o 1
生產(chǎn)可執(zhí)行的二進(jìn)制文件
include <stdio.h>
void main()
{
int a=-1;
//原碼:10000000000000000000000000000001
//補(bǔ)碼:11111111111111111111111111111111
// 37777777777
// ffffffff
//數(shù)據(jù)在內(nèi)存中以補(bǔ)碼的形式存儲(chǔ)的,顯示的時(shí)候顯示的也是補(bǔ)碼
//原碼:二進(jìn)制碼,最高位為符號(hào)位,正數(shù)為0,負(fù)數(shù)為1
//正數(shù)的補(bǔ)碼=原碼
//負(fù)數(shù)的補(bǔ)碼=原碼的符號(hào)位不變,其余位取反+1
printf("%d %o %x\n",a,a,a);
}
/*
常量:
特點(diǎn):1.不能夠被改變的量
2.可以不經(jīng)說明直接使用的量
分類:
1.直接常量:
整型常量:10,20
實(shí)型常量:1.2
字符型常量:
普通字符常量(用單引號(hào)括起來的字符):'a','b'
轉(zhuǎn)義字符常量:'\n'
字符串常量:"qwerty"
2.標(biāo)識(shí)符常量:宏定義的名字
#define S 30
S即為30
整型常量的表達(dá)方式:
二進(jìn)制 :每位數(shù)上滿2進(jìn)1,0~1.
例:二轉(zhuǎn)十:1101 => 12^3+122+1*20=13
八進(jìn)制 :以0開頭,每位數(shù)上滿8進(jìn)1,0~7
例:023 轉(zhuǎn)十進(jìn)制 -> 2*8^1+3*8^0=19
十進(jìn)制 :每位數(shù)上滿10進(jìn)1,0~9,除了0之外,負(fù)數(shù)前面加負(fù)號(hào)
例:10,-1,0;
十六進(jìn)制 :以0x或0X開頭,每位數(shù)上滿16進(jìn)1,0~9 a b c d e f/ A B C D E F
例:0x23f 轉(zhuǎn)十進(jìn)制 -> 2*16^2+3*16^1+f*16^0
二轉(zhuǎn)八:
11011110 =>0336
轉(zhuǎn)16 =>0xde
基本的數(shù)據(jù)類型:
int:基本整型,用來定義整型變量,接受一個(gè)整數(shù)
// short [int]:短整型,接受一個(gè)整數(shù)
// long [int]:長整型,接受一個(gè)較大的整數(shù)
float:單精度型,接受一個(gè)實(shí)數(shù)
// double:雙精度型,接受一個(gè)較大的實(shí)數(shù)
char:字符型,接受一個(gè)字符常量
定義變量 :在內(nèi)存中根據(jù)變量的數(shù)據(jù)類型給它在內(nèi)存中開辟空間,同一個(gè)
變量只能定義一次,但是可以聲明多次
只定義不賦值:
int a;
定義的同時(shí)賦值:初始化變量
int a=10;
用運(yùn)算的結(jié)果給變量賦值
int b=1;
int c=3;
int a=b+c;
先定義后賦值:
int a;
a=10;
聲明:int a;
調(diào)用1.c 2.c
141593
變量名:
1.由字母,數(shù)字,下劃線'_'三者自由組合而成。
2.數(shù)字不能打頭。
3.在c語言中有保留字(int ,float),不能用來做變量的名字
4.在c語言中區(qū)分大小寫,所有price和PRICE是2個(gè)不同的變量
int a,b,c=10,d;
轉(zhuǎn)義字符:以‘\’開頭的字符常量,具有特殊的功能
\n 換行
\r 回車
\b 退格
\t 制表符tab
' 輸出'
" 輸出"
\ 輸出\
printf() :標(biāo)準(zhǔn)輸出函數(shù),指向顯示屏輸出數(shù)據(jù)
格式:printf("格式控制=格式聲明+普通字符",輸出表列);
例:printf("a=%d\n",a);
注:在雙引號(hào)中,以%開頭的較格式聲明,它是控制輸出表列中的數(shù)據(jù)
以何種形式輸出,雙引號(hào)中的其他字符叫普通字符,是會(huì)原樣輸出的。
格式聲明:
1.d格式符 :輸出帶符號(hào)的十進(jìn)制數(shù)
%d :輸出十進(jìn)制數(shù)
%nd :輸出的數(shù)占n個(gè)字寬,從右邊開始
%ld :輸出長整型數(shù)。
2.c格式符 :輸出字符型數(shù)據(jù)
%c :輸出一個(gè)字符
%nc :輸出的字符占n個(gè)字寬
3.f格式符 :輸出實(shí)型數(shù)據(jù)
%f :整數(shù)部分全部輸出,默認(rèn)輸出小數(shù)后六位,第七位四舍五入
%.nf :整數(shù)部分全部輸出,小數(shù)部分輸出n位,第n-1位四舍五入。
%lf :輸出雙精度型數(shù)據(jù)
4.s格式符 :用來輸出字符串
5.o格式符 :用來輸出八進(jìn)制數(shù)
6.x格式符 :用來輸出十六進(jìn)制數(shù)。
*/
scanf() :標(biāo)準(zhǔn)輸入函數(shù),從鍵盤上按指定的格式獲取輸入的數(shù)據(jù)。
格式 :scanf("格式控制",輸入表列);
格式控制 :同printf,
輸入表列 :在每個(gè)變量前加&
例:
#include <stdio.h>
void main()
{
int a;
float b;
scanf("%d%f",&a,&b);
printf("%d %.1f\n",a,b);
}
/*
1.當(dāng)scanf中的格式控制符之間緊緊相鄰,則在輸入數(shù)據(jù)的時(shí)候,默認(rèn)各數(shù)據(jù)
之間以空白符間隔(tab,空格,enter).輸入數(shù)據(jù)結(jié)束后按回車結(jié)束。
*/
練習(xí):從鍵盤上一次獲取int a;float b,char c三個(gè)變量的數(shù)據(jù),并輸出他們的值。
include <stdio.h>
void main()
{
int a;
float b;
char c;
scanf("%d %f %c",&a,&b,&c);
printf("%d %.1f %c\n",a,b,c);
}======================================
/*
在scanf的雙引號(hào)中格式控制符之間通常以空格間隔,輸入的時(shí)候輸入空格間隔。
通常,雙引號(hào)中有什么普通字符,那么輸入數(shù)據(jù)的時(shí)候就原樣輸入什么字符。
例 :scanf("a=%d,b=%d,c=%f",&a,&b,&c);
輸入:a=1,b=2,c=1.2<回車>
*/
include <stdio.h>
void main()c=2
{
int a;
char b;
int c=scanf("%d",&a);//scanf有返回值,返回?cái)?shù)據(jù)列表的變量個(gè)數(shù)。
getchar();//吸收殘留回車
scanf("%c",&b);
printf("a=%d b=%c\n",a,b);
}
ASCII:給每一個(gè)存儲(chǔ)的字符找到的對(duì)應(yīng)的數(shù)字
'a':97
‘0’:48
1.每一個(gè)大寫字母比它的小寫字母的碼值小32
2.后面一個(gè)字母比前一個(gè)字母的碼值大1
3.后一個(gè)數(shù)字的碼值比前一個(gè)數(shù)字大1
練習(xí):輸入一個(gè)大寫字母,輸出它對(duì)應(yīng)的小寫字母。
#include <stdio.h>
void main()
{
char ch,A='B';
ch=A+32;
printf("%c\n",ch);
// scanf("%c",&ch);
// printf("%c\n",ch+32);
}
c語言中的注釋:注釋只是便于閱讀,不參與編譯,
1. // :單行注釋
2./×...×/:多行注釋
int sizeof(變量名/類型名);計(jì)算變量或類型在內(nèi)存中所占的字節(jié)的大小。
#include <stdio.h>
void main()
{
int a;
printf("%d\n",sizeof(a));
printf("int:%d short:%d long:%d float:%d double:%d
char:%d\n",sizeof(int),sizeof(short),sizeof(long),
sizeof(float),sizeof(double),sizeof(char));
}
算術(shù)運(yùn)算符:加(+),減(-),乘(*),除(/),求模/求余(%)
1.兩個(gè)整數(shù)相除,結(jié)果一定是整數(shù),小數(shù)部分直接抹掉。
例:printf("%d\n",5/2);
2.求模運(yùn)算符2邊的操作數(shù)必須是整數(shù)
不同類型的數(shù)據(jù)間的混合運(yùn)算:
1.把float型的數(shù)據(jù)賦給int型數(shù)據(jù),整數(shù)部分賦值,小數(shù)部分丟失
2.把int型數(shù)據(jù)付給float型數(shù)據(jù),數(shù)據(jù)不丟失,多了6個(gè)0
3.字符可以和整數(shù)直接進(jìn)行運(yùn)算,他們可以看做相互等價(jià)的。
4.在printf中格式聲明輸出的變量列表中的變量類型得嚴(yán)格匹配,除了字符
和整數(shù)之間可以互相等價(jià)之外。
強(qiáng)制類型裝換運(yùn)算符:()
例:
#include <stdio.h>
void main()
{
float a=7.8;
int b=3;
printf("%d\n",(int)a%b);//%左右的操作數(shù)類型必須是int型,所以此需要強(qiáng)轉(zhuǎn)
}
適用于自動(dòng)類型轉(zhuǎn)換不能夠進(jìn)行的時(shí)候使用,并沒有改變變量的真實(shí)數(shù)據(jù)類型,
只是產(chǎn)生了相應(yīng)的中間變量。
練習(xí):有4個(gè)水渠a,b,c,d往一個(gè)池子里注水,單開a,1天注滿;單開b,2天注滿;單開c,
3天注滿;單開d,4天注滿;請(qǐng)問,a,b,c,d同時(shí)開,幾天注滿。
#include <stdio.h>
void main()
{
float a=1,b=2,c=3,d=4;//a=1.000000
printf("%f\n",1/(1/a+1/b+1/c+1/d));
}
自增運(yùn)算符:++使變量的值加1
前置加加:++i 用(i)之前加
后置加加:i++ 用(i)之后加
例:#include <stdio.h>
void main()
{
int i=1;
// printf("%d\n",++i);
// printf("%d\n",i);
printf("%d\n",i++);
printf("%d\n",i);
}
自減運(yùn)算符:--使變量的值減1
前置減減:--i 先自減再用
后置減減:i-- 先用再自減
a=i++;
a=++i;
a=i--;
a=--i;
#include <stdio.h>
void main()
{
int i=1,a;
//a=i++;
a=++i;
printf("%d\n",a);
printf("%d\n",i);
// printf("%d\n",i++);
// printf("%d\n",i);
}
putchar(字符常量/字符變量);
例:
#include <stdio.h>
void main()
{
putchar('a');
char a='b';
putchar(a);
putchar('\n');
}
練習(xí):向屏幕輸出boy
#include <stdio.h>
void main()
{
/* putchar('b');
putchar('o');
putchar('y');
putchar('\n');*/
putchar(98);
putchar(111);
putchar(121);
putchar('\n');
}
getchar():從標(biāo)準(zhǔn)輸入(鍵盤)獲取一個(gè)字符,該函數(shù)有返回值,返回獲取的那個(gè)字符,
如果沒有獲取到,會(huì)一直等待,直到獲取到,因此可以利用該特性進(jìn)行暫停程
序的運(yùn)行,在在調(diào)試代碼的時(shí)候可以單步運(yùn)行
例:
#include <stdio.h>
void main()
{
char ch=getchar();
putchar(ch);
}
練習(xí):從鍵盤輸入boy,并輸出boy.
#include <stdio.h>
void main()
{
/*
char ch1=getchar();
char ch2=getchar();
char ch3=getchar();
putchar(ch1);
putchar(ch2);
putchar(ch3);
putchar('\n');*/
char ch=getchar();
putchar(ch);
ch=getchar();
putchar(ch);
ch=getchar();
putchar(ch);
putchar('\n');
}
1.程序是順序執(zhí)行,從第一行依次往下執(zhí)行,同一行如果有多條指令,從左往右執(zhí)行。
2.“左=右” :等號(hào)叫賦值運(yùn)算符,即先執(zhí)行右邊的,再執(zhí)行左邊的,把右邊的值付給左邊的變量
3.從鍵盤上輸入數(shù)據(jù)的過程:從鍵盤上輸入數(shù)據(jù),直到按了回車鍵才會(huì)把所有的數(shù)據(jù)放到鍵盤緩沖區(qū)中去,當(dāng)程序運(yùn)行的時(shí)候需要獲取輸入,如果鍵盤緩沖區(qū)中有數(shù)據(jù),則會(huì)自動(dòng)去鍵盤緩存區(qū)中依次取,如果緩沖區(qū)中沒有了數(shù)據(jù),才會(huì)需要你繼續(xù)從鍵盤輸入數(shù)據(jù),直到你按了回車鍵才把數(shù)據(jù)的數(shù)據(jù)繼續(xù)填充到鍵盤緩沖區(qū),然后再從緩沖區(qū)中取數(shù)據(jù)