Saturday, January 28, 2006

第17屆自控社寒訓結束

謝謝各位學弟妹的配合,讓此次寒訓能夠圓滿結束。
此部落格將會一直存放,如果有需要一樣可以到這邊來尋找你所想要的資料。
關於寒訓結束前的四個作業,過一陣子我會把範例(或者是同學寫得不錯的程式碼)放上來,然後也會再補充最後一堂課的goto語法。
最後還是再次感謝學弟妹,這段期間真的很快樂,也同時讓我自己也學了一些東西,希望大家假期愉快!新年都有新的氣象,紅包多多嚕!
有任何疑問都可以來找自控社的學長姐們
我們社辦在活動中心的三樓
下學期也會有陸陸續續的其他活動
如社團出遊等
希望你們也可以多多來參加喔!!

阿關下台一鞠躬~~

Wednesday, January 25, 2006

[常犯錯誤]if語法的正確使用

  • 正確使用範例
輸入"93"
輸出"A"


  • if語法的誤用範例

輸入"93"
輸出"ABCD"

[前社長]耕宇學長的留言





















大家的表現,自控社的每個學長姊都很關心的喔!!

[補充]區域變數與外部變數

區域變數:(社課中所有範例都是給予區域變數)
區域變數(local variable)的「活動範圍」只有在所屬的區段中(通常為一個函數)有效,其他區段都無法使用這個區域變數。區域變數的生命週期(Lifetime)只有在變數所屬的函數被呼叫時開始,到函數執行結束時也隨之結束。

外部變數:
外部變數(External Variable)則是在涵數外面所宣告的變數,又稱為「總體變數」或者「全域變數」(Global Variable)。當變數定議程外部變數之後,函數及程式區段皆可以使用這個變數。但其中要注意的是,從該定義敘述以下的所有程式區段及函數都是使用外部變數的當然成員,,如果在定義敘述之前的區想要使用時,就必須利用宣告的方式才能夠使用。
例:summer所使用的便是外部變數

[寒訓成果]

  1. 終極密碼
  2. 猜數字
  3. 輾轉相除法
  4. 大樂透

Tuesday, January 24, 2006

[補充]氣泡排序法



參考程式:
====================
#include
#include
void main()
{
int a[6],i,j,temp;

printf("Enter six numbers.\n");

for(i=0;i<=5;i++)
scanf("%d",&a[i]);

for(i=0;i<=4;i++)
{
for(j=0;j<=4-i;j++)
{
if(a[j]>=a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}

printf("Small to Large:");

for(temp=0;temp<=5;temp++)
printf("%-5d",a[temp]);

printf("\nLarge to Small:");

for(i=5;i>=0;i--)
printf("%-5d",a[i]);

printf("\n");

system("pause");
}
====================

Monday, January 23, 2006

Lab 1/23 副程式練習

寫一個平方功能的副程式
使傳進去副程式的值
平方過後回傳給主程式
並print出來

Lab 1/23 副程式的觀念

練習講義第100頁的程式
並回文告訴我執行後的樣子

Saturday, January 21, 2006

Lab 1/21 陣列

參考程式:
========================
#include
void main()
{
int i,number[6];

for(i=0;i<=5;i++)
{
scanf("%d",&number[i]);
}

printf("您所輸入的第三個數字為%d\n",number[2]);
}
========================

課堂練習:
利用陣列搭配for迴圈熟悉語法
注意陣列長度、陣列型態等問題
請將所輸入的六個數字到過來輸出
Ex:
輸入:1,2,3,4,5,6
輸出:6,5,4,3,2,1

Lab 1/21 Switch練習

參考程式:
========================
#include
#include
#include
void main()
{
int i,count1=0,count2=0,count3=0,count4=0,count5=0,count6=0;

srand((unsigned)time(NULL));

for(i=1000;i>0;i--)
{
switch(rand()%6+1)
{
case 1:
count1++;
break;
case 2:
count2++;
break;
case 3:
count3++;
break;
case 4:
count4++;
break;
case 5:
count5++;
break;
case 6:
count6++;
break;
default:
break;
}
}

printf("擲骰子1000次出現點數3的次數為%d\n",count3);
}

========================

課堂練習:
請在原程式後面加上一個功能
使原本
printf("擲骰子1000次出現點數3的次數為%d\n",count5);
變更成可以選擇"所出現的點數"並只print那個點數出現的次數

Friday, January 20, 2006

[補充]1/20 修飾子

常用修飾子:
  1. %-4d
  2. %4d
  3. %+4d

他們各是什麼意思呢?

感謝家緯提供資訊!!

[預告]自控社C語言寒訓成品

每人可選擇一種以上的主題並將它完成
  1. 猜數字
  2. 終極密碼
  3. 輾轉相除法
  4. 大樂透
  5. 漢諾塔
詳細內容之後會在介紹

Lab 1/20 do while迴圈練習

參考程式:
====================
#include
void main()
{
int a;

do
{
printf("請輸入正整數:");
scanf("%d",&a);
}while(a<=0);

printf("您所輸入的數字為%d\n",a);
}

====================

課堂練習:
輸入一個正整數n(必須被驗證,如不符合要重新輸入)
使用do while迴圈,輸出n!的結果
P.S. n!=1*2*3*.....*n

Lab 1/20 利用隨機函數計算機率

參考程式:
====================
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
void main()
{
int i=1;

srand((unsigned)time(NULL));

while(i<=10) { printf("%d\n",rand()); i++; } } ==================== 內容說明:
  1. rand()是取亂數的函數,放在stdlib.h標頭檔裡面
  2. 如果只利用rand()函數取亂數時,會取出相同的種子序列。因此,利用時間函數time()當成srand()函數的參數,以改變每次執行rand()函數所取的種子序列
課堂練習1:
試試看,加了"srand((unsigned)time(NULL));"與不加有沒有什麼差別。

課堂練習2:
利用while迴圈加上亂數函數,請寫出擲骰子1000次,點數3所出現的次數

Lab 1/20 用迴圈寫九九乘法表

課堂練習1:
用巢狀for迴圈配合'\t'(跳格)和'\n'(換行)
在螢幕上print出如以下的九九乘法表
課堂練習2:
用巢狀while迴圈重寫九九乘法表
比較兩者,有沒有什麼覺得要特別注意的地方?

Thursday, January 19, 2006

上課感想

這次寒訓C語言課程總共9堂
上到今天為止,也算是過了三分之一
目前程式語言進度已經進入迴圈部分
迴圈是一種相當重要的語法
一定要學好並且善用

由於每個同學參加寒訓的底子不同
阿關會盡量給予大家合宜的學習環境
剛上手的學弟妹千萬不要急
沒有要求你們一定要完成所有的進度
程式聽再多、看再多
只有自己從腦子想出來的才是你的

因此,如果覺得不是那麼容易上手的學弟妹
可以從blog上面所給予的範例練習起
雖然上課時候會講解一次
可是不要看程式碼
試著自己再打一次
相信那種感覺還是不太一樣的
然後慢慢地作業能作多少就作多少
盡量由自己的思路下去慢慢偵錯
這是必經的成長路程
(當然多看好的例子,也有助於增長自己的經驗)

寒訓還有2/3的課程
讓我們一起加油吧!!
希望你們這個寒假真的是能夠有所收穫!!!

[同學範例]聖誕樹

這個程式碼不錯的一點是
有顧慮到聖誕樹的樹幹位置
不過這個程式碼也一樣有變數設定上的問題
下面是原本的變數設定
利用上一篇的概念,想想看,該如何簡化變數設定呢?

P.S.
以下圖檔我將
for(i,k=1;i>0;i--,k+=2)
改成

for(k=1;i>0;i--,k+=2)
因為i值並沒有要另外設給它初始值,故可以省略

[同學範例]菱形(變數修正比較)

原程式碼我有稍稍更改兩個地方
  1. 將變數的設定全部移到程式的開頭
  2. 將可以刪除的{}刪掉(太多不必要的{}有時反而容易令人眼花)
簡化後的程式碼:
int a,i,m,k;




















原本的變數設定樣子:
int a,i,k,m,n,o,p;




[同學範例]使用兩個變數的for迴圈

Lab 1/19 for迴圈練習-2

課堂練習2:

試著print出下面圖案

Lab 1/19 for迴圈練習-1

參考程式:
===================
#include
void main()
{
int i,j;
for(i=3;i>0;i--)
{
for(j=3;j>0;j--)
printf("*");
printf("\n");
}

}
===================


課堂練習1:

print出以下圖形
*
**
***
****
*****

Lab 1/19 for迴圈

參考程式:
====================
#include
void main()
{
int i,sum=0; /*設整數變數i、sum,其中sum給予初始值0*/

for(i=1;i<=10;i++)
sum+=i;
/*i從1開始跑,只要i<=10,就會執行sum=sum+i的動作
執行完for迴圈裡面的動作, i會執行i=i+1的動作,重複檢查i是否<=10*/

printf("%ci=%d\t(i=1~10)\n",228,sum);
}
====================


詳細內容:






















Lab 1/19 if敘述

參考程式:
====================
#include "stdio.h"
void main()
{
if(3>5)
{
printf("3>5 is ture.\n");
}

if(3<5)
{
printf("3<5 is ture.\n");
}

printf("\"End\"\n");
}

====================

課堂練習1:
去除掉紅色括弧後執行結果一樣嗎?為什麼?
什麼情況可以不用
括弧?什麼情況一定要用括弧?

課堂練習2:
輸入a、b兩整數
print出較小的值

1/18 [補充]運算模擬


1/18[補充]運算式的型態轉換法則

  1. 佔用的位元組較少的轉換成位元組較多的型態。(如:2 bytes的short int型態遇上4 bytes的int型態,會轉換成int型態)
  2. 字元型態會轉換成int型態。
  3. int型態會轉換成float型態。
  4. 於運算式中,若某個運算元的型態為unsigned(無號型態只在char及int型態中出現),則另一個運算元也會轉換成unsigned型態。
  5. 運算式中的某個運算元的型態為double,則另一個運算元也會轉換成double型態。

參考程式:
====================













====================

詳細內容: