文章目录
前言
一、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.第二章 数据类型
- 变量与常量
- 从广义的角度来讲声明中包含着定义(声明的范围比定于的范围更大),即定义是声明的一个特例,所以并非所有的声明都是定义
- 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;
}
- 数据类型所占空间大小
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;
}
- 整形变量的定义和输出
- %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;
}
- 整形变量输入
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;
}
- 进制
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;
}
- 有符号与无符号
- 有符号数是最高位为符号位,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
*/
}
- 思考:大小写字母的转换
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;
}
- 字符变量的输入
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.为什么用补码来表示数据呢?
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);
- 字符串
字符串是内存中一段连续的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
4.第四章 程序流程结构
- 顺序结构
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;
}
- 选择结构
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 if…else if…else结构
#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;
}
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;
}
- 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;
}
- 跳转结构
- 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.第五章 数组和字符串
- 一维数组
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;
}
- 二维数组
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提供了大量能使我们快速便捷地处理数据的函数和方法。
这篇博客详细介绍了C语言的基础知识,包括Visual Studio 2019的安装、数据类型、运算符、程序流程结构、数组、字符串、函数、指针、复合类型、文件操作和内存管理。特别强调了数据类型的声明与定义的区别,以及各种运算符和循环结构的使用。
5043

被折叠的 条评论
为什么被折叠?



