文章目录

  • 基本操作
    • 判断闰年平年
    • 倒序输出五位数
    • 赋值运算
    • 用条件表达式求三个数的最大值
    • 测试int,float,char类型在本机所占的字节数
    • 单个字符的输入getchar()
    • 使用*抑制符跳过输入的某个值
    • 判断if,else
    • 数组
      • 选择排序
      • 冒泡排序法
      • 矩阵转置
    • 字符串操作
      • strcpy()复制, puts
      • strcat()拼接
      • 求字符串和字符数组的长度
      • puts,pringf;scanf,gets
      • strlen()长度
      • strcmp()比较
    • 指针
      • 指针的使用
      • 指针与一维数组 ,实现数组的倒序排列
      • 指针与字符串
      • 指针与二维数组
      • 指向数组

c语言学习连接:

  1. https://blog.csdn.net/zpj779878443/article/details/78229049
  2. http://www.runoob.com/cprogramming/c-function-getchar.html

基本操作

判断闰年平年

// 判断闰年平年
#include <stdio.h>
int main()
{int year;printf("请输入需要判断的年份:\n");scanf("%d",&year);
// 能被4除尽,前提不是整百年;整百年被400除尽if(!(year%4)&&(year%100)||!(year%400)&&!(year%100)){printf("%d年是闰年\n",year);}else {printf("%d年不是闰年\n",year);}return 0;
}

倒序输出五位数

// 倒序输出五位数
#include <stdio.h>
int main()
{int a,i;printf("请输入需要倒序输出的五位数\n");scanf("%d",&a);//通过&a获得存放这个数据的内存地址的值printf("输出倒序后的五位数:\n");for(i = 0;i<5;i++)//循环5次{printf("%d",a%10);a /= 10;}
}

赋值运算

// 赋值运算
// 括号最大 > ! > 算数运算符 > 关系运算符 > 逻辑与或 > ß赋值运算符
#include <stdio.h>
int main()
{int a,b,c;//普通赋值:a = 2,b= 6,c = 26;a *= b = c = 3;     //a = 6,b=3,c=3;printf("a = %d,b = %d,c = %d\n",a,b,c);a += b +=c;         //a = 12,b=6,c =3printf("a = %d,b = %d,c = %d\n",a,b,c);a = b == c + 5;     //a = 0,b = 6,c = 3printf("a = %d,b = %d,c = %d\n",a,b,c);return 0;
}

用条件表达式求三个数的最大值

//用条件表达式求三个数的最大值
#include <stdio.h>
int main()
{int a,b,c;int max;printf("请输入三个数:\n");scanf("%d%d%d",&a,&b,&c);a > b ? (max = a):(max = b);max > c ? (max = max):(max = c);printf("输出最大值:%d\n",max);return 0;
}
// 逗号表达式的值
#include <stdio.h>
int main()
{int a,b,c;a = b = c = 1;// 逗号表达式遵从从左到右,赋值取最右边的值c = (a = 10,b = 10,2 * a + 5,a + a * b + c);//输出结果:10,10,111;printf("a = %d,b = %d,c = %d\n",a,b,c);return 0;
}

测试int,float,char类型在本机所占的字节数

// sizeof:通常用来测试某个数据类型所占的内存空间大小
// 测试的是int,float,char类型在本机所占的字节数#include <stdio.h>
int main()
{    int a = 1;    float b = 1.1;    char c = 'cv';    printf("%d,%d,%d\n",sizeof(a),sizeof(b),sizeof(c));    return 0;
}

单个字符的输入getchar()

//单个字符的输入getchar(),输出putchar()
// getchar用法
#include <stdio.h>
int main()
{    char a,b;a = getchar();b = getchar();printf("输出存储的字符\n%c%c\n",a,b);    return 0;
}

输出结果

为什么只输出第一个字符和一个回车,第二个字符还没输入就结束了?
答:这是因为getchar()可以获取一个换行符,更改代码如下:

#include <stdio.h>
int main()
{    char a,b;a = getchar();getchar();b = getchar();printf("输出存储的字符\n%c\n%c\n",a,b);    return 0;
}

修改后输出:

使用*抑制符跳过输入的某个值

//scanf和printf语句
#include <stdio.h>
int main()
{    int a,b,c;  //1.正常的scanf的用法    scanf("%d%d%d",&a,&b,&c);    printf("a = %d b = %d c = %d\n",a,b,c);   //2.使用*抑制符跳过输入的某个值    scanf("%3d%*2d%2d%3d",&a,&b,&c);    printf("a = %d b = %d c = %d\n",a,b,c);  //3.最好不要在scanf里面写逗号和空格之类的,不然输入    //输入的时候必须把这些都写上    scanf("%d,%d,%d",&a,&b,&c);    printf("a = %d b = %d c = %d\n",a,b,c);    return 0;
}

判断if,else

//判断结构中的双分支结构-if else语句
//取钱时判断是否为100的倍数
#include <stdio.h>
int main()
{    int money;  printf("请输入你要取款的金额\n");scanf("%d",&money);    if (money%100)printf("输入金额错误,请重新输入100的倍数\n");   else printf("出钞%d\n",money);return 0;
}

数组

选择排序

// 选择排序
// 思路,两个for循环,两两比较,如果前者大于后者,交换位置
#include <stdio.h>
int main()
{int i,j,t,a[4];    //输入n个数字,n=4printf("please enter 4 integer\n");for(i=0;i<=3;i++) //输入数值scanf("%d",&a[i]);    for(i=0;i<=2;i++)  //从第一个数开始,执行n-1次for (j=i+1;j<=3;j++)  //从第i+1开始比较if(a[i]>a[j])    {t=a[i];a[i]=a[j];a[j]=t;}printf("\n");for(i=0;i<=3;i++)printf("%5d", a[i]); printf("\n");return 0;
}

冒泡排序法

// 冒泡排序法
//原理:用冒泡排序法的升序排列对任意输入的 10 个数按照从小到大的顺序进行排序。从最左边开始,比较相邻的两位数字,将大的那个放在右边,依次类推,第一轮结束后最大值就是最右边的数字。#include <stdio.h>
int main()
{int i,j,t,a[5];  printf("input 4 integer\n");for(i=1;i<5;i++)scanf("%d",&a[i]);   for(i=1;i<4;i++)     //变量i代表比较的趟数(趟数=数字个数-1)for(j=1;j<5-i;j++)    //变最j代表每趟两两比较的次数if(a[j]>a[j+1]){t=a[j];    //利用中间变童实现两值互换a[j]=a[j+1];a[j+1]=t;}printf("排序后的顺序是:\n");for(i=1;i<=4;i++)printf("%5d",a[i]);    //将冒泡排序后的顺序输出printf("\n");return 0;
}

矩阵转置

// 矩阵转置
#include <stdio.h>
int main()
{   int i,j;int a[3][4],b[4][3];printf("please enter an aray element of a:\n");// aray afor(i=0;i<3;i++){for(j=0;j<4;j++)scanf("%d",&a[i][j]);  }// transpose of a matrixfor(i=0;i<3;i++){for(j=0;j<4;j++)b[j][i]=a[i][j];}// output aray bprintf("output aray b\n");for(i=0;i<4;i++){for(j=0;j<3;j++)printf("%d",b[i][j]);printf("\n");}return 0;
}

字符串操作

strcpy()复制, puts

// strcpy()复制
// puts()函数会在字符串末尾自动的添加换行符,也就是说它会自动的换行,
// 而printf()函数就没有这项功能
#include <stdio.h>
#include<string.h>
int main()
{char c1[]="hello\0",c2[15];strcpy(c2,c1);puts(c2);                                        // helloprintf("输出字符数组c2的长度:%d\n",sizeof(c2));   // 15return 0;
}

strcat()拼接

// strcat()拼接
#include <stdio.h>
#include<string.h>
int main()
{char c1[]="hello world",c2[10];//除了字符串,这里还可以连接字符数组strcpy(c2,c1);strcat(c1,"pig"); //直接在c1后面拼接 strcpy(c2,"pig"); // 后面的字符数组复制到c2中,c2原来的数组清零,但是c2长度不变puts(c1);puts(c2);return 0;

结果:

求字符串和字符数组的长度

// 求字符串和字符数组的长度
#include <stdio.h>
int main()
{int i=0,n=0;char c[]="abcd\0-";while(c[i++]!='\0'){n++;}printf("输出字符串的长度:%d\n",n);//4, 字符串的结束标志为\0,之后的字符不属于该字符串了 n = sizeof(c)/sizeof(char);       //字符数组长度=sizeof(数组名)/sizeof(数组原始类型) printf("output the length of c:%d\n",sizeof(c));     //7,sizeof(数组名)printf("output the length of c:%d\n",sizeof(char));  //1,字符数组一定有个空字符串\0作为字符串的结束标志 printf("输出字符数组的长度:%d\n",n); //7for(i=0;i<7;i++){printf("%c",c[i]); //abcd}return 0;
}

puts,pringf;scanf,gets

// 分别用两种方法演示字符串的输入输出
// puts和pringf区别:puts能自动在末尾输入一个换行符
// scanf和gets区别:scanf不支持空格、制表符输入
#include <stdio.h>
int main()
{char c1[10],c2[10];scanf("%s",c1); printf("%s\n",c1);/*printf("接着输入第二组字符串\n");gets(c2);puts(c2);*/return 0;
}

strlen()长度

// strlen()长度
#include <stdio.h>
#include<string.h>
int main()
{char c[10]="hello";int n;n = strlen(c);//求字符串的长度,不含字符串结束标志'\0' printf("c长度为:%d\n",n);//n=5printf("c长度为:%d\n",sizeof(c));//值为10 printf("c长度为:%d\n",sizeof(char));//值为1。char 型数据占 1 字节return 0;
}

strcmp()比较

// strcmp()比较
#include <stdio.h>
#include <string.h>
/*strcmp(a,b):将a,b两个字符串从左到右对每个字符,按照ASCII码的值进行比较,
知道出现不同的或者’\0’,终止比较,如果内容一样,返回0;大于返回正整数,小于
则返回负整数;*/
int main()
{// strcmp()函数:从左到右根据ASCII码值比较 // 每个字母的大小,直接遇到不同或结束标志时为止char a[5]="abc", b[5]="abc";int flag;
//1. 直接用等号比较的话
//比较的是地址是否一样if(a==b) printf("a==b\n");else if (a!=b) printf("a!=b\n");
//2. 用strcmp()比较flag = strcmp(a,b);if(flag== 0)  printf("a与b内容相同\n");else if (flag>0)  printf("a>b\n");else if (flag<0)  printf("a<b\n");return 0;
}**要点小结:**
1.数组是用来 存储数据类型相同 的变量的 有序集合,可以 通过下标访问 数组中的 元素;
2.一维数组 的定义,初始化与引用;
3.二位数组 用于存储表格数据,定义,初始化与引用;
4.区分字符串与字符数组的区别:字符串是要用字符数组存储,最后要加上一个‘\0’;
5.字符数组的长度至少比字符串多1;
6.使用sizeof(数组名)/sizeof(数组元素的数据类型) = 字符数组长度
7.字符数组直接 == 比较的是 地址
8.使用string.h提供的字符串操作函数:
strcpy(a,b):将b的字符串复制到a中,会覆盖
strcat(a,b):将字符串b的内容拼接到a的后面
strcmp(a,b):将a,b两个字符串从左到右对每个字符,按照ASCII码的值进行比较,
知道出现不同的或者’\0’,终止比较,如果内容一样,返回0;大于返回正整数,小于
则返回负整数;
strlen(a):返回字符串的长度,不包括字符串结束的标记’\0’

指针

  1. 指针:是一个地址
  2. 指针变量:用来存放另一变量的地址
  3. *:表示“指向
  4. 如果定义变量 i 为指针变量,那么 *i 就表示指针变量i里面存放的地址是所指向的存储单元里面的数据。
  5. int*i;*表示这个变量是一个指针变量,而int表示这个变量只能存放 int 型变量的地址。

指针的使用

// 指针的使用
#include <stdio.h>int main()
{int a=10,b;int *p,*q;//指针变量的定义
//  取得a变量的地址赋值给pp = &a; b = *p+3;//通过指针变量访问变量 printf("%d\n",p);//p是一个地址:6487616 printf("%d\n",b);//b=13
//    如果p指向的内存中的数据+1,a会等于多少?*p = *p+1;printf("a = %d,b = %d\n",a,b);//a = 11,b = 13
//  我们把p的地址赋给q,然后对q+1,观察a的变化q = p;*q = *q+1; printf("a = %d,b = %d\n",a,b);//a = 12,b = 13 return 0;
}

指针与一维数组 ,实现数组的倒序排列

// 指针与一维数组
#include <stdio.h>int main()
{int a[10]={1,2,3,4,5,6,7,8,9,10};int *p=a,*q=&a[9],*c=&a[3]; int i,num;//   数组名本身就是一个指针(地址),它代表了数组的首地址,数组在内存中连续存放printf("%p %p %p %p\n",a,p,&a[0],q);           //%p 打印地址,三者地址相同 printf("*p=%d,*q=%d,*c=%d\n",*p,*q,*c);   //*p=1,*q=10,*c=4
//    循环的目的是实现数组的倒序排列 while(p<=q){num = *q;*q = *p;*p = num;
//      将指针p后移一个单位
//      将阵阵q后移一个单位p++;q--;    }    printf("*p=%d *q=%d\n",*p,*q) ;// *p=5 *q=6 printf("输出交换后的数组:\n");for(i=0;i<10;i++){printf("%d",a[i]);}printf("\n");  //输出结果:10987654321 return 0;
}

指针与字符串

// 指针与字符串
// 双引号表示字符串,单引号表示字符
#include <stdio.h>int main()
{int num = 0;
//定义方式一:char str1[]= "How do you do!"; printf("%s\n",str1);//  How do you do! printf("%p\n",str1);// str1指向了字符串的第一个字符的地址 //定义方式二:char *str = "How do you do!"; printf("%s\n",str); //  How do you do! printf("%d\n",*str); // 指用字符指针向了字符串的第一个字符H,值为十进制的72 for(;*str;str++)
//  第一个分号前面没有写循环初始状态,表明无条件开始循环。
//  *str意思是*str!=0执行,*str==0停止循环
//  执行一次循环体后, 执行步长运算部分: p++{if(*str == 'o') num++;}printf("*str = %d\n",*str);//  *str=0 printf("字符串中o出现了%d次\n",num);return 0;
}

指针与二维数组

// 指针与二维数组
#include <stdio.h>
int main()
{int a[2][2] = {{1,2},{3,4}};int (*p)[2],i,j;      // 定义一个二维指针 p = &(a[0]);printf("%d",(*p)[0]); // 1return 0;
}

指向数组

// 指向数组
#include <stdio.h>
int main()
{int i,j;int a[2][3];//定义一个行指针,并指向数组的首地址int (*p)[3];// 该语句是定义一个数组指针,指向含4个元素的一维数组//  int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,// 也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度p = &(a[0]);printf("请输入二维数组中的数组元素:\n");for(i = 0;i < 2;i++) {for(j = 0;j < 3;j++){scanf("%d",p[i]+j);}}printf("输出二维数组中的数据:\n");for(i = 0;i < 2;i++) {for(j = 0;j < 3;j++){printf("%4d",*(p[i]+j));}printf("\n");}return 0;
}

c 语言学习:基本操作,数组,字符串,指针相关推荐

  1. 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作

    文章目录 一.数组与指针 1.手搓冒泡排序(从大到小) 2.矩阵的转置和打印 3.判断矩阵是否对称 4.最大元素与最后元素互换(用指针) 5.首地址偏移法逆序排序 6.指针移动法逆序排序 7.用元素指 ...

  2. C语言学习笔记---数组和指针的区别

      在平时使用数组和指针的时候,感觉他们的使用很类似.那么数字和指针在使用的过程中到底有什么区别呢?   下面通过一个例子来简单分析一下. char str1[] = "abcdef&quo ...

  3. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  4. c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc

    C语言的二数组的指针访问 二维数组的指针访问 --王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点.如果真正弄懂了这个问题,就可以说你学会了使用指针. 二维数组的指针 指针就是地址 ...

  5. c语言指针转换成数组,浅议C语言中灵魂数组和指针的互操作(转)

    浅议C语言中灵魂数组和指针的互操作(转)[@more@]曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减. 当然了,这是无可非议的,但是 ...

  6. c语言二维数组 ppt,C语言二维数组与指针.ppt

    C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...

  7. Go语言学习笔记-数组、切片、map

    Go语言学习笔记-数组.切片.map 数组:同一数据类型元素的集合.是值类型,长度固定无法修改 声明格式:var 数组名字 [元素数量] 数据类型 var arr [3] int //声明定义了一个长 ...

  8. C语言学习之 数组,指针,字符串. (一)

    2019独角兽企业重金招聘Python工程师标准>>> 此文由来: 是看到野鬼发表的关于C语言知识内容后,一激动,手一痒.回了一篇.可惜误操作让回复没能保存. 之后再写就是下面的内容 ...

  9. C语言学习笔记--数组参数和指针参数

    1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. ...

  10. C语言学习笔记--数组指针和指针数组

    C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...

最新文章

  1. 如何安装蓝湖插件支持Photoshop CC 2017
  2. 代码质量第5层-只是实现了功能
  3. 分割BiSeNet笔记
  4. dedeCMS 静态页面的倒计时插件(原生VS自定义)
  5. 算法学习(二)快速排序(上)
  6. 设置文本输入框光标位置,兼容ie,w3c
  7. threejs编辑器(3D场景编辑器)
  8. 未检测到与wia兼容的设备_如何解决应用程序找不到扫描仪:错误WIA_ERROR_OFFLINE!...
  9. VScode与SumatraPDF反向搜索跳转问题
  10. java水仙花数编程_水仙花数java编程实现
  11. CM9和AOKP的区别
  12. java-sec-code学习之path_traversal
  13. 大数据特点5V 商业智能实现的三个层次
  14. 7月27日19:30直播预告:HarmonyOS3及华为全场景新品发布会
  15. 使用sws_scale转换视频、使用swr_convert转换音频
  16. jupyter notebook ModuleNotFoundError: No module named ‘tensorflow‘---爬出坑
  17. k8s教程(Volume篇)-PVC详解
  18. A session ended very soon after starting. Check that the command in profile解决方法
  19. Android设备双屏显示
  20. 汽车早讯丨庞大集团董事长回应高管降薪;一嗨租车达成新私有化协议

热门文章

  1. linux目录空间内存,Linux 目录结构:内存文件夹
  2. 中南大学计算机085403,What?这些个专业改考数一英一了!
  3. java 整数加减_JAVA超大整数的加法如何改成减法
  4. get vue 和set 用法_深入剖析Vue源码 - 数据代理,关联子父组件
  5. hive通过外表把数据存到mysql中_hive数据去重
  6. 从本地的win传文件到本地的linux上,pscp.exe实现本地windows下的文件下载(传输)到linux上...
  7. 水来了,数据中心如何做好防汛防洪措施?
  8. 五一假期将至,机房维护工作要做好
  9. 工商银行:IT新架构及银行IT架构转型思考
  10. opencv android黑屏,装好了OpenCVManager,开启了Camera权限,在手机上CameraFaceDetectionView无图像...