一、什么是程序
-
程序(program)是一个精确说明如何进行计算的指令(instruction)序列。
-
人和计算机交换信息所用的语言,称为计算机语言。
程序 = 算法 + 数据结构
#include<stdio.h>
int main( )
{
char p[] = "Hello world!";
printf("%s\n",p);
return 0;
}
1.自然语言和形式语言
-
什么是自然语言?
-
什么是形式语言?
两者区别和联系:
歧义性
冗余性
与字面意思的一致性
2.软件的形成
-
软件的形成
-
程序员(programmer)编写程序源代码(Source Code)
-
编译器(Compiler)把源代码转化为可被计算机理解的机器代码(Machine Code)
-
并把计算机代码以可以执行文件(Executable File)的形式保存在磁盘上
程序 = 文档 = 软件
-
1)求1~100的和
#include<stdio.h>
int main( )
{
int total = 0;
int i;
for(i = 1; i <= 100; i++)
{
total = total + 1;
}
printf("%d\n",total);
return 0;
}
2)加法计算
#include<stdio.h>
int main( )
{
int a = 3;
int b = 5;
a = a + b;
printf("%d %d\n", a, b,);
return 0;
}
3.指令的分类
-
输入:从键盘、文件或者其他设备获取数据。
-
输出:把数据显示到屏幕,或者存入一个文件,或者发送到其他设备。
-
基本运算:执行最基本的数学运算(加减乘除)和数据存取。
-
测试和分支:测试某个条件,然后根据不同的测试结果执行不同的后续指令。
-
循环:重复执行一系列操作。
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
1)交换函数
-
加一个媒介temp
#include<stdio.h>
int main( )
{
int a = 3;
int b = 5;
int temp;
printf("%d %d\n", a, b);
temp = a;
a = b;
b = temp;
printf("%d %d\n", a, b);
return 0;
}
-
加法交换
#include<stddio.h>
int main()
{
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("%d %d\n", a, b);
return 0;
}
2)两数比较大小
-
if语句
#include<stdio.h>
int main( )
{
int a = 3;
int b = 5;
printf("%d %d\n", a,b);
if(a > b)
printf("a 比 b 大\n");
else if(a == b)
printf("a 等于 b \n");
else
printf("a 比 b 小\n");
return 0;
}
4.计算机基本工作过程
-
编程的本质是把复杂的任务分解成子任务,把子任务在分解成跟简单的任务,层层分解,直到最后简单得可以用以上所述指令来完成。
练习目录

1)求一个三位数各位数和
-
分别取余后求和
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 123;
int total;
total = a % 10 + a / 10 % 10 + a /100 % 10;
printf("%d\n", total);
return 0;
}
-
循环 迭代
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 12345;
int total = 0;
while(a > 0)
{
total = total + a % 10;
a = a / 10;
}
printf("%d\n", total);
return 0;
}
#include<stdio.h>
int my_atoi(char *str)
{
int total = 0;
int i = 0;
//迭代
while(str[i] !='\0')
{
total = total * 10 + (str[i] - '0');
i++;
}
return total;
}
int main()
{
char str[5] = "123";
int total = 0;
//total = (str[0] - '0') * 100 + (str [1] - '0') * 10 + (str[2] - '0') * 1;
total = my_atoi(str);
printf("%d\n",total);
return 0;
}
1)求1~100的和
#include<stdio.h>
int main( )
{
int total = 0;
int i;
for(i = 1; i <= 100; i++)
{
total = total + 1;
}
printf("%d\n",total);
return 0;
}
2)统计1~100中数字9的个数
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int count_one(int n)
{
int total = 0;
while(n > 0)
{
if (n % 10 == 9)
{
total++; //++total;
}
n = n / 10;
}
return total;
}
int count_9(int start,int end)
{
int i;
int total = 0;
for(i = start; i <= end; i++)
{
total += count_one(i);
}
return total;
}
int main()
{
int a =12345;
int total = count_9(1, 100);
printf("%d\n",total);
return 0;
}
3)求100以内的素数
#include<stdio.h>
int is_prime(int n)
{
int i;
if(n < 2)
{
return 0;
}
for(i = 2; i < n; i++;)
{
if (n % i == 0)
{
return 0;;
}
}
return 1;
}
int main()
{
int i;
for(i = 1; i <= 100; i++)
{
if(is_prime(i) == 1)
{
printf("%d",i);
}
}
printf("\n");
return 0;
}
3)优化
#include<stdio.h>
int is_prime(int n)
{
int i;
if(n < 2)
{
return 0;
}
for(i = 2; i < n; i++;)
{
if (n % i == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int i;
for(i = 1; i <= 100; i++)
{
if(is_prime(i) == 1)
{
printf("%d",i);
}
}
printf("\n");
teturn 0;
}
4)计算π的值
π=4 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...
#include<stdio.h>
double get_pi(int n)
{
double total = 0.0;
int flag = 1;
int i;
for (i = 0; i <= n; i++)
{
total += 1.0/(2 * i + 1) * flag;
flag = -flag;
}
return total * 4;
}
int main ()
{
int i;
printf("%.15f\n",get_pi(100));
printf("%.15f\n",get_pi(10000));
printf("%.15f\n",get_pi(1000000));
printf("%.15f\n",get_pi(100000000));
return 0;
}
5)求1000以内的完数
#include<stdio.h>
//打印因子
void print_factor(int n)
{
int i;
for(i = 1; i < n; i++)
{
if(n % i == 0)
{
printf("%d", i);
}
}
printf("\n");
}
int is_perfect_number(int n)
{
int i;
int total = 0;
for(i = 1; i < n; i++)
{
if(n % i == 0)
{
total += i;
}
}
if(total == n)
{
return 1;
}else
{
return 0;
}
}
int main()
{
int i;
printf("\n");
for(i = 1; i <= 1000; i++)
{
if(is_perfect_number(i) == 1)
{
printf("%d", i);
print_factor(i);
}
}
printf("\n");
return 0;
}
6)求水仙花数
#include<stdio.h>
#include<stdlib.h>
int is_narcissistic_flower(int n)
{
int total = 0;
int low;
// n的值变了所以加一个
int n_o = n;
while(n > 0)
{
low = n % 10;
total += low * low * low;
n = n / 10;
}
if(n_o == total)
{
return 1;
}else
{
return 0;
}
}
int main()
{
int i;
for(i = 100; i < 1000; i++)
{
if(is_narcissistic_flower(i) == 1)
{
printf("%d\n", i);
}
}
retun 0;
}
7)神秘的三位数
#include<stdio.h>
#include<stdlib.h>
int is_mytrious(int n)
{
int total = 0;
int n_o = n;
while(n > 0)
{
total += factorial(n % 10);
n /= 10;
}
if(total == n_o)
{
return 1;
}else
{
return 0;
}
}
int main()
{
int i;
for(i = 100;i < 1000;i++)
{
if (is_mytrious(i) == 1)
{
printf("%d\n",i);
}
}
return 0;
}
5.程序调试
-
错误:
-
编译时错误;
-
运行时错误;1.野指针 2.内存越界 3.内存泄漏
-
逻辑错误和语义错误;
-
-
警告
警告意味着风险!
重视警告!
把每一条警告都理解,并总结出来。
问题 <?>
1.程序为什么编译后才能运行?
2.编译出来的可执行文件里面有什么?除了机器码还有什么?他们是怎么组织的?
3.#include<stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?如何实现的?
4.helloWorld程序是怎么运行起来的?操作系统是怎么装载它的?main函数之间发生了什么?main函数结束后又发生了什么?
5.如果没有操作系统,helloworld可以运行吗?
6.Helloworld程序运行时,它在内存中是什么样子的?
注:C语言的优缺点
优点:
-
程序执行效率高
-
能直接对硬件进行操作
-
语言简练,灵活,使用方便
-
可移植性较好
缺点:
-
不易学习
-
代码不容易维护
-
过于强大灵活,以至于容易产生致命Bug
注:C语言特点
-
C语言是一个有结构化程序设计,具有变量作用域以及递归功能的过程式语言
-
传递参数是以值传递(Pass-by-value),也可以通过指针来传递参数(Pass-by-address)。
-
不同的变量类型可以用结构体(struct)组合在一起。
-
只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。
-
部份的变量类型可以转换,例如整形和字符变量。
-
通过指针(pointer),C语言可以容易的对存储器进行低级控制。
-
编译预处理(preprocessor)让C语言的编译更具有弹性。
6.程序的结构
-
C程序总是从main函数开始执行,并且一定有且仅有一个主函数,主函数名必须是main。
-
C语言本身不带输入输出语句,必须通过调用库函数来实现输入输出。
-
以/ ...... /之间的内容是注释,不影响程序的执行,可增加程序的可读性。
-
/* /* */ */