scanf讀取原理
行緩衝:標準快取區讀入字元 ‘20\n’,會列印輸出20,緊接著的scanf,會列印輸出\n,標準輸入緩衝區有\n,scanf(c=%c,&c),直接讀取緩衝區的\n字元輸出。
scanf匹配規則:scanf函式在讀取整型數、浮點數、字串會忽略'\n'字元
判斷閏年
#include <stdio.h>
int main(){
int year;
scanf("%d",&year);
if (year % 400 == 0 || year % 4 == 0 && year % 100 !=0){
printf("year is 閏年");
}
else{
printf("不是閏年");
}
}
小寫字母轉大寫
#include <stdio.h>
int main()
{
char c;
while(scanf("%c",&c)!=EOF)
{
if(c!=0){
printf("%c",c-32);
}
else
{
printf("\n");
}
}
}
一個scanf讀多種型別的資料
#include <stdio.h>
//一個scanf讀多種型別的資料
//混合輸入每次在%c前面加一個空格
int main()
{
int i;
char c;
float f;
scanf("%d %c%f",&i,&c,&f);
printf("i=%d,c=%c,f=%f\n",i,c,f);
return 0;
}
printf輸出格式
#include <stdio.h>
int main()
{
printf("name=%s,age=%d,score=%4.1f","xiaoming",22,99.9);
}
選擇與迴圈
反轉
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
while(a!=0)
{
printf("%d",a%10);
a=a/10;
}
return 0;
}
選擇與迴圈
if
if (){
}
else if {
}
else{
}
while迴圈
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int i = 1;
int sum = 0;
while (i <= 100) {
sum = sum + i;
i++;
}
printf("sum is %d",sum);
}
for迴圈
for (表示式1;表示式2;表示式3) 語句;
(1)先執行表示式1.
(2)求解表示式2,若其值為真(值為非0),則先執行for語句中的內嵌語句,後執行第(3)步,若其值為假(值為0),則結束迴圈,轉到第(5)步
(3)求解表示式3
(4)轉回第(2)步繼續執行
(5)迴圈結束
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int i, sum;
//for迴圈中只能有兩個分號
for (i = 1,sum =0; i <= 100; i++)
{
sum += i;
}
printf("sum is %d\n",sum);
}
continue
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int i, sum;
for (i = 1,sum =0; i <= 100; i++)
{
if (i%2==0){
continue;//提前結束本輪迴圈
}
sum += i;
}
printf("sum is %d\n",sum);
}
break
break語句的作用是結束整個迴圈過程,不再判斷執行迴圈條件是否成立;跳出迴圈
判斷是否是對稱數
輸入一個整型數,判斷是否是對稱數,如果是,輸出yes,否則輸出no,不用考慮這個整型數過大,int型別存不下,不用考慮負值;
例如 12321是對稱數,輸出yes,124421是對稱數,輸出yes,1231不是對稱數,輸出no
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a,b,c,d;
scanf("%d", &a);
b = 0;
d = a;
while (a!=0) {
c = a % 10;
b = b * 10 + c;
a = a / 10;
}
if (d == b) {
printf("yes\n");
}
else{
printf("no\n");
}
}
陣列
陣列的定義
-
具有相同的資料型別
-
使用過程中需要保留原始資料
C語言提供了一種構造資料型別---陣列。資料,是指一組具有相同資料型別的資料的有序集合。
一維陣列的定義格式:
型別說明符 陣列名 [常量表示式]
int a[10];//定義一個整型陣列,陣列名為a,它有10個元素。
#include <stdio.h>
#define N 5
int main() {
//定義一個陣列 變數名,後面加上方括號,方括號
//int a[5] = { 1,3,5,7,9 };
int a[N] = { 1,3,5,7,9 };
printf("%d\n", a[3]);
}
列印陣列裡的每一個元素
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(int a[5]) {
for (int i = 0; i < 5; i++) {
printf("a[%d]=%d\n", i, a[i]);
}
}
int main() {
int a[5] = { 1,3,5,7,9 };
print(a);
}
陣列在傳遞時,元素個數傳遞不過去。可以在子函式中修改陣列元素。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(int b[],int len) {
for (int i = 0; i < len; i++) {
printf("a[%d]=%d\n", i, a[i]);
b[4] = 20;
}
}
int main() {
int a[5] = { 1,3,5,7,9 };
print(a,5);
printf("a[4]=%d\n",a[4]); //a[4]發生改變
}
字元陣列
char c[10];
字元陣列的初始化
對每個字元單獨賦值
c[0]='X';c[1]='H'
對整個陣列進行初始化
char c = {'I','A','H'};
字元陣列一般用來存取字串。通常採用的初始化方式是char c[10] = "hello"。因為C語言規定字串的結束標誌為本0',而系統會對字串常量自動加一一個'\0',所以字元陣列儲存的字串長度必須比字元陣列少1位元組。char [10]最長儲存9個字元,剩餘的一個字元用來儲存'\0'。
初始化字元陣列時,一 定要讓字元陣列的大小比看 到的字串的長度多1
#include <stdio.h>
int main() {
char c[6] = { 'h','e','l','l','o' };
char d[5] = "how";
printf("%s---%s", c, d);
}
hello---how
#include <stdio.h>
int main() {
char c[6] = { 'h','e','l','l','o' };
char d[4] = "how";
printf("%s---%s\n", c, d);
char e[10],f[10];
scanf("%s%s", e, f);
printf("%s---%s", e, f);
}
字元陣列的傳遞
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(char d[]) {
int i = 0;
while (d[i]!='\0')
{
printf("%c", d[i]);
i++;
}
printf("\n");
d[0] = 'H';
printf(d);
}
int main() {
char c[10] = "hello";
print(c);
return 0;
}
輸出:
hello
Hello
字元陣列的陣列名裡存的就是字元陣列的起始地址,型別就是字元指標
gets函式與puts函式
gets函式類似與scanf函式,用於讀取標準輸入。scanf函式在讀取字串時遇到空格就認為讀取結束,所以當輸入的字串存在空格時,需要使用gets函式進行讀取。
puts輸出,並列印一行換行。
#include <stdio.h>
int main() {
char c[20];
gets(c);
puts(c); //等價於printf("%s\n",c)
return 0;
}
從標準輸入讀取字元,載入到str字串中,知道遇到(\n)或達到EOF。輸入ni hao 可以看到gets會讀取空格,最後有'\0',因為gets遇到(\n),不會儲存\n,而是將其翻譯成空字元'\0'。
str系列字串操作函式
主要包括:strlen、strcpy、strcmp、strcat等
strlen:用於統計字串長度
strcpy:用於將某個字串複製到字元陣列中
strcmp:用於比較兩個字串的大小
strcat:用於將兩個字串拼接到一起
#include <stdio.h>
#include <string.h>
int main() {
char c[20] = "jiangsu";
printf("陣列c內的長度為%d\n",strlen(c));
char d[20];
char e[20] = "I love";
//char* strcpy(char* to,const char* from);有const修飾代表這個地方可以放一個字串常量
strcpy(d, c);
puts(d);
/*
輸出:
陣列c內的長度為7
jiangsu
*/
printf("兩個字串比較後的結果=%d\n", strcmp("how", "hello"));
//輸出:兩個字串比較後的結果=1、比較的是字串的ascii碼值
//strcat,拼接兩個字串,目標陣列(前)要可以容納拼接的字串
strcat(e, c);
puts(e);
//輸出: I lovejiangsu
}
指標
指標的本質
指標的使用場景
二級指標的傳遞
指標的本質
指標的定義
記憶體區域中的每位元組都對應一個編號,這個編號就是“地址”。如果在程式中定義了一個變數,那麼在對程式進行編譯時,系統就會給這個變數分配記憶體單元。按變數地址存取變數值的方式稱為“直接訪問”,如printf("%d",i);、scanf("%d",&i);另一種存取變數的方式稱為“間接訪問”,即將變數i的地址存放到另一個變數中。在C語言中,指標變數是一種特殊的變數,它用來存放變數地址。
指標變數的定義格式
基型別 *指標變數名
例如:
int *p;
取地址運算子與取值運算子
取地址運算子為&,也稱引用,透過改運算子我們可以獲取一個變數的地址值;取值運算子為*,也稱解引用,透過改運算子我們可以得到一個地址對應的資料。
#include <stdio.h>
int main() {
//指標變數的初始化一定是某個變數取地址
int i = 5;
int* p=&i;
printf("i=%d\n", i);//直接訪問
printf("*p=%d", *p);//間接訪問
}
/*
輸出:
i=5
*p=5
*/
注意:
- 指標變數前面的 * 表示改變數為指標型變數
- 定義指標變數時必須指定其型別
小題
Description
利用while或者for迴圈計算n!的值。
提示:n!=1*2*3…*n
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1,total=1,n;
scanf("%d", &n);
while (i<=n) {
total *= i;
i++;
}
printf("%d", total);
}
Description
某人想將手中的一張面值100元的人民幣換成10元、5元、2元和1元面值的票子。要求換正好40張,且每種票子至少一張。問:有幾種換法?
int main()
{
int t, f, s, o,e=0;
for (t = 1; t <= 10; t++) {
for (f = 1; f <= 19; f++) {
for (s = 1; s <= 37; s++) {
for (o = 1; o <= 37; o++) {
if(10*t+f*5+2*s+o==100&&t+f+s+o==40){
e++;
}
}
}
}
}
printf("%d", e);
}
//34
Description
輸入N個數(N小於等於100),輸出數字2的出現次數;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i,n;
int a[100];
scanf("%d", &n);
for (i=0;i<n;i++){
scanf("%d", &a[i]);
}
int count = 0;
for (i = 0; i < n; i++) {
if (a[i] == 2) {
count++;
}
}
printf("2出現的次數為%d", count);
}
Description
讀取一個字串,字串可能含有空格,將字串逆轉,原來的字串與逆轉後字串相同,輸出0,原字串小於逆轉後字串輸出-1,大於逆轉後字串輸出1。例如輸入 hello,逆轉後的字串為 olleh,因為hello 小於 olleh,所以輸出-1注意最後的判斷一定要這麼寫,因為strcmp標準C中並不是返回-1和1,而是負值和正值
#include <stdio.h>
#include <string.h>
int main()
{
char c[100], d[100];
gets(c);
int i, j;
for (i = strlen(c) - 1, j = 0; i >= 0; i--, j++) {
d[j] = c[i];
}
d[j] = '\0';
int result = strcmp(c, d);
if (result < 0) {
printf("%d\n", -1);
}
else if (result > 0) {
printf("%d\n", 1);
}
else {
printf("%d\n", 0);
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i, j;
char k;
scanf("%d%c%d", &i, &k, &j);
printf("i=%d,k=%c,j=%d\n", i, k, j);
}
//輸入 1 2 3
* scanf匹配原理
i=1 k= j=2
指標的使用場景
傳遞與偏移
指標的傳遞
#include <stdio.h>
void change(int *j)//j為形參,j=&i
{
*j = 10;
}
int main()
{
int i = 5;
printf("before change i=%d\n", i);
change(&i);//函式呼叫時,把&i成為實參
printf("after change i=%d\n", i);
return 0;
}
指標的偏移
陣列是特殊的,不能和整型變數,浮點型變數類比
陣列名 a 型別是陣列 a 裡面存了一個值,是地址值,是陣列的起始地址。
#include <stdio.h>
int main() {
int a[5] = { 1,2,3,4,5 };
int* p;
p = a;
printf("*p=%d\n", *p);
for (int i = 0; i < 5; i++) {
printf("%d\n", *(p + i));
}
}
輸出:
*p=1
1
2
3
4
5
#include <stdio.h>
int main() {
int n = 0, c;
c = getchar();//getchar() 從標準輸入 stdin 獲取一個字元(一個無符號字元)
while (c!='\n') {
if (c>='0' && c<='9')
n++;
c = getchar();//為了讓你接收下一個字元
}
printf("%d\n", n);
}