C语言 备份

1|0scanf读取原理

行缓冲:标准缓存区读入字符 ‘20\n’,会打印输出20,紧接着的scanf,会打印输出\n,标准输入缓冲区有\n,scanf(c=%c,&c),直接读取缓冲区的\n字符输出。

scanf匹配规则:scanf函数在读取整型数、浮点数、字符串会忽略'\n'字符

1|0判断闰年

#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("不是闰年"); } }

1|0小写字母转大写

#include <stdio.h> int main() { char c; while(scanf("%c",&c)!=EOF) { if(c!=0){ printf("%c",c-32); } else { printf("\n"); } } }

1|0一个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; }

1|0printf输出格式

#include <stdio.h> int main() { printf("name=%s,age=%d,score=%4.1f","xiaoming",22,99.9); }

1|0选择与循环

1|0反转

#include <stdio.h> int main() { int a; scanf("%d",&a); while(a!=0) { printf("%d",a%10); a=a/10; } return 0; }

1|0选择与循环

1|1if

if (){ } else if { } else{ }

1|2while循环

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

1|3for循环

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

1|4continue

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

1|5break

break语句的作用是结束整个循环过程,不再判断执行循环条件是否成立;跳出循环

1|6判断是否是对称数

输入一个整型数,判断是否是对称数,如果是,输出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"); } }

2|0数组

2|1数组的定义

  • 具有相同的数据类型

  • 使用过程中需要保留原始数据

    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]发生改变 }

1|0字符数组

char c[10];

1|0字符数组的初始化

对每个字符单独赋值

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

字符数组的数组名里存的就是字符数组的起始地址,类型就是字符指针

2|2gets函数与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'。

2|3str系列字符串操作函数

主要包括: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 }

3|0指针

指针的本质 指针的使用场景 二级指针的传递

3|1指针的本质

1|0指针的定义

内存区域中的每字节都对应一个编号,这个编号就是“地址”。如果在程序中定义了一个变量,那么在对程序进行编译时,系统就会给这个变量分配内存单元。按变量地址存取变量值的方式称为“直接访问”,如printf("%d",i);、scanf("%d",&i);另一种存取变量的方式称为“间接访问”,即将变量i的地址存放到另一个变量中。在C语言中,指针变量是一种特殊的变量,它用来存放变量地址。

指针变量的定义格式

基类型 *指针变量名 例如: int *p;

1|0取地址操作符与取值操作符

取地址操作符为&,也称引用,通过改操作符我们可以获取一个变量的地址值;取值操作符为*,也称解引用,通过改操作符我们可以得到一个地址对应的数据。

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 */

1|0注意:

  • 指针变量前面的 * 表示改变量为指针型变量
  • 定义指针变量时必须指定其类型

3|2小题

1|0Description

利用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); }

1|0Description

某人想将手中的一张面值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

1|0Description

输入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); }

1|0Description

读取一个字符串,字符串可能含有空格,将字符串逆转,原来的字符串与逆转后字符串相同,输出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

3|3指针的使用场景

传递与偏移

1|0指针的传递

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

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

__EOF__

本文作者执伞候佳人
本文链接https://www.cnblogs.com/hekang520/p/18387104.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   才下眉头3  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示