2016年2月28日 星期日

考古題

1. C/C++ 類:
   1.1 const int* p 和 int* const q 兩者之差別?

       一、 const int* p  指標內容不可更動。
           //*p=10;/*錯誤*/
      二、 int * const p 指標不可更動。//p++;/*錯誤*/
                                               
   1.2 32-bit machine用C語言對位址 0x00005000 的第三個bit設成0,第五個bit設成1。
       unsigned int a=0x00005000
       a &= 0xFFFFFFFB(1111 1111 1111 1111 .... .... .... .... 1011)
       b |=   0x000000010(0000 0000 0000 0000 .... .... .... ...1 0000)
                                               
   1.3 指標與陣列的差別?
      就記憶體方向來看,"指標"所用的記憶體位置不為連續,而"矩陣"所配置的空間為連續。
   1.4 試寫出一個Macro求出兩數之最大值。
      #define MAX(a,b)   ((a)>= (b) (a):(b))
   1.5 #define SUM(a,b)  a+b
                若是 SUM(2,5)*10 的答案是什麼?                        
如何定義巨集?
語法 1:#define 巨集名稱 [替代內容]
語法 2:#define 巨集名稱(引數列) 運算式
功能:巨集名稱可用來定義常用的常數、字串、簡單的數學公式                   或函式。
(1)習慣大寫命名
(2)不用分號結尾
(3)當運算overflow時記得加上UL
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
(4)定義運算函式時要小心()的使用

ex1.
#define SQR(x)      ((x)*(x))..... (a)
#define SQR(x)      (x*x).............(b)
(a)與(b)式分別帶入3+2所表示的結果會不相同

(a)會是(3+2)*(3+2) =25
(b)會是3+2*3+2 =11

ex2.
#define SUM(a,b)  a+b
int main(void) {
int c;
c= SUM(2,5)*10; //c=a+b*10;
printf("%d" , c );
return 0;
}
求c為多少? c=52 ,
                                                     
   1.6 給予10個任意整數,輸出其最小值、最大值、平均值。
      float a[10];
      float max=min=avg=sum=0;
      for(int i=0;i<10;i++)
      { cin >> a[i];  }
      for(int j=0;j<10;j++)
      { if(a[j]>max) max=a[j];
        if(a[j]<min) min=a[j];
        sum=sum+a[j];
       }
         avg=sum/10;
                                   
   1.7 __interrupt double isr(double r)
      {
         double area = PI*r*r ;
         printf("%f\n",area) ;
         return area ;
      }
      說明並解釋上述之interrupt service routine 之錯誤處?

   1.8  寫出一個字串拷貝程式: void StrCpy(char* dst , char* src) ;
void strcpy(char *s, char *t) // array version
{
 int i;
 i = 0;
 while((s[i] = t[i]) != '\0')
i++;
}

void strcpy(char *s, char *t) // pointer version
{
 while((*s = *t) != '\0') {
s++;
t++;
 }
}
   1.9  寫出整數轉換字串程式
#include "stdafx.h"
#include<iostream>
#include<sstream>
using namespace std;

template<class T>
void to_string(string & result, const T& t)
{
ostringstream oss;//創建一個流
oss << t;//把值傳遞如流中
result = oss.str();//獲取轉換後的字符轉並將其寫入result
}
int main()
{
string s1, s2, s3;
to_string(s1, 10.5);//double到string
to_string(s2, 123);//int到string
to_string(s3, true);//bool到string
cout << s1 << endl << s2 << endl <<s3;
system("pause");
return 0;
}

   1.10 寫出一個程式若輸入為 12345678 , 則返回值為 56781234
       DWORD  fun(DWORD num)

   1.11  int  fun(int x)
        {
          int count = 0 ;

           while(x){
             count++ ;
             x = x & (x-1) ;
          }
          return count ;
        }
       若x=456;則return值為多少?

   1.12  void func(void){
          static int i = 0 ;
          i++ ;
          printf("%d" , i ) ;
        }
        連續呼叫 func 10 次,印出的值為何?

   1.13  何謂this指標?何謂template?何謂virtual function?

   1.14  寫出一個程式輸入幾點幾分,return 值為時針與分針的角度
        (需注意若為9:00則其角度為90度,非270度)


 2. OS類:
    2.1 何謂reentrant程式,設計reentrant需注意什麼?

    2.2 解釋stack與heap

    2.3 何謂deadlock?

    2.4 說明 mutex 與 semaphore

    2.5 設計OS的重點在哪些?

    2.6 如何 Linux 與 windows 互相傳送檔案?

    2.7 何謂DLL?

    2.8 uClinux 與 Linux 最大差異在哪?

    2.9 何謂即時多工系統?

 3. 計組、硬體類:
   3.1 何謂DMA,有何好處?

    3.2 何謂Little endian / Big endian

    3.3 何謂 JTAG? 何謂ICE?

    3.4 解釋 write back 與 write through

    3.5 列舉幾個serial port, parallel port

    3.6 說明 Watchdog 之運作機制

 4. 網路類:
    4.1 分別說明switch、hub、router、gateway

    4.2 何謂IP fragment?

    4.3 說明DHCP server功能

    4.4 說明IP、subnet mask

    4.5 說明 3-way handshaking

2016年2月27日 星期六

-> 和 . 的差別

struct User
{
 char name[40]; //can't do dynamic memory allocation in definition
 int age; //int age =18; //can't initialize member in definition
 int tel;
};

User userObject;
strcpys(userObject.name, "Micheal");
userObject.age = 20;
userObject.tel = 1234567;

User* userPtr = &userObject;
strcpy_s(userPtr->name, "Micheal");
userPtr->age = 20;
userPtr->tel = 1234567;



C/C++所提供的函式參數傳遞方式:

1.Call by value 傳值
2.Call by address傳址 (與1.不同在一個裝"變數" 一個裝"地址")
ex:

void function (int *x, int *y);
      function(&a,&b); // or function(a,b);
      //相當於 int *x=&a; int *y=&b;
3.Call by reference 傳參考 (取別名,但還是存取同樣空間)
ex:

void function (int &x, int &y);
      function (a,b);
      //相當於 int &x=a; int &y=b;

範例一、
int gint = 0; //全域變數
void changePtr (int *pInt)
{
    pInt = &gint; //將全域變數放入
}
void main ()
{
    int local_int = 1; 
    int *localPtr = &local_int;
    changePtr (localPtr); //期望
    printf ("%d\n", *localPtr);
}

以上為2.的實現,printf出來的還是1,因為傳進去的地址放在另一個較pInt的變數裡,就 pInt 和 localPtr 來說,兩個是一樣的只是名子不同。所以說把 gint 的位置放入 pInt 影響不到 localPtr 。

範例二、
int gint = 0;
void changePtr (int **pInt)
{
    *pInt = &gint;
}
void main ()
{
    int local_int = 1;
    int *localPtr = &local_int;
    changePtr (&localPtr);
    printf ("%d\n", *localPtr);
}

以上為利用雙指標指向存放的變數做修改所以輸出是0。

複習-Linklist 的建制及反轉

#include
#include "stdafx.h"
#include 
#include
#include
#include

using namespace std;
typedef  struct Node
{
 string data;
 struct Node* next;
}LinkList;


LinkList * creatList( string);
LinkList * reverseList(LinkList *);
int main()
{
 string str1;
 LinkList * list = new LinkList;
 cout << "Please input a string:\n";
 cin >> str1;
 list=creatList( str1);
 
 //list = reverseList(list);
 /*for (int i = 0; i < str1.size(); i++)
 {
  cout << str1[i] << endl;
 }*/

 list = reverseList(list);
 cout << endl;
 LinkList * ptr = list;
 while (ptr!=NULL)
 {  
  cout<< ptr->data;
   ptr = ptr->next;
 }
 system("pause");
 return 0;

 //Node* head  =insertNodefromHead(a);
}

LinkList * creatList( string str)
{
 LinkList *head=new LinkList;
 LinkList *ptr = head;

 for (int i = 0; i < str.size(); i++)
 {
  ptr->data = str[i];
  if (i + 1 == str.size())
   ptr->next = NULL;
  else
  {
   ptr->next = new LinkList;
   ptr = ptr->next;
  }
 }
 return head;
}

LinkList * reverseList(LinkList * list)
{
 LinkList *prev=NULL,*curr,*next;
 curr = list; // 放置head為第一個
 while (curr != NULL)
 {
  next = curr->next;
  curr->next = prev;
  prev = curr;
  curr = next;
 }
 return prev;
}

ptt_C語言常見問題十三誡


1.不可以使用尚未給予適當初值的變數

2.不能存取超過陣列既定範圍的空間

3.不可以提取不知指向何方的指標

4.不要試圖用 char* 去更改一個"字串常數"

5. 不能在函式中回傳一個指向區域性自動變數的指標

6.不可以只做 malloc(), 而不做相對應的 free()

7.在數值運算中、賦值或比較中不可以隨意混用不同型別的數值

8在一個運算式中,不能對一個基本型態的變數修改其值超過一次以上

9.在Macro 定義中,務必為他的參數個別加上括號

10.不可以在stack設置過大的變數

11.使用浮點數精確度造成的誤差問題

12.不要猜想二維陣列可以用 pointer to pointer 來傳遞

13.函式內 new 出來的空間記得要讓主程式的指標接住