c語言常用小知識點總結1

aFakeProgramer發表於2018-08-15


#define 用來定義巨集常量
格式:#define 識別符號(大寫字母) 常量
     #define  PI 3.14     //注意後面是不加;分號的
     常用字母的ASCII碼 'a'=97   'A'=65  '0'=48
     
變數的輸出
printf("引數",變數名);  字串%s   char %c   int %d   float %float
printf("%10d",a);前面多加空格=10-變數的寬度
變數的輸入: scanf("%引數",&變數名);

rand能夠產生隨機數,需要加標頭檔案#include "windows.h"
格式: rand()%(大數-小數)+小數
       rand()%90+10 //產生10~100之間的隨機數
如何確保每次執行所產生的隨機數都不一樣?
srand(unsigned)time(NULL);//這行程式碼只需要執行一次
time函式需要time.h標頭檔案支援,#include "time.h"

do{
    語句體;
}while(條件);//這邊的;一定要加

延遲函式sleep(1000);//延遲1秒
system("color 背景顏色");//使用#include "windows.h"
        文字顏色/背景顏色
以0開頭的是八進位制 0123=83(十進位制)
以0x開頭的是十六進位制 0123=291(十進位制)
一維字元陣列的輸入輸出
整體輸入: scanf("%s",陣列名);//這裡陣列名就是地址,不需要&
           gets(陣列名);//可以輸入任何字元
區別:用scanf不能輸入空格,他會把輸入的空格當成'\0'
puts(陣列名);          printf("%s",陣列名);
gets(陣列名);


//對字串進行修改會用到#include"string.h"
strcpy函式  strcpy(串1,串2);//串1=串2,串2的長度不能大於串1的長度
strlen函式  strlen("字串“);//
          n = strlen(陣列名);//一個字串含有字元個數,不包含'\0'
          n = strlen(一維字元型陣列);
          m = sizeof(陣列名);//測量陣列長度
char a[100];
m = sizeof(a);//m=100
strcmp函式,用來比較兩個字串的大小
if(strcmp(字串1,字串2)>0)//串1>串2
if(strcmp(字串1,字串2)=0)//串1=串2
if(strcmp(字串1,字串2)<0)//串1<串2
if(strcmp(字串1,字串2))//串1不等於串2
分別取出兩個字串的每個字元來比較直到不等,然後由不等的字元來決定
strcat函式,用來連線兩個字串
strcat(串1,串2);//返回值為:串1+串2
strupr函式:把一個字串中小寫字母變成大寫字母,其他不變
strlwr函式:把一個字串中大寫字母變成小寫字母,其他不變


c語言中常見錯誤:
缺少;
缺少括號,小括號或花括號的不配對。
"/"與"\"的混用
單引號與雙引號的混用
= 與 == 的混用   在條件表示式 if(  ==  )
邏輯& 和邏輯 |
短路&&和短路 ||
整除運算子  /
求餘運算子 %
y+=1;改成  y+=(double)1/(i*i);
   或改成  y+=1.0/(i*i);
   
   輸入一個數求他每一位上的數字和
   while(n)
   {
       s+=n%10;
       n=n/10;
   }
   
   
   int i,t=1;
   for(i=1;i<=y;i++)
   {
       t=t*x;
   }
   return  t;
   
   
  a?b:c

性質:

1、相當於條件判斷語句

首先判斷a是真是假,真就執行b,假就執行c,不會同時又判斷a的真假的同時,又運算a,b的結果,最後再根據a的真假對a,b取捨,不會這樣的。


2、結合方式從右向左分組運算

a=b>c?d:e-f?g-h:i+j

實際先運算e-f?g-h:i+j三目表示式的結果,然後再計算前面的三目表示式,最後賦值給a。

k=*p++  先把*p的值賦給k之後p+1
k=(*p)++  先把*p的值賦給k之後*p+1
k=++(*p)  先把*p的值加1,再把*p的值賦給k,*p+1是指標指向的變數+1
k=*(++p) 先把指標p+1,之後把*p的值賦給k

二叉樹是一種非線性結構
滿二叉樹一定是完全二叉樹
但完全二叉樹並不一定是滿二叉樹
性質:
在二叉樹的第k層上之多有2的k-1個節點(k>=1)
深度為m的二叉樹至多有2的m次方-1個節點
對任何一刻二叉樹度為0的節點(即葉子節點數)總比度為2的節點多一個
具有n個節點的完全二叉樹的深度至少為(log 2為底  n )+1,其中(log 2為底  n )取它的整數部分

建立連結串列
STU *createlink(STU a[],int n)
{
    STU *head;
    int i;
    head=&a[0];//表示吧陣列a中第一個元素給頭指標
    for(i=0;i<n-1;i++)
    {
        a[i].next=&a[i+1];
    }
    a[n-1].next=NULL;
    return head;
}

head=createlink(a,8);
output(head);
輸出連結串列:
void output(STU *head)
{
    STU *p = head;
    while(p != NULL)
    {
        printf("%s\t%s\n",p->id,p->name);
        p=p->next;
    }
}

連結串列的刪除
STU *p=head,*front;
while(P! = NULL)
{
    if(strcmp(p->id,id) == 0)//找到要刪除的節點
        break;
    front = p;//front總是跟著p的後面
    p = p->next;
}
if(p!=NULL)
{
    front->next = p->next;
}
retrun head;


詢問迴圈程式
char answer;
do{
    //要迴圈的語句體
    printf("要繼續嗎?(y/n)");
    answer=getchar();//獲取y/n
    getchar();//消化掉Enter鍵,不然會退出迴圈
    
}while(answer == 'y');

陣列的反轉:
a[n]={..........};
int i,j,t;
for(i=0,j=n-1;i<j;i++,j--)
{
    t=a[i];
    a[i]=a[j];
    a[j]=t;
}
陣列的插入:
for(i=0;i<9;i++)
{
    if(insert<s[i])
        break;
}
index=i;
for(i=9;i>=index+1;i--)
{
    a[i]=a[i-1];
}//產生空位
a[index]=insert;//插入值
怎樣使用遞迴呼叫程式設計?
什麼樣的程式適合用遞迴方法:
這個程式的特徵符合前項與後項有某種關係
已知某項的值(退出遞迴的條件)
如果要迴圈也可使用遞迴來代替換換

相關文章