C语言程序设计

这篇博客详细介绍了C语言的基础知识,包括Visual Studio 2019的安装、数据类型、运算符、程序流程结构、数组、字符串、函数、指针、复合类型、文件操作和内存管理。特别强调了数据类型的声明与定义的区别,以及各种运算符和循环结构的使用。


前言


一、visual studio 2019安装教程

参考链接:安装教程

https://blog.csdn.net/YSJ367635984/article/details/104648941

二、参考教材

《C语言程序设计》 主编:张其文

三、代码

1.第一章 绪论

1-1
#include <stdio.h>
int main()
{
	//这是第一个C语言程序代码 
	printf("hello world\n");
	printf("This is my first program. \n");	
	
	return 0;
}

注意:C语言的源代码文件扩展名必须是.c。

1-2
#include<stdio.h>						
int main()								
{
	int i;								
	i=1;							
	while(i<=5)						
	{
		printf("%d\t%d\n",i, i*i);			
		i=i+1;						
	}
	return 0;							
}
1-3 计算长方形的面积
#include <stdio.h>						
int main( )						
{
	int length, width, area;			
	length=25;						
	width=10;						
	area=length*width;					/*计算面积*/
	printf("The area equals %d",area);		/*输出面积的值*/
	return 0;						
}
1-4 计算圆的面积
#include <stdio.h>		
#define PI 3.14159			
int main()
{
	float radius, area;			/*定义变量*/
	radius=10.0;				/*赋值*/
	area=PI*radius*radius;		/*计算圆的面积*/
	printf("area=%f", area);	/*输出*/
	return 0;
}

笛卡尔的爱心函数故事

1-5 笛卡尔坐标系爱心公式:r=a(1-sinθ)
#include <stdio.h>
#include<Windows.h>
int main()
{
	for (double y = 1.5; y > -1.5; y -= 0.1)
	{
		for (double x = -1.5; x < 1.5; x += 0.05)
		{
			double a = x * x + y * y - 1;
			putchar(a * a * a - x * x * y * y * y <= 0.0f ? '*' : ' ');
		}
		
		system("color 0c");
		putchar('\n');
	}
	
	return 0;
}

2.第二章 数据类型

  1. 变量与常量
  • 从广义的角度来讲声明中包含着定义(声明的范围比定于的范围更大),即定义是声明的一个特例,所以并非所有的声明都是定义
  • int a 它既是声明,同时又是定义
  • 对于 extern int a 而言此时它只是声明不是定义,不给变量a 分配空间,不可以赋值
2-1 
#include<stdio.h>
int main() {

	int a; //定义变量,且为变量分配的空间
	extern int b;  //声明一个变量b,b在这里没有建立存储空间
	const int c = 10; //定义了一个常量c

	a = 100;
	//b = 200; //err  被extern键字修饰的变量,只声明,不定义,不分配空间,不可以赋值
	//c = 300; //err 常量不可赋值

	printf("a = %d,c =%d\n",a,c);

	return 0;
}
  1. 数据类型所占空间大小
2-2 数据类型大小
#include<stdio.h>

int main() {

	char a = 'A';
	int b = 10;
	short c = 10;
	long d = 10;
	long long e = 10;
	float f = 10;

	printf("sizeof(a) = %d,sizeof(b) = %d,sizeof(c) = %d\n",sizeof(a),sizeof(b),sizeof(c));
	printf("sizeof(d) = %d,sizeof(e) = %d,sizeof(f) = %d\n", sizeof(d), sizeof(e), sizeof(f));

	printf("sizeof(char) = %d,sizeof(int) = %d,sizeof(short) = %d\n", sizeof(char), sizeof(int), sizeof(short));
	printf("sizeof(long) = %d,sizeof(long long) = %d,sizeof(float) = %d\n", sizeof(long), sizeof(long long), sizeof(float));


	return 0;
}
  1. 整形变量的定义和输出
  • %d :输出一个有符号的10进制int类型
  • %o(字母o) :输出8进制的int类型
  • %x :输出无符号16进制的int类型,字母以小写输出
  • %X :输出无符号16进制的int类型,字母以大写输出
  • %u : 输出一个10进制的无符号数
2-3 
#include <stdio.h>

int main()
{
	int a = 1234;	//定义变量a,以10进制方式赋值为1234
	int b = 04567;	//定义变量b,以8进制方式赋值为04567
	int c = 0xabcd;	//定义变量c,以16进制方式赋值为0xabcd

	printf("a = %d\n", a);
	printf("8进制: b = %o\n", b);
	printf("10进制:b = %d\n", b);
	printf("16进制:c = %x\n", c);
	printf("16进制:c = %X\n", c);
	printf("10进制:c = %d\n", c);

	return 0;
}
  1. 整形变量输入
2-4 在控制台输入一个数据 scanf("%d", &a);
#pragma warning(disable:4996)  //注意:要是不加此行代码,vs2019会报错C4996
#include <stdio.h>
int main()
{
	int a;
	
	printf("请输入a的值:");
	scanf("%d", &a); //注意:不要加“\n”

	printf("a = %d\n", a); //打印a的值

	return 0;
}
  1. 进制

进制之间的转换方法
在线进制转化工具

2-5 进制
#include <stdio.h>
int main()
{
	int a = 123;	//定义变量a,以10进制方式赋值为123
	int b = 0567;	//定义变量b,以8进制方式赋值为0567
	int c = 0xabc;	//定义变量c,以16进制方式赋值为0xabc

	printf("a = %d\n", a);
	printf("8进制:b = %o\n", b);
	printf("10进制:b = %d\n", b);
	printf("16进制:c = %x\n", c);
	printf("16进制:c = %X\n", c);
	printf("10进制:c = %d\n", c);

	unsigned int d = 0xffffffff; //定义无符号int变量d,以16进制方式赋值
	printf("有符号方式打印:d = %d\n", d);
	printf("无符号方式打印:d = %u\n", d);
	return 0;
}
  1. 有符号与无符号
  • 有符号数是最高位为符号位,0代表正数,1代表负数。
  • 无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。所以无符号数比有符号数表示的数大
  • 1、[+0]原码=0000 0000, [-0]原码=1000 0000;
    2、[+0]反码=0000 0000, [-0]反码=1111 1111;
    3、[+0]补码=0000 0000, [-0]补码=0000 0000。
    在这里你会发现,+0和-0的补码是一样的,即0的补码只有一种表示。
    在这里插入图片描述
2-6
#include <stdio.h>
int main()
{
	signed int a = -1089474374; //定义有符号整型变量a
	printf("%X\n", a); //结果为 BF0FF0BA
	return 0;

	//  1100 0000 1111 0000 0000 1111 0100 0110    (1)写出-1089474374 的原码
	//  1011 1111 0000 1111 1111 0000 1011 1001    (2)取反
	//  1011 1111 0000 1111 1111 0000 1011 1010   (3)+1 -->补码
   //    B    F    0    F     F   0    B	 A
}
2-7
#include <stdio.h>
int main()
{
       char n = -1;
       printf("%d\n", n); //-1
       printf("%u\n", n); //4294967295
       //原码:  1000 0000 0000 0000 0000 0000 0000 0001
       //反码:  1111 1111 1111 1111 1111 1111 1111 1110
       //补码:  1111 1111 1111 1111 1111 1111 1111 1111
       //截取:                                1111 1111   (char占一个字节8位)
       //补高位:1111 1111 1111 1111 1111 1111 1111 1111  (u:无符号,默认为正数,此时的补码就是原码)
       //       1111 1111 1111 1111 1111 1111 1111 1111  =  4294967295
       
       signed char n_1 = -1;
       printf("%d\n", n_1); //-1
       printf("%u\n", n_1);//4294967295
       unsigned char n_2 = -1;
       printf("%d\n", n_2); //255
       //原码: 1000 0000 0000 0000 0000 0000 0000 0001
       //反码: 1111 1111 1111 1111 1111 1111 1111 1110
       //补码: 1111 1111 1111 1111 1111 1111 1111 1111
       //截取:                               1111 1111
      //补高位:000 0000 0000 0000 0000 00000 1111 1111 (unsigned char 高位补0)
       char a = -128;
       printf("%d\n",a);  //-128
       printf("%u\n", a); //4294967168
       return 0;
}
2-8
#include <stdio.h>
int main()
{
	signed int a = -1089474374; //定义有符号整型变量a
	printf("%X\n", a); //结果为 BF0FF0BA

	//解释:
	//  1100 0000 1111 0000 0000 1111 0100 0110    (1)写出-1089474374 的原码
	//  1011 1111 0000 1111 1111 0000 1011 1001    (2)取反
	//  1011 1111 0000 1111 1111 0000 1011 1010   (3)+1 -->补码
    //    B    F    0    F     F   0    B	 A

	char b = -1;       //我们写的是原码,但是计算机在C语言中,有符号整型数的存储、运算的过程,都是采用补码形式的
	printf("%X\n", b); //输出的是原码    %X	输出无符号16进制的int类型,字母以大写输出
	printf("%d\n", b); //输出的是原码    %d	输出一个有符号的10进制int类型

	return 0;
	/* 解释:
	1000 0000 0000 0000 0000 0000 0000 0001    (1)-1的原码
	1111 1111 1111 1111 1111 1111 1111 1110    (2)取反
	1111 1111 1111 1111 1111 1111 1111 1111    (3)+1 -->补码
	 F     F   F     F    F   F     F    F       %X 无符号   此时补码就是原码 
												printf("%X\n", b);//FFFFFFFF


	1000 0000 0000 0000 0000 0000 0000 0001    (1)-1的原码
	1111 1111 1111 1111 1111 1111 1111 1110    (2)取反
	1111 1111 1111 1111 1111 1111 1111 1111    (3)+1 -->补码
	                                            %d 有符号   此时补码不等于原码 故需要将补码转回原码输出显示
	1111 1111 1111 1111 1111 1111 1111 1110     补码-1
	1000 0000 0000 0000 0000 0000 0000 0001     取反
	                                            printf("%d\n", b); //-1
	
	*/
}

  1. 思考:大小写字母的转换
2-9
#include <stdio.h>
int main()
{
	char ch = 'a';
	printf("sizeof(ch) = %u\n", sizeof(ch));

	printf("ch[%%c] = %c\n", ch); //打印字符
	printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值

	char A = 'A';
	char a = 'a';
	printf("a = %d\n", a);		//97
	printf("A = %d\n", A);	//65

    //大小写字母互转
	printf("A = %c\n", 'a' - 32); //小写a转大写A
	printf("a = %c\n", 'A' + 32); //大写A转小写a

	ch = ' ';
	printf("空字符:%d\n", ch); //空字符ASCII的值为32
	printf("A = %c\n", 'a' - ' '); //小写a转大写A
	printf("a = %c\n", 'A' + ' '); //大写A转小写a

	return 0;
}
  1. 字符变量的输入
2-10
#pragma warning(disable:4996) 
#include<stdio.h>
int main() {

	char c;
	printf("请输入一个字母:c = ");
	scanf("%c",&c); //这里不要加\n,否则控制台不会输出
	printf("%c\n",c);

	return 0;
}
  1. 数值在计算机内存存储方式

    在计算机系统中,数值一律用补码来存储。
    1.为什么用补码来表示数据呢?
    2.原码反码补码
    注意:
    赋值时(输入),赋的是十进制,给的是原码;
    如果赋值时(输入)给的是八进制或者十六进制给的是补码;
    打印时(输出),十进制打印要的是原码,如果是十六进制或八进制打印要的数补码。

2-11 练习
 char ch = 0x82;
//补码:  1000 0010
//反码:  1111 1101
//原码:  1111 1110  = -126
printf("%d\n",ch);
printf("%0x\n",ch);

int num = 0x80 00 00 01;
//补码: 1000 0000 0000 0000 0000 0000 0000 0001
//反码: 1111 1111 1111 1111 1111 1111 1111 1110 
//原码: 1111 1111 1111 1111 1111 1111 1111 1111 = -7fffffff
printf("%d\n",num);
	
char ch = -123;
printf("%d\n",ch);
	
	
int num = 0xffffffff
//补码: 1111 1111 1111 1111 1111 1111 1111 1111
//反码: 1000 0000 0000 0000 0000 0000 0000 0000 
//原码:   1000 0000 0000 0000 0000 0000 0000 0001  = -1
printf("%d\n",num);
  1. 字符串
    字符串是内存中一段连续的char空间,以’\0’(数字0)结尾。
    字符串常量是由双引号括起来的字符序列,如“hello”、“C++”,“$12.68”等都是合法的字符串常量。
    注意:字符串常量与字符常量的不同:
    ‘a’:表示字符常量
    “a”:表示字符串常量
    每个字符串的结尾,编译器会自动的添加一个结束标志位’\0’,即 “a” 包含两个字符’a’和’\0’,‘a’只有一个字符。

统计字符的个数
getchar()函数使用

2-12
#include<stdio.h>
int main()
{
	char c;
	int numEng = 0, numSp = 0, numDig = 0, numElse = 0;
	printf("请输入一行字符:\n");
	while ((c = getchar()) != '\n')
	{
		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')  //判断字母
			numEng++;
		else if (c >= '0' && c <= '9') //判断数字
			numDig++;
		else if (c == ' ') //判断空格
			numSp++;
		else   //判断其他
			numElse++;
	}
	printf("字母数:%d\n空格数:%d\n数字数:%d\n其他字符数:%d\n", numEng, numSp, numDig, numElse);

	return 0;
}

3.第三章 运算符及表达式

  1. ** 1**
  • 1

4.第四章 程序流程结构

  1. 顺序结构
4-1
#include<stdio.h>
int main() {

	int a = 10;
	int b = 20;
	int c = 30;
	int sum = 0;

	sum = a + b + c;
	printf("%d\n", sum);
	return 0;
}
  1. 选择结构
4-2 if结构

#include <stdio.h>
int main()
{
	int a = 100;
	int b = 200;

	if (a > b)
	{
		printf("%d\n", a);
	}

	return 0;
} 
4-3 if-else结构

#include <stdio.h>
int main()
{
	int a = 100;
	int b = 200;

	if (a > b)
	{
		printf("%d\n", a);
	}else{
        printf("%d\n", b);
    }

	return 0;
} 
4-4 ifelse ifelse结构

#include <stdio.h>
int main()
{
	unsigned int a;
	scanf("%u", &a);

	if (a < 10)
	{
		printf("一位数\n");
	}
	else if (a < 100)
	{
		printf("二位数\n");
	}
	else if (a < 1000)
	{
		printf("三位数\n");
	}
	else
	{
		printf("很大的数呀!\n");
	}

	return 0;
}
4-5 三目运算符
#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int max = ( a > b ? a : b );
	printf("max = %d\n", max);

	return 0;
}

switch-case结构

4-6 
#include <stdio.h>

int main()
{
	char c;
	c = getchar();

	switch (c) //参数只能是整型变量
	{
	case '1':
		printf("OK\n");
		break;
	case '2':
		printf("not OK!\n");
		break;
	default:
		printf("are u ok?\n");
	}
	return 0;
}
  1. 循环结构
  • do -while语句循环
  • while语句循环
  • for语句循环
4-7
#include<stdio.h>

int fun_1(int num) {
	int sum=0;
	for (int i = 0; i <= num; i++)
	{
		sum += i;
	}

	return sum;
}

int fun_2(int num) {
	int sum = 0;
	int i = 0;
	while (i<=num)
	{
		sum += i;
		i++;
	}
	return sum;
}


int fun_3(int num) {
	int sum = 0;
	int i = 0;
	do {
		sum += i;
		i++;
	} while (i<=num);
	return sum;
}


int main() {
	int result;
	result = fun_1(100);

	printf("result = %d\n",result);
	return 0;
}

嵌套循环

4-8 九九乘法表
#include<stdio.h>
int main() {

	for (int i = 1; i < 10; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			printf("%d * %d =%d \t",j,i,i*j);

		}
		printf("\n");

	}

	return 0;
}
  1. 跳转结构
  • break
    在switch条件语句和循环语句中都可以使用break语句:
     当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。
    当它出现在循环语句中,作用是跳出当前内循环语句,执行后面的代码。
    当它出现在嵌套循环语句中,跳出最近的内循环语句,执行后面的代码。
     不管是 for 循环,还是 while 循环,或者是 do…while 循环,都可以用 break 跳出来,但是 break 只能跳出一层循环。当有多层循环嵌套的时候,break只能跳出“包裹”它的最里面的那一层循环,无法一次跳出所有循环。
    注意:直接与if运用是不可以的。但是你把if语句嵌套在while语句块中,就可以在if语句中使用break;
4-9
#include<stdio.h>
int main() {
	int sum = 0;
	for (int i = 0; i <=100; i++)
	{
		if (0==i%2) {
			break;  //break直接跳出了最近的一层循环,可以换成continue
		}
		sum += i;
	}

	printf("100以内的奇数之和为:%d\n",sum);  //此时输出为0
	return 0;
}
4-10
#pragma warning(disable:4996)
#include<stdio.h>
int main() {

	int num;

	printf("请输入你的成绩:");
EN:	scanf("%d",&num);
	int flag = 0;
	if (num>=0&&num<60)
	{
		flag = 0;
	}
	else if (num>=60&&num<=80)
	{
		flag = 1;
	}else if(num >= 80 && num <= 100)
	{
		flag = 2;
	}
	else
	{
		printf("输入错误,请重新输入: \n");
		goto EN;
	}

	switch (flag)
	{
	case 0:
		printf("不及格,需要继续努力!\n");
		break;
	case 1:
		printf("合格,还不错!\n");
		break;
	case 2:
		printf("你很优秀!\n");
		break;
	default:
		break;
	}

	return 0;
}
  • continue
4-11
#include<stdio.h>
int main() {
	int sum = 0;
	for (int i = 0; i <=100; i++)
	{
		if (0==i%2) {
			continue;
		}
		sum += i;
	}

	printf("100以内的奇数之和为:%d\n",sum);
	return 0;
}
  • goto
4-12 无条件跳转(尽量少用!)
#include <stdio.h>

int main()
{
	goto End; //无条件跳转到End的标识
	printf("aaaaaaaaa\n");//该行不执行

End:
	printf("我真帅!\n");
	return 0;
}

5.第五章 数组和字符串

  1. 一维数组
5-1 一维数组逆序
#include<stdio.h>
int main17() {

	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

	int len = sizeof(arr) / sizeof(arr[0]);
	int temp;

	for (int i = 0,j=len-1; i < len/2; i++,j--)
	{
		temp=arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	for (int i = 0; i < len; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");

	return 0;
}
5-2 冒泡排序
#include<stdio.h>
int main() {
	int arr[] = { 1,21,3,4,51,6,7,8,9,10 ,2,88,0};

	int len = sizeof(arr) / sizeof(arr[0]);
	int pF = 0;

	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				pF = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = pF;
			}
		}
	}

	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}
5-3 一维数组元素最大值

#include <stdio.h>
int main()
{
	int a[] = {  1, -2, 3,-1, 5, -6, 7, -8, -9, 10,12 };

	int i = 0;
	int max = a[0];
	for (i = 1; i < sizeof(a) / sizeof(a[0]); i++)
	{
		if (a[i] > max)
		{
			max = a[i];
		}
	}
	printf("数组中最大值为:%d\n", max);

	return 0;
}
  1. 二维数组
5-4 成绩统计
#include<stdio.h>
int main() {
	//行代表人:  1号到5号
	//列代表科目:语、数、外、历
	float a[5][4] = {
		{ 80, 75, 56,80 },
		{ 59, 65, 71,28 },
		{ 59, 63, 70 ,91},
		{ 85, 45, 90 ,28},
		{ 76, 77, 45 ,86}
	};

	//统计每科不及格的人数
	int person_low[4] = { 0 };
	//统计每个平均分
	float lesson_aver[4] = { 0 };
	float sum = 0;

	for (int i = 0; i < sizeof(a[0]) / sizeof(a[0][0]); i++)
	{
		for (int j = 0; j < sizeof(a) / sizeof(a[0]); j++)
		{
			sum += a[j][i];

			if (a[j][i] < 60)
			{
				person_low[i]++;
			}
		}
		lesson_aver[i] = sum / 5.0;
		sum = 0;
	}

	for (int i = 0; i < sizeof(a[0]) / sizeof(a[0][0]); i++)
	{
		switch (i)
		{
		case 0:
			printf("语文不及格的人数为别为:%d \n", person_low[i]);
			printf("语文平均分为:%.3f \n", lesson_aver[i]);
			break;
		case 1:
			printf("数学不及格的人数为别为:%d \n", person_low[i]);
			printf("数学平均分为:%.3f \n", lesson_aver[i]);
			break;
		case 2:
			printf("英语不及格的人数为别为:%d \n", person_low[i]);
			printf("英语平均分为:%.3f \n", lesson_aver[i]);
			break;
		default:
			printf("历史不及格的人数为别为:%d \n", person_low[i]);
			printf("历史平均分为:%.3f \n", lesson_aver[i]);
			break;
		}

	}

	return 0;
}

6.第六章 函数

6- 水仙花数

#include<stdio.h>
int shuiFun(int num) {

	int i, j, k;
	i = num / 100;
	j = (num / 10) % 10;
	k = num % 10;

	if (num == i*i*i+j*j*j+k*k*k)
	{
		printf("%d ",num);
		return num;
	}
	return 0;
}

int main() {

	int sum = 0;
	for (int i = 100; i <= 999; i++)
	{
		sum +=shuiFun(i);
	}
	printf("三位数的水先花数之和为:%d\n",sum);
	return 0;
}

7.第七章 指针

8.第八章 复合类型

9.第九章 文件操作

10.第十章 内存管理

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值