基礎語法
輸出語句
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
printf("Hello world");
printf(" \n-------分界線2------- \n");
printf("Hello world \n");
printf(" \n-------分界線3------- \n");
printf("Hello \n world \n");
printf(" \n-------分界線4------- \n");
printf("Hello \n");
printf("world \n");
printf(" \n-------分界線5------- \n");
printf("Hello world \a\a\a\n");
return 0;
}
- printf:在顯示器上進行輸出操作,末尾的f代表format【格式化】
- \n是換行字元
- \a是響鈴的轉義字元,在顯示您好之後響鈴3次
變數
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int vx;
printf("vx的值是%d",vx);
printf(" \n-------分界線2------- \n");
int vy=100;
printf("vy的值是%d",vy);
return 0;
}
輸入輸出語句
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int no;
printf("Please input a postive number:");
scanf("%d",&no);
printf("The number is %d \n",no);
printf(" \n-------分界線2------- \n");
int n1,n2;
puts("Please input two numbers:");
printf("The first number is: "); scanf("%d",&n1);
printf("The second number is:"); scanf("%d",&n2);
printf("The result of the addition:%d \n",n1+n2);
printf(" \n-------分界線3------- \n");
int n3,n4;
int wa;
puts("Please input two numbers:");
printf("The first number is: "); scanf("%d",&n3);
printf("The second number is:"); scanf("%d",&n4);
wa=n3+n4;
printf("The result of the addition:%d \n",wa);
return 0;
}
- scanf函式可以從鍵盤讀取輸入的資訊
- 這裡同樣可以用“%d"來限制函式只能讀取十進位制數
- 與printf函式不同,在使用scanf函式進行讀取時,變數名前必須加上一個特殊的符號&。具體含義後續說明
- puts函式末尾的s來自string,可以按順序輸出字串,並在結尾換行相當於printf("\n")
- 第三組中對程式進行了修改,先將結果儲存在wa中再輸出,這裡不明顯,但是在複雜的程式中可以有明顯的優勢
運算和資料型別
運算子
#include <stdio.h>
int main(void)
{
int vx,vy;
puts("Please input two numbers");
printf("The number vx :"); scanf("%d",&vx);
printf("The number vy :"); scanf("%d",&vy);
printf("vx + vy = %d\n",vx+vy);
printf("vx - vy = %d\n",vx-vy);
printf("vx * vy = %d\n",vx*vy);
printf("vx / vy = %d\n",vx/vy);
printf("vx % vy = %d\n",vx%vy);
printf("vx %% vy = %d\n",vx+vy);
return 0;
}
- 讓我們來看一下程式中輸出餘數的地方( 藍色底紋部分)。格式化字串中寫的是%%。這裡的格式化字串中的%號具有轉換說明的功能。因此,當不需要進行轉換說明,而只想輸出%的時候,就必須寫成%%。
- 當使用不具有轉換說明功能的puts函式來進行輸出的時候,就不能寫成% (這樣會輸出%%的)。
資料型別
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int n;
double x;
n=9.99;
x=9.99;
printf("int 型變數n的值:%d\n",n);
printf(" n / 2:%d\n",n/2);
printf("double型變數x的值:%f\n",x);
printf(" x /2.0:%d\n",x/2);
printf(" \n-------分界線2------- \n");
double vx,vy;
printf("The number vx is:"); scanf("%lf",&vx);
printf("The number vy is:"); scanf("%lf",&vy);
printf("vx + vy =%f\n",vx+vy);
printf("vx - vy =%f\n",vx-vy);
printf("vx * vy =%f\n",vx*vy);
printf("vx / vy =%f\n",vx/vy);
printf(" \n-------分界線3------- \n");
int n1,n2,n3,n4;
double d1,d2,d3,d4;
n1=5/2;
n2=5.0/2.0;
n3=5.0/2;
n4=5/2.0;
d1=5/2;
d2=5.0/2.0;
d3=5.0/2;
d4=5/2.0;
printf("n1 = %d\n",n1);
printf("n2 = %d\n",n2);
printf("n3 = %d\n",n3);
printf("n4 = %d\n\n",n4);
printf("d1 = %f\n",d1);
printf("d2 = %f\n",d2);
printf("d3 = %f\n",d3);
printf("d4 = %f\n",d4);
printf(" \n-------分界線4------- \n");
int a,b;
puts("Please input two numbers");
printf("The number a is:");scanf("%d",&a);
printf("The number b is:");scanf("%d",&b);
printf("The average of a and b is %f:\n",(a+b)/2.0);
printf(" \n-------分界線5------- \n");
int a1,b1;
puts("Please input two numbers");
printf("The number a1 is:");scanf("%d",&a1);
printf("The number b1 is:");scanf("%d",&b1);
printf("The average of a1 and b1 is %f:\n",(a1+b1)/2.0);
printf(" \n-------分界線6------- \n");
int a2,b2,c2;
int sum;
double ave;
puts("Please input three numbers");
printf("The number a2 is:");scanf("%d",&a2);
printf("The number b2 is:");scanf("%d",&b2);
printf("The number c2 is:");scanf("%d",&c2);
sum=a2+b2+c2;
ave=(double)sum/3;
printf("The addition of them is %5d \n",sum);
printf("The average of them is %5.1f \n",ave);
printf(" \n-------分界線7------- \n");
printf("[%d]\n",123);
printf("[%.4d]\n",123);
printf("[%4d]\n",123);
printf("[%04d]\n",123);
printf("[%-4d]\n\n",123);
printf("[%d]\n", 12345);
printf("[%.3d]\n",12345);
printf("[%3d]\n",12345);
printf("[%03d]\n", 12345) ;
printf("[%-3d]\n\n",12345);
printf("[%f]\n",123.13);
printf("[%.1f]\n", 123.13) ;
printf("[%6.1f]\n\n", 123.13);
printf("[%f]\n",123.13);
printf("[%.1f]\n", 123.13);
printf("[%4.1f]\n\n", 123.13);
return 0;
}
- ()是優先運算的標記
- printf函式輸出double值的時候,轉換說明不能使用%d,而要使用%f
- double型別的變數通過scanf函式賦值的時候需要使用格式字串%lf
- 進行整數/整數運算的時候,商的小樹部分會被捨棄,但是浮點數之間的運算,就不會進行捨棄處理
- 把2賦給int時,2.5賦給int,賦值的時候會捨棄掉小數點之後的部分,所以都是2
- 把2賦給double時,會被解釋為2.0,2.5賦給double,會完整儲存
- int/double結果是double
- 型別轉換表示式(資料型別)表示式,通常這種形式的表示式會把表示式的值轉換為該資料型別對應的值。
- %5d...顯示至少5位的十進位制整數。
- %5.1f ...顯示至少5位的浮點數。但是,小數點後只顯示1位。
- 指定顯示的最小位數,如果不指定,則整數的時候預設為1,浮點數的時候預設為6
- d ... 顯示十進位制的int型整數。
- f ... 顯示十進位制的double型浮點數。
分支結構
if語句
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int no;
printf("Please input a number ");
scanf("%d",&no);
if(no%5)
puts("no % 5 is not zero");
printf(" \n-------分界線2------- \n");
int no1;
printf("Please input a number ");
scanf("%d",&no1);
if(no1%5)
puts("no1 % 5 is not zero");
else
puts("no1 % 5 is zero");
printf(" \n-------分界線3------- \n");
int num;
printf("Please input a number ");
scanf("%d",&num);
if(num){
puts("The num does not equal with zero");
}else{
puts("The num equals with zero");
}
printf(" \n-------分界線4------- \n");
int n1,n2;
puts("Please input two numbers ");
printf("The first number is :"); scanf("%d",&n1);
printf("The second number is :"); scanf("%d",&n2);
if(n1==n2)
puts("The first number equals with the second number");
else
puts("The first number does not equal with the second number");
printf(" \n-------分界線5------- \n");
int n3,n4;
puts("Please input two numbers ");
printf("The first number is :"); scanf("%d",&n3);
printf("The second number is :"); scanf("%d",&n4);
if(n3!=n4)
puts("The first number does not equal with the second number");
else
puts("The first number equals with the second number");
printf(" \n-------分界線6------- \n");
int no2;
printf("Please input a number ");
scanf("%d",&no2);
if(no2>0)
if(no%2==0){
puts("no2 is an even number");
}else{
puts("no2 is an odd number");
}
printf(" \n-------分界線7------- \n");
int n5,n6,max;
puts("Please input two numbers ");
printf("The first number is :"); scanf("%d",&n5);
printf("The second number is :"); scanf("%d",&n6);
max=(n5>n6)?n5:n6;
printf("The bigger number is %d \n",max);
printf(" \n-------分界線8------- \n");
int month;
printf("請輸入月份: ");
scanf("%d",&month);
if (month >= 3 && month <= 5)
printf("%d月是春季。\n", month);
else if (month >= 6 && month <= 8)
printf("%d 月是夏季。\n", month);
else if (month >= 9 && month <= 11)
printf("%d月是秋季。\n", month);
else if (month == 1|| month == 2|| month == 12)
printf("%d 月是冬季。\n", month);
else
printf("%d月不存在! !\a\n",month);
return 0;
}
- if語句判斷表示式的值,如果結果不為0,則執行相應的語句
- ==運算子會對左右兩側運算元是否相等進行比較
- !=運算子會判斷兩個運算元是否不相等
- if語句成為了巢狀的語句這一點和之 前的程式相同,只是巢狀語句的結構不同。
- 只有條件運算子屬於三目運算子,其他的運算子都是單目或者雙目運算子。
- 條件運算子a? b : C如果a不為0, 則結果是b的值,否則結果為C的值
- a &&b 如果a和b都不為0, 則表示式的結果為1, 否則結果為0 (結果的型別為int)
- a||b如果a和b中有一個不為0, 則表示式的結果為1, 否則結果為0 (結果的型別為int)
switch語句
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int n1;
printf("Please input a number:");
scanf("%d",&n1);
switch(n1 % 3){
case 0 : puts("n1%3 equals with 0"); break;
case 1 : puts("n1%3 equals with 1"); break;
case 2 : puts("n1%3 equals with 2"); break;
}
printf(" \n-------分界線2------- \n");
int n2;
printf("Please input a number:");
scanf("%d",&n2);
switch(n2){
case 1:
puts("A");
puts("B");
break;
case 2:
puts("C");
case 5:
puts("D");
break;
case 6:
case 7:
puts("E");
break;
default:
puts("F");
break;
}
return 0;
}
- break能讓程式調處switch語句
- case條件都不滿足的時候會跳轉default
迴圈結構
do 語句
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int retry;
do{
int no;
printf("Please input a number;");
scanf("%d",&no);
if(no % 2)
puts("The number is an odd number");
else{
puts("The number is an even number");
}
printf("Would you want to try again? Yes...0,No...9 ");
scanf("%d",&retry);
} while(retry==0);
printf(" \n-------分界線2------- \n");
int choose;
do{
printf("Please make a choice【0,1,2】");
scanf("%d",&choose);
}while(choose<0||choose>2);
printf("Your choice");
switch(choose){
case 0:printf("0");break;
case 1:printf("1");break;
case 2:printf("2");break;
}
printf(" \n-------分界線3------- \n");
int sum=0;
int cnt=0;
int retry1;
do{
int t;
printf("Please input a number");
scanf("%d",&t);
sum +=t;
cnt++;
printf("To continue?Yes..0/No..9");
scanf("%d",&retry);
}while(retry==0);
printf("The addition is %d,The average is %.2f \n",sum,(double)sum/cnt);
return 0;
}
while 語句
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int no;
printf("Please input a positive number ");
scanf("%d",&no);
while(no>=0){
printf("%d ",no);
no--;
}
printf("\n");
printf(" \n-------分界線2------- \n");
int no1;
int i;
printf("Please input a positive number ");
scanf("%d",&no1);
i=0;
while(i<=no1)
printf("%d ",i++);
printf("\n");
printf(" \n-------分界線3------- \n");
int no3;
printf("Please input a positive number ");
scanf("%d",&no3);
while (no3-->0)
putchar('*');
putchar('\n');
return 0;
}
for 迴圈
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int i,no;
printf("Please input a positve number ");
scanf("%d",&no);
for(i=0;i<=no;i++)
printf("%d",i);
putchar('\n');
return 0;
}
多重迴圈
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++)
printf("%3d",i*j);
putchar('\n');
}
printf("\n-------分界線2------- \n");
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
int seki = i*j;
if(seki>40)
break;
printf("%3d",seki);
}
putchar('\n');
}
printf("\n-------分界線3------- \n");
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
int seki = i*j;
if(seki%10==4||seki/10==4){
continue;
}
printf("%3d ",seki);
}
putchar('\n');
}
return 0;
}
- 先迴圈後判斷可以通過do語句來實現,至少執行一次
- 先判斷後迴圈可以通過while語句和for語句來實現
- break語句會中斷該迴圈語句的執行
- continue語句可以跳過本次迴圈體剩餘部分的執行
陣列
#include <stdio.h>
int main(void)
{
printf("-------分界線1------- \n");
int n,t[10];
for(n=0;n<10;n++)
t[n] = n + 1;
for(n=9;n>=0;n--)
printf("%d\t",t[n]);
printf("\n-------分界線2------- \n");
int i,j,row = 0,colum = 0,max;
int a[3][4] = {{3,4,16,2},{7,5,1,9},{11,23,3,8}};
max = a[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(a[i][j]>max)
{
max = a[i][j];
row = i;
colum = j;
}
printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);
return 0;
}
- 同一型別的物件集中在一起,在記憶體上排列成一條直線,這就是陣列
- 訪問陣列的各個元素時使用下標運算子[],下標從0開始
- 宣告陣列時,元素個數必須適用常量表示式
- 多維陣列的構成元素在排列時,首先從位於末尾的下標開始增加
- 無法使用賦值運算子=複製陣列的所有元素
字串和指標
指標
#include<stdio.h>
int main(){
int a = 100,b = 10;
int *point_1,*point_2; //定義指向整型資料的指標變數 point_1,point_2
point_1 = &a; //把變數 a 的地址賦給指標變數 point_1
point_2 = &b;
printf("a=%d,b=%d\n",a,b);
printf("%p,%p\n",point_1,point_2); //輸出 a 和 b 在記憶體中的地址
printf("*point_1=%d,*point_2=%d\n",*point_1,*point_2); //輸出變數 a 和 b 的值
return 0;
}
字串
#include <stdio.h>
int main(void)
{
printf("-------分界線------- \n");
char str[]="ABC";
printf("The String str is \"%s\".\n",str);
printf("\n-------分界線2------- \n");
char name[48];
printf("Please input your name");
scanf("%s",name);
printf("Hello,%s \n",name);
return 0;
}
- 通過在指標前寫上指標運算子*來訪問該指標指向的物件,稱為解引用。
- 用指標實現字串”也是一種表示字串的方法,
檔案處理
#include<stdio.h>
#include<stdlib.h> // stdlib 標頭檔案即 standard library 標準庫標頭檔案
int main(){
FILE * fp;
char ch,filename[10];
printf("Please enter the file name:");
scanf("%s",filename);
// 如果檔案不存在,fopen 會建立該檔案
if((fp=fopen(filename,"w"))==NULL){ // 開啟輸出檔案並使 fp 指向此檔案
printf("Unable to open this file\n"); // 如果開啟出錯,就輸出“打不開”的資訊
exit(0); // 終止程式
}
ch=getchar(); // 用來接收最後輸入的回車符
printf("Please enter a string in the disk(Ends with a #):");
ch=getchar(); // 接收從鍵盤輸入的第一個字元
while(ch!='#'){ // 當輸入 # 時結束迴圈
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
putchar(10);
return 0;
}
- 記錄控制流所需要的資訊的資料型別是FILE型,該資料型別是在<stdio.h>標頭檔案中定義的。
- 開啟檔案的操作稱為開啟。函式庫中的fopen函式用於開啟檔案。
- 使用fopen函式成功開啟檔案後,返回指向FILE型物件的指標,該物件用於控制與所開啟的檔案相關聯的流;開啟操作失敗時,返回空指標。
- 在檔案使用結束後,會斷開檔案與流的關聯,將流關閉。這個操作稱為關閉。用於關閉檔案的函式是fclose函式。
- fscanf函式可以對任意流執行與scanf函式相同的輸入操作。二者都返回成功讀取的項數。
- fprintf函式可以對任意流執行與printf函式相同的輸出操作。
- fgrtc函式是從任意流讀取資料的函式。
- fputc函式是向任意流寫入資料的函式。