C语言1:快速回顾

原ide用的VScode,但是在个别函数的使用如scanf使用时只能用VScode特定的c++兼容c语言scanf的特殊写法,不太喜欢,暂时换成了VC++6.0

后来将ide换成了notepad++ ,配合cmd指令使用,新建文件再使用printf时发现打印中文为乱码,解决方案如下,新建文件编码改为ANSI码

1.数据类型

整型实型字符型数组类型共用体类型空类型
intfloatchar[    ]unvoidvoid
shortdouble枚举类型结构体类型指针类型
longenumstruct*

2.占位符 %+

d十进制整数
c单个字符
s多个字符
f小数,指定位数,&-m.nf
x16进制输出
p内存地址16进制输出,运算符&

 示例代码

#include <stdio.h>

int main()
{
	char a = '#';
	printf("a的内存地址是%p\n",&a);//012FFABB
	return 0;
}

3.运算和强转

	int aa = 10;
	int bb = 3;
	float result = (float)aa / bb;

	printf("%f\n", result);
	printf("%f\n", (float)21 / 20);

 4.其它输入输出方式

除了printfscanf两种函数,还有putget方法

putsprintf的区别
1.自动加入换行符
2.仅能输出字符串

    char c;
	
	puts("请输入一个字符");
	c = getchar();
	puts("你输入的字符是");
	putchar(c);

5.已经有了基础的知识了,那么直接上实战

一  大小写字母转换

首先可以知道,每个字符对应ANSI码,如 a=97,b=98,A=65,B=66 ,大小写相差32:

	char a = 'a';
	char b = 'b';
	char A = 'A';
	char B = 'B';
	
	printf("a=%d,b=%d,A=%d,B=%d\n",a,b,A,B);
	//a=97,b=98,A=65,B=66 ANSI码

所以可以写一个简易的大小写转化程序:

	char c;
	char d;
	
    printf("请输入一个小写字母\n");
	scanf("%c",&c);
	
	d = c - 32;
	printf("你输入的小写字母是%c\n",c);
	printf("对应大写字母是%c\n",d);

 学习了 putchar()getchar() ,发现有更简单的实现方法:

putchar(getchar() - 32);

以此延伸,把上述两种方法结合,分别小写改大写,大写改小写:

	char c;
	char d;
	
    puts("请输入一个小写字母\n");
	scanf("%c",&c);
	
	d = c - 32;
	printf("你输入的小写字母是%c\n",c);
	printf("对应大写字母是%c\n",d);
	
	puts("请输入一个大写字母,将为您改为小写\n");
	putchar(getchar() + 32);

 运行发现问题 ,首先puts不需要额外加换行符,其次getchar根本没给我输入机会,直接生成了字符,可能是getchar直接吸收了上面打完scanf后的回车导致的,这里采用加一个getchar()来吸收回车的方式:

	char c;
	char d;
	
    puts("请输入一个小写字母");
	scanf("%c",&c);
	
	d = c - 32;
	printf("你输入的小写字母是%c\n",c);
	printf("对应大写字母是%c\n",d);
	
	puts("请输入一个大写字母,将为您改为小写");
	getchar();
	putchar(getchar() + 32);

二  求最小公倍数

#include<stdio.h>
int main()
{
	int a;
	int b;
	int c;
	
	puts("分别输入两个数");
	scanf("%d%d",&a,&b);
	printf("你输入的数为%d和%d\n",a,b);
	
	if(a>b){
		c = a;
	}
	else{
		c = b;
	}
	
	while(c%a != c%b)
	{
		c++;
	}
	
	printf("%d",c);
	return 0;
}

三  制作一个简易的计算器

scanf函数连续使用%c被跳过:用” %f%c%f “时%c会直接被读为回车,所以输入完一个data1后不需要按回车,直接输入想输入的字符即可。

#include<stdio.h>
int main()
{
	int data1;
	int data2;
	char character;
	int result1;
	char continue_y_or_n = 'y';
	
	while(continue_y_or_n == 'y')
	{
		//请输入算式
	printf("请输入算式\n");
	scanf("%d%c%d",&data1,&character,&data2);
	printf("你输入的算式为%d%c%d\n",data1,character,data2);
	
	switch (character)
	{
	case '+':
		result1 = data1 + data2;
		break;
	case '-':
		result1 = data1 - data2;
		break;
	case '*':
		result1 = data1 * data2;
		break;
	case '/':
		result1 = data1 / data2;
		break;
	default:
	    printf("请输入正确的运算符\n");
		continue;
	}
	printf("结果为%d\n",result1);
	getchar();//吸取输入算式后输入的enter键
	puts("是否继续,是请输入y,否则输入其它");
	scanf("%c",&continue_y_or_n);
	}
	
	return 0;
}

6.数组

一维数组:

简明:

格式:int a[10] = {1,2,3,4,5,6};

第七到十的值都默认是 0 

创建一个长度为10的数组,自动使得每个值比对应的下标大100,输出所有元素及其地址

#include<stdio.h>

int main(){
	int a[10];
	int index;
	for(index = 0;index < 10;index++){
		a[index] = index + 100;
	}
	for(index = 0;index < 10;index++){
		printf("a[%d] = %d , address: %p\n",index,a[index],&a[index]);
	}
	return 0;
}

结果

a[0] = 100 , address: 000000000061FDF0
a[1] = 101 , address: 000000000061FDF4
a[2] = 102 , address: 000000000061FDF8
a[3] = 103 , address: 000000000061FDFC
a[4] = 104 , address: 000000000061FE00
a[5] = 105 , address: 000000000061FE04
a[6] = 106 , address: 000000000061FE08
a[7] = 107 , address: 000000000061FE0C
a[8] = 108 , address: 000000000061FE10
a[9] = 109 , address: 000000000061FE14

或者另一种定义方式

int arr[] = {5,8,2,3,9,1,0};
	int size;
	size = sizeof(arr)/sizeof(arr[0]);
	printf("arr的长度为:%d",size);

实战:斐波那契数列(Fibonacci sequence)

a[n] = a[n-1] + a[n-2]

0,1,1,2,3,5,8,13,..........

其中0,1手动填入

#include<stdio.h>

int main(){
	
	int fb[30] = {0,1};
	int i,arr_size;
	arr_size = sizeof(fb)/sizeof(fb[0]);
	
	printf("%d\n",fb[0]);
	printf("%d\n",fb[1]);
	
	for(i = 2;i < arr_size;i++){
		fb[i] = fb[i-1] + fb[i-2];
		printf("%d\n",fb[i]);
	}
	return 0;
}

二维数组:

#include<stdio.h>
int main(){
	int arr[2][3] = {{2,3,4},{3,4,5}};
	int i,j;
	for(i = 0;i<2;i++){
		for(j = 0;j<3;j++){
			printf("此二维数组的第%d行%d列的数值为%d\n",i+1,j+1,arr[i][j]);
		}
	}
	return 0;
}

其它定义方式:可以不写行,但是必须定义列,可以自动生成行数

\t   :制表符

	int arr1[3][4] = {1,2,3};
	int arr2[3][4] = {{1},{2},{3}};
	int arr3[3][4] = {{1},{5,6}};
	int arr4[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	
	int i,j,arr_size;

	arr_size = sizeof(arr4)/sizeof(arr4[0]);

	for(i = 0;i<arr_size;i++){
		for(j = 0;j<4;j++){
		    printf("%d\t",arr4[i][j]);
		}
		putchar('\n');
	}
数组arr1arr2arr3arr4
结果1 2 3 0
0 0 0 0
0 0 0 0
1 0 0 0
2 0 0 0
3 0 0 0
1 0 0 0
5 6 0 0
0 0 0 0
1 2 3 4
5 6 7 8
9 10 11 12

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值