@Sakura-W
2015-12-06T11:48:44.000000Z
字数 7182
阅读 1786
程序设计语言
(1)输出"Hello World"
#include <stdio.h>
int main()
{
printf("Hello World!\n")
}
(2)做简单的计算
#include <stdio.h>
int main()
{
printf("%d,12+13");
}
变量定义的一半模式:<变量类型> <变量名称>;
变量赋值与初始化
C语言是一种有类型的语言,定义变量时必须声明变量的类型,而且不可更改
#include <stdio.h>
int main()
{
int price = 0;
printf("请输入金额:");
scanf("%d",&price);
int change = 100 - price;
printf("%d",change);
return 0;
}
定义一个常量:
const int AMOUNT = 100;
输入多个变量:
scanf("%d %d",&price,&amout);
(1)浮点数:带小数点的数,小数点可变动
(2)double:双精度型浮点数,输入的时候用"%lf"而不用"%d"。输出的时候用"%f"
(3)float:单精度型浮点数
if(a > b){
if(a > c){
printf("三个数中最大的是%d",a);
}else{
printf("三个数中最大的是%d",c);
}
}else{
if(b > c){
printf("三个数中最大的是%d",b);
}else{
printf("三个数中最大的是%d",c);
}
}
int a;
scanf("%d",&a);
switch(a){
case 1:
printf("你好\n");
break;
case 2:
printf("早上好\n");
break;
case 3:
printf("晚上好\n");
default:
printf("再见\n");
}
int main(){
int input;
int n = 0;
scanf("%d",&input);
input /= 10;
n++;
while(input > 0){
n++;
input /= 10;
}
printf("这是个%d位数",n);
}
a += 1;a -= 1;a *= 1;a /= 1;
a++;a--;++a;--a;
do{
<循环体>
}while(<判断条件>);
先做一起循环体,然后再进行判断
int main(){
int number;
int sum = 0;
int n = 0;
scanf("%d",&number);
while(number != -1){
sum += number;
n ++;
scanf("%d",&number);
}
printf("%f",1.0*sum/n);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(0));
int a = rand()%100;
int number;
int count;
printf("我已经想好了一个数,来猜吧\n");
do{
scanf("%d",&number);
count ++;
if( number < a){
printf("猜小了\n");
}else if( number > a){
printf("猜大了\n");
}
}while(number != a);
printf("你只用了%d次就猜中了\n",count);
return 0;
}
int number,k;
int odd = 0;
int even = 0;
scanf("%d",&number);
while(number != -1){
k = number % 2;//判断奇数和偶数
if( k == 1){//一定不能写成k = 1!!
odd ++;
}else{
even++;
}
scanf("%d",&number);
}
printf("这串数字中奇数的个数是%d,偶数的个数是%d",odd,even);
return 0;
#include <stdio.h>
#include<math.h>
int main(){
int number,digit;
int ret = 0;
int wei = 1;
scanf("%d",&number);
do{
digit = number % 10;
if((digit + wei) % 2 == 0){//判断是否通奇同偶
ret = ret + pow(2, wei-1);
}
number /= 10;
wei ++;
}while(digit > 0);
printf("%d",ret);
return 0;
}
逻辑非:!
,逻辑与:&&
,逻辑或:||
。!
的优先级远远大于&&
和||
int main(){
int i,n;
int pre = 1;
scanf("%d",&i);
for(n = 2; n < i; n++){
if(i % n == 0){
pre = 0;
}
break;
}
if(pre == 1){
printf("%d是素数",i);
}else{
printf("%d不是素数",i);
}
return 0;
}
int main(){
int n;
int count = 0;
int x = 2;
while(count < 50){
int pre = 1;
for(n = 2; n < x; n++){
if(x % n == 0){
pre = 0;
break;
}
}
if(pre == 1){
printf("%d\n",x);
count++;
}
x++;
}
return 0;
}
(1)goto 方法
int main(){
int one,two,five;
int x = 2;
for(one = 1; one < x*10; one++){
for(two = 1; two < x*5; two++){
for(five = 1; five < x*4; five++){
if(one*1 + two*2 + five*5 == x*10){
printf("%d个一角,%d个两角,%d个五角能组成两元\n",one,two,five);
goto out;
}
}
}
}
out:
return 0;
}
(2)接力break方法
int main(){
int one,two,five;
int exit = 0;
int x = 2;
for(one = 1; one < x*10; one++){
for(two = 1; two < x*5; two++){
for(five = 1; five < x*4; five++){
if(one*1 + two*2 + five*5 == x*10){
printf("%d个一角,%d个两角,%d个五角能组成两元\n",one,two,five);
exit = 1;
break;
}
}
if(exit) break;
}
if(exit) break;
}
}
int main(){
int n,i;
double sum = 0.0;
double sign = 1.0;
scanf("%d",&n);
for (i = 1; i < n; i++){
sum += sign/i;
sign = -sign;
}
printf("f(%d)=%f\n",n,sum);
}
(1)枚举法
int main(){
int a,b,i,ret;
scanf("%d %d",&a,&b);
for (i = 1;i < a && i < b;i++){
if(a % i == 0 && b % i == 0){
ret = i;
}
}
printf("%d和%d的最大公约数是%d",a,b,ret);
return 0;
}
(2)辗转相除法
int a,b,t;
scanf("%d %d",&a,&b);
while (b != 0){
t = a % b;
a = b;
b = t;
}
printf("%d",a);
return 0;
int main(){
int x,i,isPre,m,n;
int ret = 0;
int count = 0;
scanf("%d %d",&m,&n);
for(x = 2; x < 200; x++){//这个循环判断素数
isPre = 1;
for(i = 2; i < x; i++){
if(x % i ==0){
isPre = 0;
break;
}
}
if(isPre == 1){//这个条件用于素数相加
count++;
if(count >= m && count <= n){
ret = ret + x;
}
}
}
printf("0到200之间第%d个素数到第%d个素数之和为%d",m,n,ret);
return 0;
}
int main(){
int x,i,t;
int count = 0;
int mask = 1;
scanf("%d",&x);
if (x < 0){//处理x为负数的情况
printf("fu ");
x = -x;
}
t = x;
while(t > 9){//确定输入数x的位数,确定mask的值
t /= 10;
mask *= 10;
}
do{
i = x / mask;
x %= mask;
mask /= 10;
switch(i){
case 0:
printf("ling");
break;
case 1:
printf("yi");
break;
case 2:
printf("er");
break;
case 3:
printf("san");
break;
case 4:
printf("si");
break;
case 5:
printf("wu");
break;
case 6:
printf("liu");
break;
case 7:
printf("qi");
break;
case 8:
printf("ba");
break;
case 9:
printf("jiu");
break;
}
if(mask > 0){
printf(" ");
}
}while( mask > 0);
return 0;
}
程序需要一步一步写,一个功能一个功能去实现,这个小程序的思路是:先写整数数字正序输出(先确定x的位数,然后利用一个位数变化的mask来整除x,从左到友得到x的每一位上的数字),然后写念每一个数字的代码(用switch来一一对应),然后加上x为负数的情况。
(1)定义:函数是一段代码,接受零个或多个个参数,做一件事情,返回零个或一个值。
int sum(int begin,int end)//返回整数的函数
void output()//不需返回的函数
(2)调用:函数名(依次写出参数);
(3)返回:
return:后面可以加变量(如a),可以加常量(如0),可以是一条语句(如 a+b).return表示函数的结束。函数里面可以有零个或者多个return。
函数有返回值,则必须使用带值得return,如果没有返回值则可以不用return。
void函数没有返回值,不需要return,void函数也不能进行返回赋值。
(4)函数声明:函数的头加上分号。声明里面可以不写参数的名称,但要表明参数的个数和类型 。
void sum(int begin,int end)//这一句放在main()函数前面
(5)参数传递:
不考虑形参和实参,仅仅考虑参数传值
(6)本地变量:
本地变量定义在块内(函数或者语句),程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。
外部定义的变量在里面仍然有效,块里面定义和外面同名的变量会掩盖外面的变量。
不能在一个块里面定义同名的变量。
本地变量不会被默认初始化,参数在进入函数的时候会经过初始化。
(7)其他细节
C语言不允许函数嵌套定义,可以在一个函数内部放其他函数的声明,但不能放函数的定义
main()其实也是一个函数,return 0;也有意义,表示main()这个函数正常运行。
int su(int x);
int main(){
int x;
scanf("%d",&x);
if(su(x)){
printf("%d",x);
}else{//获取因数并一个一个打印的代码
int i = 2;
printf("%d=",x);
while(i < x){
if(x % i == 0){
printf("%d*",i);
x /= i;
i = 1;
}
i++;
}
printf("%d",x);
}
return 0;
}
int su(int x){//判断素数的函数
int i;
int isPre = 1;
for(i = 2; i < x; i++){
if(x % i == 0){
isPre = 0;
}
break;
}
return isPre;
}
(1)数组是一种容器,其中所有的元素具有相同的数据类型;一旦创建数组,就不能改变数组的大小;数组的元素在内存中是连续排列的。
(2)有效的下标范围:编译器和运行环境都不会检查数组下标是否越界。一旦运行程序出现"segmentation fault",则很有可能是数组越界引起的。
int main(){
const int number = 10;
int x;
int i;
int count[number];//定义数组
for(i = 0; i < number; i++){//初始化数组
count[i] = 0;
}
scanf("%d",&x);
while(x != -1){
if(x >= 0 && x <=9){//数组参与计算
count[x]++;
}
scanf("%d",&x);
}
for(i = 0; i < number; i++){
printf("%d:%d\n",i,count[i]);//遍历出数组
}
}
(1)数组的集成初始化
int a[] = {2,3,4,5,56,6,7,8,}
(2)集成初始化时的定位
int a[10] = {[0] = 2,[2] = 3,6,};//c99 only
适合数组中数字稀疏。
(3)数组的大小
sizeof字符串能给出整个数组所占据的内容的大小,单位是字节
sizeof(a)/sizeof(a[0])//结果是数组中单位的个数
(4)数组的赋值
数组变量本身不能被赋值,如果要把一个数组中的值赋给另一个数组,只能使用遍历
(5)遍历数组
一般使用for循环,让循环变量i从0到<数组长度,这样循环体内最大的正好是数组最大的有效下标
(6)定义函数的时候,当数组作为函数参数时,必须再使用一个参数来传入数组的大小。
int a[][5]{
{0,1,2,3,4},//表示a[0][i]
{2,3,4,5,6},//表示a[i][i]
};
列数是必须给出的,行数可以由编译器来数.如果省略就表示补零。
(1)二维数组的初始化与输出
int x,t,m;
int i;
int j;
scanf("%d",&t);
x = t;
int a[t][t];
for(i = 0; i < x; i++){//采用遍历进行赋值
for(j = 0; j < x; j++){
scanf("%d",&m);
a[i][j]= m;
}
}
for(i = 0; i < x; i++){//采用遍历进行输出
for(j = 0; j < x; j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
(1)sizeof:
获得变量在内存中所占的大小(以字节为单位)
(2)scanf("%d",&x)中的&运算符:
获得变量的地址,它的操作数必须是变量,地址的大小是否与int相同取决于编译器。
printf("%p\n",&i)//输出一个变量的地址
(1)指针:
保存地址的变量。
int i;
int* p = &i//p是一个指针,指向了int i;p变量里保存了i的地址。
int *p,q;
int* p,q;//不管*号靠近int还是p,都指标是p是一个指针,q不是指针
(2)*运算符:
*运算符是一个单目运算符,用来访问指针的值所表示的地址上的变量。意味着在其他函数内部可以改变全局变量的值
int *p;
*p = 26;//通过这样一个赋值就改变了p指针所表示的地址上的变量的值。
int minmax(int a[],int len)
数组作为函数参数时,传入函数的实际上只是数组的指针,而不是数组的值。所以在函数内部用sizeof
得不到数组的正确大小。
数组变量是特殊的指针。数组变量是const的指针,不能被改变
char是一种整数,也是一种特殊的类型:字符。在printf和scanf里用%c来输入输出字符。
char c = '1';//用单引号表示字符字面量
char d = 1;//char也可以用来表示整数
\b 回退一个;\n 换行;\t 到一行中的下一个固定位置;\r 回车
(1)字符串:
以0(整数0)结尾的一串字符。
0标志字符串的结束,但不是字符串的一部分。
字符串以数组的形式存在,以数组或者指针的形式访问。
#include <string.h>//字符串函数在这个函数库里面
(2)字符串常量:
"Hello"
会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
(3)输入输出字符串:
char word[8];
scanf("%s",word);
//输入一个单词,到空格、tab或回车为止。但scanf是不安全的,因为不知道要读入内容的长度
printf("%s\n",word);
安全的输入:
char string[8];
scanf("%7s",string);
//7表示最多允许读入字符的数量
(4)空字符串:
char buffer[100]="";//这是一个空字符串,buffer[0]=='\0'
char buffer[] = "";//这个数组的长度只有1;
(5)字符串函数:
strlen(const char *s)//表示字符串的长度
strcmp(const char *s1,const char *s2)//返回0时,表示两个字符串相等;等s1和s2不相等时,返回s1与s2的差值(数)
strcpy()//把第二个字符串拷到第一个字符串中,不安全,可能溢出
strcat()//把第一个字符串拷到第二个字符串,并与第二个字符串拼接,不安全,可能溢出