C語言 備份

才下眉头3發表於2024-08-29

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;

取地址運算子與取值運算子

取地址運算子為&,也稱引用,透過改運算子我們可以獲取一個變數的地址值;取值運算子為*,也稱解引用,透過改運算子我們可以得到一個地址對應的資料。

image-20220917230214700

#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);
}

相關文章