C语言学习——第一篇博客(五)

2016年10月7日15:11:16

指针,对于我来说是C语言最难的一块,需要单独拿出来讲解,先按照谭浩强的书看。知道大概。后面再整理。

“指针”和“指针变量”是不同的概念
可以说变量i的指针是2000,而不能说i的指针变量是2000
指针是一个地址,而指针变量是存放地址的变量

定义指针变量的一般形式为:
       类型  * 指针变量名;
如:int *pointer_1, *pointer_2;
int是为指针变量指定的“基类型”
基类型指定指针变量可指向的变量类型
如pointer_1可以指向整型变量,但不能指向浮点型变量

示例一:

对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。

#include <stdio.h>
int main()
{void swap(int *p1,int *p2);  
  int a,b;  int*pointer_1,*pointer_2; 
  printf("please enter a and b:");
  scanf(“%d,%d”,&a,&b); 
  pointer_1=&a; 
  pointer_2=&b;  
  if (a<b)  swap(pointer_1,pointer_2); 
  printf(“max=%d,min=%d\n”,a,b); 
  return 0;
 }    

void swap(int *p1,int *p2) 
{ int temp;
   temp=*p1;     
   *p1=*p2;
   *p2=temp;
}

p=a

*(*(p+i)+j) = a[i][j]

示例二:

有两个整数a和b,由用户输入1,2或3。如输入1,程序就给出a和b中大者,输入2,就给出a和b中小者,输入3,则求a与b之和。 

#include <stdio.h>
int main()
{void fun(int x,int y, int (*p)(int,int));
  int max(int,int);  int min(int,int); 
  int add(int,int);   int a=34,b=-21,n;
  printf("please choose 1,2 or 3:");                         
  scanf(“%d”,&n);
  if (n==1)    fun(a,b,max);
  else if (n==2) fun(a,b,min);
  else if (n==3) fun(a,b,add);
  return 0;
 }

int fun(int x,int y,int (*p)(int,int)) 
{ int resout; 
   resout=(*p)(x,y);
   printf(“%d\n”,resout);  

int max(int x,int y) 
{ int z;
   if(x>y)  z=x;
   else   z=y;
   printf("max=" );
   return(z);  
  }

int min(int x,int y) 
{ int z;
   if(x<y) z=x;
   else z=y;
   printf("min=");
   return(z); 

int add(int x,int y) 
{ int z;
   z=x+y;
   printf("sum=");
   return(z); 
}

2016年10月7日16:07:06 结构体

例9.4 有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。

#include <stdio.h>
struct Student
{ int num; char name[20]; float score;  };   
int main()
{ struct Student stu[5]={{10101,"Zhang",78  },
                  {10103,"Wang",98.5},
                  {10106,"Li",      86   },
                  {10108,“Ling”,  73.5},
                  {10110,“Fun”,  100  }  };  
   struct Student temp;   
   const int n = 5 ;  int i,j,k;printf("The order is:\n");
  for(i=0;i<n-1;i++)
  { k=i;
     for(j=i+1;j<n;j++)
       if(stu[j].score>stu[k].score)  k=j;
     temp=stu[k];
     stu[k]=stu[i];   stu[i]=temp;   
   }
   for(i=0;i<n;i++)
     printf("%6d %8s %6.2f\n",
        stu[i].num,stu[i].name,stu[i].score);
   printf("\n");
   return 0;
}

2016年10月7日16:24:42

文件处理

通常将fopen函数的返回值赋给一个指向文件的指针变量。如:
FILE *fp; 
fp=fopen(“a1”,”r”);
fp和文件a1相联系,fp指向了a1文件

(1) 用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,并存有数据,这样程序才能从文件中读数据。
不能用“r”方式打开一个并不存在的文件,否则出错。

(2) 用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。
如果原来不存在该文件,则在打开文件前新建立一个以指定的名字命名的文件。
如果原来已存在一个以该文件名命名的文件,则在打开文件前先将该文件删去,然后重新建立一个新文件。

(3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开
但此时应保证该文件已存在;否则将得到出错信息。
打开文件时,文件读写标记移到文件末尾

(4) 用r+、w+、a+方式打开的文件既可以用来输入数据,也可以用来输出数据。

(5) 如果打开失败,fopen函数将会带回一个出错信息。fopen函数将带回一个空指针值NULL
常用下面的方法打开一个文件:
  if ((fp=fopen(“file1”,’r″))==NULL)
 {printf(“cannot open this file\n”);
     exit(0);
 }
用r+方式时该文件应该已经存在。
用w+方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。
用a+方式打开的文件,原来的文件不被删去,文件读写位置标记移到文件末尾,可以添加,也可以读。


闭文件用fclose函数。fclose函数调用的一般形式为
fclose(文件指针); 
例如: 
fclose  (fp); 
如果不关闭文件将会丢失数据。


函数名 调用形式 功能 返回值
fgetc fgetc(fp) 从fp指向的文件读入一个字符 读成功,带回所读的字符,失败则返回文件结束标志EOF(即-1)
fputc fputc(ch,fp) 把字符ch写到文件指针变量fp所指向的文件中 写成功,返回值就是输出的字符;输出失败,则返回EOF(即-1)


函数名 调用形式 功能 返回值
fgets fgets(str,n,fp) 从fp指向的文件读入长度为(n-1)的字符串,存放到字符数组str中 读成功,返回地址str,失败则返回NULL)
fputs fputs(str,fp) str所指向的字符串写到文件指针变量fp所指向的文件中 写成功,返回0;否则返回非0值


fprintf(文件指针,格式字符串,输出表列);
fscanf (文件指针,格式字符串,输入表列);
如:
fprintf (fp,”%d,%6.2f”,i,f);
fscanf (fp,”%d,%f”,&i,&f);

示例四:

有一个磁盘文件,内有一些信息。要求第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。

#include<stdio.h>
int main()
{ FILE *fp1,*fp2;
   fp1=fopen(“file1.dat”,“r”);   
   fp2=fopen(“file2.dat”,“w”);   
   while(!feof(fp1))   
        putchar(getc(fp1));   
   putchar(10);  
   rewind(fp1);   
   while(!feof(fp1)) 
           putc(getc(fp1),fp2);   
   fclose(fp1);   fclose(fp2);
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值