1. 程式人生 > >C語言重點知識複習1

C語言重點知識複習1

1.進位制之間的轉換
%d 十進位制輸出
%0x 十六進位制輸出
%08x 十六進位制輸出,輸出8位,如果不夠,補0

程式設計題:將十進位制的數字轉換成n進位制的數字

#include <iostream>
#include <stack>
using namespace std;

//使用stack,將得到的數字壓棧,最後逐一出棧
void MyTenToN1(int num, int n)//n表示進位制
{
    if(num < 0)
        return;
    else if(0 == num)
    {
        cout<<"0"
<<endl; return; } stack<int> st; int i = 0;//餘數 int j = num;//商 while(j != 0)//商為0是迴圈結束條件 { i = j % n; j = j / n; st.push(i); } while(!st.empty()) { cout<<st.top(); st.pop(); } cout<<endl; } //每次得到最小位的數,乘位的權重
int MyTenToN2(int num, int n) { if(num < 0) return -1; else if(0 == num) { cout<<"0"<<endl; return -1; } int i = 0;//餘數 int j = num;//商 int count = 0; int result = 0; int pow = 1; while(j != 0) { i = j % n; j = j / n; ++count; if
(count != 1) { pow *= 10; } result += i*pow; } return result; } int main() { cout<<MyTenToN1(123,2)<<endl; cout<<MyTenToN1(123,3)<<endl; cout<<MyTenToN1(123,4)<<endl; cout<<MyTenToN1(123,5)<<endl; cout<<MyTenToN1(123,6)<<endl; cout<<MyTenToN1(123,7)<<endl; cout<<MyTenToN1(123,8)<<endl; cout<<MyTenToN1(123,9)<<endl; cout<<MyTenToN2(123,2)<<endl; cout<<MyTenToN2(123,3)<<endl; cout<<MyTenToN2(123,4)<<endl; cout<<MyTenToN2(123,5)<<endl; cout<<MyTenToN2(123,6)<<endl; cout<<MyTenToN2(123,7)<<endl; cout<<MyTenToN2(123,8)<<endl; cout<<MyTenToN2(123,9)<<endl; return 0; }

程式設計題:判斷當前字母是否為大寫

#include <iostream>
using namespace std;

//由於字母的ASCII碼不一定連續,自己構建小寫字母連續的陣列,進行比較 
//引入標頭檔案#include<ctype.h>    bool islower(int ch);是庫函式
bool Myislower(int ch)
{
    int arr[] = {"abcdefghijklmnopqrstuvwxyz"};
    int len = sizeof(arr)/sizeof(arr[0]);
    for(int i=0; i<len-1; ++i)
    {
        if(arr[i] == ch)
        {
            return true;
        }
    }
    return false;
}

int main()
{
    cout<<Myislower('a')<<endl;
    cout<<Myislower('c')<<endl;
    cout<<Myislower('F')<<endl;
    cout<<Myislower('G')<<endl;
    cout<<Myislower('d')<<endl;
    cout<<Myislower('R')<<endl;
    return 0;
}

2.運算子的優先順序
(1)/和% 不能除0,不能對0取餘,程式會崩潰
(2)%運算子的運算元必須是整數

(3)<<和>>位移運算子
左移,右邊補0 右移,左邊補符號位 一般先化成二進位制再比較

(4)1<2<5 永真 要注意大於小於運算子的連續比較

(5)表示式1 && 表示式2 如果表示式1為假,表示式2不計算 編譯器優化
表示式1 || 表示式2 如果表示式1為真,表示式2不計算

3.變數的生存週期
這裡寫圖片描述

4.switch…case 找到匹配的case進;顯示的碰到break出
switch不能用float型別的數,float型別的數不能用“==”直接比較
5.巨集替換 做題的最好方法:把用到巨集的地方都替換一下,重抄程式碼計算結果
6.型別轉換
同類型,無符號的數比有符號的數寬 有符號—->無符號
算數運算時,整型(int)起
無符號左邊補0,有符號左邊補1
7.面試題:既然do…while能做的事while都可以做,為什麼還要設計do…while?
答:(1)輔助定義複雜的巨集,防止出現替換錯誤

#define SOMETHING fun1(); fun2()
if(a < 0)
    SOMETHING;

實則執行:

if(a < 0)
     fun1(); 
fun2();//fun2()始終會被執行

如果使用do…while

#define SOMETHING    do{fun1(); fun2()}while(0)
if(a < 0)
    SOMETHING;

實則執行:

if(a < 0)
    do
    {
         fun1();
         fun2();
    }while(0);

(2)避免空巨集引起的warming
核心中由於不同架構的限制,很多時候會用到空巨集,在編譯的時候,空巨集會給出warning,為了避免這樣的warning,就可以使用do{}while(0)來定義巨集。如:

#define SOMETHING do{}while(0)