C_总结2
1, Const的用法
Const修饰变量,标志着这个变量是不可修改的。
如:int const i= 2; 或者const int i=2;
Const 修饰指针变量。(有两种形式)
如:int* const p1=&i; 和 const int* p2= &i;
下面是对两种形式的分析:
const int x=2;
const int y=3;
int z=3;
const int*pc=&x;
int* constcp=&z;
int* pp=&z;
x=y; //不可以,因为使用const修饰的变量值是不可改变的。
pc =&z; //可以,指向常量的指针,可以改变其value的值。
*pc=10; //不可以,指向常量的指针,防止改变其指向的变量的值。
*pc=y; //不可以,指向常量的指针,防止改变其指向的变量的值。
*pc=5; //不可以,指向常量的指针,防止改变其指向的变量的值。
pc=pp; //可以,指向常量的指针,可以改变其value的值。
z=5;//可以,必须的可以。
z=x; //可以,必须的可以
*cp=x; // 可以,常指针可以修改其对应的变量的值。
cp=&x; //不可以,常指针不可以改变其value值
pp=&x; //不可以 在不同的编译器下,有不同的结果
pp=pc;//不可以 如果可以的话,pp 就有了修改变量值的功能了,和定义有冲突
pp=cp; //可以
2,练习:
// test_day05.cpp: Defines the entry point for the console application.
//
#include"stdafx.h"
bool flag=true;
double v(doubler,double h){
if(r!=0&h!=0){
return 3.14159*r*2*h;
}
return NULL;
}
void jisuan(intx,int y,int z){
printf("你输入的三个数的和是:%d\n",x+y+z);
printf("你输入的三个数的平均值是:%f\n",(float)(x+y+z)/3);
}
int main(int argc,char* argv[])
{
/** //exercise 4
enum WEEKDAY{
Sunday,
Monday,
Tuesday,
Wednsday,
Thursday,
Friday,
Saturday
};
enum WEEKDAY day;
day=Tuesday;
switch(day){
case Sunday:
printf("Today is Sunday\n");
break;
case Monday:
printf("Today is Monday\n");
break;
case Tuesday:
printf("Today is Tuesday\n");
break;
case Wednsday:
printf("Today is Wednsday\n");
break;
case Thursday:
printf("Today is Thursday\n");
break;
case Friday:
printf("Today is Friday\n");
break;
case Saturday:
printf("Today is Saturday\n");
break;
default :
printf("Your input iserror!!!");
}
**/
/** //exercise 5
int a,b;
scanf("%d\n%d",&a,&b);
if(a>b){
printf("您输入的最小值是:%d\n",b);
}else{
printf("您输入的最小值是:%d\n",a);
}
**/
/** //Exercise 6
while(flag){
double r;
double h;
printf("请输入圆柱的半径和高!\n");
scanf("%lf,%lf",&r,&h);
if(r==0||h==0){
flag=false;
continue;
}
double V=v(r,h);
printf("%lf\n",V);
}
**/
//Exercise 7
while(flag){
int x,y,z;
printf("请输入三个整数:\n\n");
scanf("%d,%d,%d",&x,&y,&z);
if(x==-1){
flag=false;
continue;
}
jisuan(x,y,z);
}
return 0;
}
3,
Functions : Parameters(参数)
Parameters can bepassed in two ways: 向函数传递参数的三种方式。
1. 传值
2. 传地址(指针)
3. 传引用(c++的内容)
4, 函数重载.
两个函数名字一样,参数不一样(参数个数不同、参数类型不同),成为函数重载。
5,指针传递
void f(int *x) { x = x+1;}
intmain (void)
{
int a[]={1,2}, *pa=a;
f(pa);
printf(“%d”,*pa); /* Again prints 1. Value of ptr passed. */
/* The ptr value is increased - byvalue */
return 0;
}
6,数组作为参数传递
定义:int func1 (int array[]);
int func1 (int *array);
7. void * malloc(size_t size);向堆内存中申请空间。
8,释放资源:
void free(void *ptr);
9,指向函数的指针
Example:
#include <stdio.h>
int (*fpointer)(int, int); /* Define a pointer to a function */
int add(int, int); /* Define a few functions. */
int sub(int, int);
int main()
{
fpointer = add; /*Put the address of 'add' in 'fpointer' */
printf("%d \n", fpointer(4, 5)); /* Execute 'add' and print results */
fpointer = sub; /* Repeatfor 'sub' */
printf("%d\n", fpointer(6, 2));
return 0;
}
int add(int a, int b)
{
return(a + b);
}
int sub(int a, int b)
{
return(a - b);
}
10,Void指针
For example:
int func(void*Ptr);
int main()
{
char *Str = "abc";
func(Str);
return 0;
}
int func(void *Ptr)
{
printf("%s\n", Ptr);
}
11,String
char str[11] = {'G', 'o', 'o', 'd', ' ', 'D','a', 'y', '!', '\0', ‘e’ };
char str[11] ="Good Day!";
如果打印第一个字符数组,只会打印\0前面的字符,
如果打印第二个字符数组长度的话,长度为:九个字节。(包含\0).
12, int strlen(constchar *s);
char*pstr="Hello";
int i =strlen(pstr);
13, char *strcpy(char*to, const char *from);
For example:
#include <string.h>
#include <stdio.h>
void main( void )
{
char string[80];
strcpy( string, "Hello world from " );
strcat( string, "strcpy " );
strcat( string, "and " );
strcat( string, "strcat!" );
printf( "String = %s\n", string );
}
14, int strcmp(constchar *str1,const char*str2);
15,练习;
//test_day06rr.cpp : Defines the entry point for the console application.
//
#include"stdafx.h"
void exercise8();
double exercise9(double x);
void max(int x,inty);
void min(int x,inty);
int jiecheng(inti);
int main(int argc,char* argv[])
{
//exercise8();
/**
//exercise9 用户自定义函数--求数的平方
double d;
printf("用户请输入一个数:\n");
scanf("%lf",&d);
printf("您输入值的平方是:%lf\n",exercise9(d));
**/
/**
// Exercise 10
// 编写两个函数:max和min,分别计算两个数字的最大值和最小值。然后再在main函数中,读入两个数字,分别调用max和min进行计算。
int f,g;
printf("用户请输入两个数,以逗号连接:\n");
scanf("%d,%d",&f,&g);
max(f,g);
min(f,g);
**/
/**
//Exercise 11
//定义一个函数打印1到5的阶乘
int i;
printf("用户请输入一个数:\n");
scanf("%d",&i);
printf("您输入的%d的阶乘是%d\n",i,jiecheng(i));
**/
/**
//Exercise 13
//Write a programthat uses pointers to set each element of an array to zero.
int shuzhu[4][4];
int* s=&shuzhu[0][0];
for(int i=0;i<16;i++){
*s=0;
if(i%4==0)
printf("\n");
printf("%d",*s);
s++;
}
printf("\n");
**/
/**
Exercise 12
给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
1234 4321
87965 56978
**/
long int num;
int a,b,c,d,e,x,y;
printf("请输入(0-99999)
if (num>9999)x=5;
elseif(num>999)x=4;
elseif(num>99)x=3;
elseif(num>9)x=2;
else x=1;
printf("它是一个%d位数\n",x);
printf("分别是:"); :");
scanf("%ld",&num);
a=num/10000;
b=num/1000%10;
c=num/100%10;
d=num/10%10;
e=num%10;
switch(x)
{
case1:printf("%d\n",e);
printf("逆序输出为:%d\n",e);break;
case2:printf("%d,%d\n",d,e);
printf("逆序输出为:%d%d\n",e,d);break;
case3:printf("%d,%d,%d\n",c,d,e);
printf("逆序输出为:%d%d%d\n",e,d,c);break;
case4:printf("%d,%d,%d,%d\n",b,c,d,e);
printf("逆序输出为:%d%d%d%d\n",e,d,c,b);break;
case5:printf("%d,%d,%d,%d,%d\n",a,b,c,d,e);
printf("逆序输出为:%d%d%d%d%d\n",e,d,c,b,a);break;
}
return 0;
}
int jiecheng(inti){
int q=1;
for(int e=1;e<=i;e++){
q*=e;
}
return q;
}
void max(int x,inty){
if(x>y){
printf("您输入的数的最大值是:%d\n",x);
}else{
printf("您输入的数的最大值是:%d\n",y);
}
}
void min(int x,inty){
if(x<y){
printf("您输入的数的最小值是:%d\n",x);
}else{
printf("您输入的数的最小值是:%d\n",y);
}
}
double exercise9(double x){
return x*x;
}
void exercise8(){
//exercise8:本程序从键盘输入一个5*5整型数组赋值,找出其中的最小值并显示出来. 考虑更高效的算法。
int q[5][5]={0};
printf("请输入数据:\n");
for(int i=0;i<5;i++ ){
printf("请输入第%d组五个数据:\n",i);
for(intj=0;j<5;j++){
scanf("%d",&q[i][j]);
}
}
/**
int min=q[0][0];
for(int x=0;x<5;x++){
for(int y=0;y<5;y++){
if(min>q[x][y]){
min=q[x][y];
}
// printf("q[%d][%d]=%d\t",x,y,q[x][y]);
}
printf("\n");
}
printf("您输入的数据最小值是:%d\n",min);
**/
int min=q[0][0];
int*p=&q[0][0];
for(intw=0;w<25;w++){
if(w%5==0){
printf("\n");
}
printf("%d\t",*p);
if(min>*p){
min=*p;
}
p++;
}
printf("\n\n您输入的数据最小值是:%d\n",min);
}
#include"stdafx.h"
// int a[] = {0, 2, 4, 6, 8};
// int *p[5]={a, a+1, a+2, a+3, a+4};
//int ** pp = p;
void input(int*x){
printf("请输入三个数:\n");
scanf("%d,%d,%d",x,(x+1),(x+2));
}
void deal(int* x){
int y=0;
if(*x>*(x+1)){
y=*x;
*x=*(x+1);
*(x+1)=y;
}
if(*x>*(x+2)){
y=*x;
*x=*(x+2);
*(x+2)=y;
}
if(*(x+1)>*(x+2)){
y=*(x+1);
*(x+1)=*(x+2);
*(x+2)=y;
}
}
void print(int*x){
printf("经排序后是:");
for(int i=0;i<3;i++){
printf("%d ",*x);
x++;
}
printf("\n");
}