*持续更新
习题来源谭浩强的《C程序设计》
两星期入门C,两星期数据结构,后续刷算法,特此记录。
#include
int main()
{
double i,j,sum=0,s;
for(i=1;i<=20;i++)
{
for(s=1,j=1;j<=i;j++)
{
s = s*j;
}
sum = sum + s;
}
printf("sum=%22.15e\n",sum);
return 0;
}
辗转相除法(欧几里得算法)
代码:
#include
//求最小公倍数和最大公约数
int main()
{
int num_1,num_2,result,product;
printf("enter two number:");
scanf("%d%d",&num_1,&num_2);
product = num_1*num_2;
result = num_1%num_2;
while(result!=0)
{
num_1 = num_2;
num_2 = result;
result = num_1%num_2;
}
printf("最大公约数:%d\n最小公倍数:%d\n",num_2,product/num_2);
return 0;
}
代码:
#include
int main()
{
char c;
int letter=0,number=0,space=0,character=0; //c:输入字符,letter:字母,space:空格,character:其他字符
c = getchar();
while(c != '\n') //直至输入换行停止
{
if((c>=65&&c<=90)||(c>=97&&c<=122)) letter +=1;
else if(c>=48&&c<=57) number +=1;
else if(c==32) space +=1;
else character +=1;
c = getchar();
}
printf("%d个字母\n%d个数字\n%d个空格\n%d个其他字符\n",letter,number,space,character);
return 0;
}
#include
//输入一行字符,统计字母、数字、空格和其他字符的个数
int main()
{
char c;
int letter=0,number=0,space=0,character=0; //c:输入字符,letter:字母,space:空格,character:其他字符
while((c=getchar())!= '\n') //直至输入换行停止
{
if((c>=65&&c<=90)||(c>=97&&c<=122)) letter +=1;
else if(c>=48&&c<=57) number +=1;
else if(c==32) space +=1;
else character +=1;
}
printf("%d个字母\n%d个数字\n%d个空格\n%d个其他字符\n",letter,number,space,character);
return 0;
}
水仙花数:一个三位数,每位数的立方和等于该数,称之水仙花数。
代码:
#include
/*4、求水仙花数
水仙花数:一个三位数,每位数的立方和等于该数,称之水仙花数。
*/
int main()
{
int i,hundred,ten,indiv;
for(i=100;i<1000;i++)
{
hundred = i/100;
ten = (i-hundred*100)/10;
indiv = (i-hundred*100-ten*10);
if(hundred*hundred*hundred+ten*ten*ten+indiv*indiv*indiv == i) printf("%d\n",i);
}
return 0;
}
#include
/*4、求水仙花数
水仙花数:一个三位数,每位数的立方和等于该数,称之水仙花数。
*/
int main()
{
int i,hundred,ten,indiv;
for(i=100;i<1000;i++)
{
hundred = i/100;
ten = i/10-hundred*10;
indiv = i%10;
if(hundred*hundred*hundred+ten*ten*ten+indiv*indiv*indiv == i) printf("%d\n",i);
}
return 0;
}
代码:
#include
int main()
{
int i,f1=1,f2=1,f3;
printf("%d\n%d\n",f1,f2);
for(i=0;i<10;i++)
{
f3 = f1+f2;
f1 = f2;
f2 = f3;
printf("%d\n",f3);
}
return 0;
}
#include
int main()
{
int f1=1,f2=2,i;
for(i=1;i<=20;i++)
{
printf("%12d %12d\t",f1,f2);
if(i%2==0) printf("\n");
f1 = f1 + f2;
f2 = f1 + f2;
}
return 0;
}
计算出来并保存到数组。
代码:
#include
int main()
{
int i;
int a[20]={1,1};
for(i=2;i<20;i++)
{
a[i]=a[i-2]+a[i-1];
}
for(i=0;i<20;i++)
{
if(i%5==0) printf("\n");
printf("%12d",a[i]);
}
printf("\n");
return 0;
}
自定义10个数。
代码:
#include
int main()
{
int i,j,t;
int a[10];
printf("enter 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
t = a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
printf("the sorted number:");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
改进:
#include
int main()
{
int i,j,t;
int a[10];
printf("enter 10 numbes:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;}
printf("the sorted number:");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
代码:
#include
int main()
{
int nums[10],i,j,min,tmp;
printf("请输入十个数:");
for(i=0;i<10;i++)
{
scanf("%d",&nums[i]);
}
printf("\n当前输入数组:");
for(i=0;i<10;i++)
printf("%3d",nums[i]);
//嵌套循环比较
for(i=0;i<10;i++)
{
min = i;
for(j=i;j<10;j++)
{
if(nums[min]>nums[j])
{
tmp = nums[j];
nums[j] = nums[min];
nums[min] = tmp;
}
}
}
printf("\n排序后的数组:");
//output sorted array
for(i=0;i<10;i++)
printf("%3d",nums[i]);
printf("\n");
return 0;
}
代码:
#include
#include
int main()
{
char string[30];
int i,num=0,word=0;
char c;
fgets(string,30,stdin);
for(i=0;(c=string[i])!='\0';i++)
{
if(c==' ') word=0;
else if(word==0)
{
word=1;
num++;
}
}
printf("There are %d words in this line.\n",num);
return 0;
}
结果:
注:
gcc编译器不再支持gets()和puts()函数的使用,官方手册推荐使用fgets()和fputs()两个函数代替。
fgets(name of array, lenth of array, stdin) //stdin:standard input
fgets(name of array, stdou) //stdou: standard output
虽然linux的gcc不支持,但windows的dev c 却可以通过编译。
使用strcmp()比较第一对不同字符大小进而找出其最大者。
代码:
#include
#include
int main()
{
char str[3][20];
char string [20];
int i;
for(i=0;i<3;i++)
{
printf("输入第%d个字符串:",i+1);
fgets(str[i],20,stdin);
}
if(strcmp(str[0],str[1])>0) strcpy(string,str[0]);
else strcpy(string,str[1]);
if(strcmp(str[2],string)>0) strcpy(string,str[2]);
printf("最大的是:%s",string);
return 0;
}
改进:
#include
#include
int main()
{
char str[3][20];
char string[20];
printf("请输入三个字符串:");
scanf("%s%s%s",str[0],str[1],str[2]);
if(strcmp(str[0],str[1])>0) strcpy(string,str[0]);
else strcpy(string,str[1]);
if(strcmp(str[2],string)>0) strcpy(string,str[2]);
printf("其中最大的是:%s\n",string);
return 0;
}
但条对角线之和。
代码:
#include
int main()
{
int nums[3][3];
int i,j,sum=0;
printf("输入3x3矩阵数值:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&nums[i][j]);
}
}
for(i=0;i<3;i++)
{
sum+=nums[i][i];
}
printf("总和:%d\n",sum);
return 0;
}
改进:
1-扩增到nxn矩阵
2-两条对角线之和
代码:
#include
int main()
{
int i,j,tmp,n,sum,total;
printf("请输入nxn的矩阵的n= ");
scanf("%d",&n);
int nums[n][n];
//嵌套循环输入数值
for(i=0;i<n;i++)
{
printf("请输入第%d行的%d个数:",i+1,n);
j=0;
while(j<n)
{
scanf("%d",&nums[i][j]);
j++;
}
}
//嵌套循环输出矩阵
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",nums[i][j]);
}
printf("\n");
}
//双对角线求和
for(i=0;i<n;i++)
{
sum = nums[i][i]+nums[i][n-i-1];
total+=sum;
}
printf("对角线总和:%d\n",total);
return 0;
}
筛选法输出 1-100的素数。
代码:
#include
#include
int main()
{
int nums[100],n,i,j;
//初始化数组
for(i=0;i<100;i++)
nums[i]=i;
//求余数筛选
for(i=2;i<sqrt(100);i++)
{
for(j=i+1;j<=100;j++)
{
if(nums[i]!=0 && nums[j]!=0)
{
if((nums[j]%nums[i])==0) nums[j]=0;
}
}
}
//输出素数
for(i=2,n=0;i<100;i++)
{
if(nums[i]!=0)
{
printf("%3d",nums[i]);
n++;
}
if((n%10)==0) printf("\n");
}
printf("\n");
return 0;
}
一个已经排序的数组,要求输入一个数字后按已有的顺序规律插入数组。
#include
int main()
{
int nums[10]={1,5,20,34,51,64,74,78,80};
int i,j,num,tmp01,tmp02;
printf("待处理数组:");
for(i=0;i<9;i++) printf("%3d",nums[i]);
printf("\n");
printf("输入待插进数值:");
scanf("%d",&num);
if(num>nums[8]) nums[9]=num;
else
for(i=0;i<9;i++)
{
if(nums[i]>num)
{
tmp01 = nums[i];
nums[i] = num;
for(j=i+1;j<10;j++)
{
tmp02 = nums[j];
nums[j] = tmp01;
tmp01 = tmp02;
}
break;
}
}
printf("处理后数组:");
for(i=0;i<10;i++) printf("%3d",nums[i]);
printf("\n");
return 0;
}
将一个数组中的数值逆序中重新存放。
代码:
#include
int main()
{
int nums[10];
int i,j,min,tmp;
printf("enter ten numbers:");
for(i=0;i<10;i++) scanf("%3d",&nums[i]);
//起泡排序
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(nums[j]>nums[j+1])
{
tmp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = tmp;
}
}
}
//对比排序
printf("array order:");
for(i=0;i<10;i++) printf("%3d",nums[i]);
printf("\nbut,saving the array with descending order.as folows:\n");
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(nums[j]>nums[i])
{
tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
}
for(i=0;i<10;i++) printf("%3d",nums[i]);
printf("\n");
return 0;
}
打印前十行杨辉三角排列。
代码:
#include
#define N 10
int main()
{
int nums[N][N],i,j;
for(i=0;i<N;i++)
{
nums[i][0] = 1;
nums[i][i] = 1;
}
for(i=2;i<N;i++)
{
for(j=1;j<i;j++)
nums[i][j] = nums[i-1][j]+nums[i-1][j-1];
}
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
printf("%5d",nums[i][j]);
printf("\n");
}
printf("\n");
return 0;
}
有一个整型数组a,有10个元素,p是指向数组元素的指针变量。
下标法:a[i]形式;
指针法:*(a+i)形式
1、下标法:
#include
int main()
{
int a[10],i;
printf("please inter ten numbers:");
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++) printf("%d ",a[i]);
printf("\n");
return 0;
}
2、数组名计算数组元素地址
#include
int main()
{
int a[10],i;
printf("please inter ten numbers:");
for(i=0;i<10;i++) scanf("%d",a+i);
for(i=0;i<10;i++) printf("%d ",*(a+i));
printf("\n");
return 0;
}
3、指针变量指向数组元素
#include
int main()
{
int a[10],*p,*i;
printf("please inter ten numbers:");
for(i=a;i<(a+10);i++) scanf("%d",i);
for(p=a;p<(a+10);p++) printf("%d ",*p);
printf("\n");
return 0;
}
将数组a中n个整数按相反顺序存放
1、把数组作为函数形式参数传递给函数进行处理
#include
int main()
{
void inv(int arr[],int n);
int i,a[10]={3,7,5,6,4,8,9,1,2};
printf("The original array:");
for(i=0;i<10;i++) printf("%d ",a[i]);
inv(a,5);
printf("\nThe array has been inverted:");
for(i=0;i<10;i++) printf("%d ",a[i]);
printf("\n");
return 0;
}
void inv(int arr[],int n)
{
int temp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++)
{
j = n-1-i;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
2、把指针变量作为形参
#include
int main()
{
void inv(int *x,int n);
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array:");
for(i=0;i<10;i++) printf("%d ",a[i]);
inv(a,10);
printf("\nThe array has been inverted:");
for(i=0;i<10;i++) printf("%d ",a[i]);
printf("\n");
return 0;
}
void inv(int *x,int n)
{
int temp,m=(n-1)/2,*i,*p,*j;
i=x, j=x+n-1, p=x+m;
for(;i<=p;i++,j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
3、实参和形参都用指针变量
#include
int main()
{
void inv(int *x,int n);
int i,arr[10],*p=arr; //值传递,arr首元素地址传递给指针变量的值p
printf("Please inter the original array:");
for(i=0;i<10;i++,p++) scanf("%d",p);
p=arr; //再次指定指针变量的值
inv(p,10);
printf("\nThe array has been inverted:");
for(i=0;i<10;i++,p++) printf("%d ",*p);
printf("\n");
return 0;
}
void inv(int *x,int n)
{
int temp,m=(n-1)/2,*i,*j,*p;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
用指针方法对10个整数按由大到小顺序排序,用选择法排序。
代码:
#include
int main()
{
void sort(int arr[],int n);
int i,a[10],*p=a;
printf("Please inter ten numbers for original array:");
for(i=0;i<10;i++,p++) scanf("%d",p);
printf("\nOutput sorted array:");
p=a;
sort(p,10);
for(i=0;i<10;i++,p++) printf("%d ",*p);
printf("\n");
return 0;
}
void sort(int arr[],int n)
{
int i,j,min,temp;
for(i=0;i<n-1;i++)
{
min = i;
for(j=i+1;j<n;j++)
{
if(arr[min]<arr[j])
{
temp = arr[j];
arr[j] = arr[min];
arr[min] = temp;
}
}
}
}
一个存放成绩的二维数组,查找一门以上的课程不及格的学生,输出他们的全部课程成绩。
代码:
#include
int main()
{
void search(int (*p)[4],int n);
int score[][4]={{12,85,45,87},{85,61,74,81},{91,64,71,52}};
search(score,3);
return 0;
}
void search(int (*p)[4],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<4;j++)
{
if(*(*(p+i)+j)<60)
{
printf("NO.%d student's scores are:",i+1);
for(j=0;j<4;j++)
printf("%d ",*(*(p+i)+j));
printf("\n");
break;
}
}
}
}
#include
#define N 10000
int main()
{
float integral(float upper,float lower,float(*p)(float));
float func(float x);
float upper,lower,result;
printf("please enter upper and lower:");
scanf("%f %f",&upper,&lower);
result = integral(upper,lower,func);
printf("result=%f\n",result);
return 0;
}
float integral(float upper,float lower,float(*p)(float)) //通用函数,形参:上下限和积分函数——函数指针变量
{
int i;
float s=0,x=lower;
for(i=1;i<=N;i++)
{
x = x+(upper-lower)/N;
s = s+(*p)(x)*((upper-lower)/N);
}
return s;
}
float func(float x) //积分函数
{
return (2*x+3);
}
结果:
积分函数2x+3,若使用牛顿莱布尼兹公式算,结果等于6,矩形法求和的结果无限接近6。
学生成绩建立一个二维数组存放数据
代码:
#include
int main()
{
float *search(float (*pointer)[4]);
float score[][4]={{60,70,80,90},{45,71,86,94},{71,64,52,61}};
int i,j;
float *p;
for(i=0;i<3;i++)
{
p=search(score+i);
if(p == *(score+i)) //p的值等于&score[i][0]表示存在不及格分数
{
for(j=0;j<4;j++) //如果在前面直接定义i和j等于0,然后for(;j<4;j++)会出现循环一次后j的值就是3,不再符合循环条件
printf("%5.2f ",*(p+j));
printf("\n");
}
}
return 0;
}
float *search(float (*pointer)[4]) //形参指向一维数组
{
int i=0;
float *pt;
pt = NULL; //先给float型指针变量赋值 NULL => 0
for(;i<4;i++)
{
if(*(*pointer+i)<60)
{
pt = *pointer; //存在低于60的,将&score[i][0] 赋给pt的值
break; //检查到一个不及格就break循环
}
}
return pt;
}
代码:
#include
int main()
{
void sort(char *name[],int n);
void print(char *name[],int n);
char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"}; //name数组的每个元素是字符串首元素地址
sort(name,5);
print(name,5);
return 0;
}
void sort(char *name[],int n)
{
char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++) //name[k]表示第k个字符串首元素地址,strcmp()函数可直接传入字符串首元素地址,与数值型数据的比较不一样
if(strcmp(name[k],name[j])>0) k=j; //每一次循环得到最小值序号k
if(k!=i) //数组顺序需要交换
{
temp = name[i];
name[i] = name[k]; //较小值的字符串地址提到前面交换
name[k] = temp;
}
}
}
void print(char *name[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",name[i]);
}
定义一个整型数组,另外定义一个指向整型数据指针数组,利用其进行排序。过程注意与上一题对字符串进行排序作比较。
#include
int main()
{
void sort(int *num[],int n);
int a[5] = {8,5,2,1,6};
int *num[] = {&a[0],&a[1],&a[2],&a[3],&a[4]};
int i,**p;
p = num; //int型指针数组地址 => p
printf("待排序数组:");
for(i=0;i<5;i++)
printf("%d ",**(p+i)); //输出数组元素,p+i 指向指针的指针 *(p+i) 指向指针的值(整型数组地址) =&a[i] **(p+i) = a[i]
printf("\n");
sort(num,5); //排序开始
printf("已排序数组:");
p = num; //重新让指针指向指针数组有元素地址
for(i=0;i<5;i++)
printf("%d ",**(p+i));
printf("\n");
return 0;
}
//选择法排序
void sort(int *num[],int n)
{
int i,j,k;
int *temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(*num[k]>*num[j]) k=j; //比较要用到数值进行比较,而num[k]只是整型数组的第k个元素的指针(地址)
if(k!=i)
{
temp = num[i];
num[i] = num[k];
num[k] = temp;
}
}
}
#include
#define N 3
struct Student
{
int num;
char name[20];
float score[3];
float aver;
};
int main()
{
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu);
struct Student stu[N],*p=stu; //*p等价=>*p;p=stu; 建村,立村长;
input(p); //传递指针,而不是指针指向的数据(*p)
print(max(p));
return 0;
}
void input(struct Student stu[])
{
int i;
for(i=0;i<N;i++)
{
scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].aver = (stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
}
struct Student max(struct Student stu[]) //被调用时形参数组stu代表传递数组或指针值所指向的首元素地址
{
int i,m=0;
for(i=0;i<N;i++)
if(stu[i].aver>stu[m].aver) m=i;
return stu[m];
}
void print(struct Student stu) //形式参数传递的是结构体的成员信息数据而不是地址
{
printf("\nNo.:%d\nname:%s\nscores:%5.1f%5.1f%5.1f\naverage:%5.1f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.aver);
}
代码:
#include
struct Student
{
int num;
float score;
struct Student *next;
};
int main()
{
struct Student a,b,c,*p,*head;
a.num=10101;a.score=85.5;
b.num=10102;b.score=45;
c.num=10103;c.score=68;
head=&a;
a.next=&b;
b.next=&c;
c.next=NULL;
p=head;
do
{
printf("%d %5.1f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
return 0;
}
代码:
#include
#include
#define LEN sizeof(struct Student)
struct Student
{
long num;
float score;
struct Student * next;
};
int n; //全局变量n 在此程序的目的是为了能清楚知道该链表有多少条记录
struct Student * creat()
{
struct Student *head; //定义表头指针
struct Student *p1,*p2; //p1指向新开辟节点 p2指向表尾
n = 0; //设置记录条数为0
head = NULL;
p1=p2=(struct Student *)malloc(LEN); //malloc开辟的内存单元类型为void,进行类型强制转换
printf("Please enter student's data: ");
scanf("%ld %f",&p1->num,&p1->score);
while(p1->num != 0) //学号不为0进行循环
{
n = n + 1;
if(n == 1) head = p1; //记录条数为0就给p1的地址为表头指针
else p2->next = p1; //否则指向上一个元素与之“连接”
p2 = p1; //p2指向表尾
printf("Please enter student's data: ");
p1 = (struct Student *)malloc(LEN); //再次开辟新的内存单元
scanf("%ld %f",&p1->num,&p1->score); //为新的内存单元输入数据
}
p2->next = NULL; //num为0 则表尾的next指针设置为NULL
return (head);
}
void print(struct Student * head)
{
struct Student * p; //接受参数传递过来的链表地址
p = head; //地址数值传递
printf("\nNow,These %d records are:\n",n); //输出全局变量n所记录的条数
if(head != NULL) //判断此链表是不是空链表
do
{
printf("%ld%5.1f\n",p->num,p->score);
p = p->next; //指向链表的下一个元素
}while(p != NULL); //循环条件为下一个链表地址不空
}
int main()
{
struct Student * creat(); //creat函数在main函数之前可以不声明
struct Student * pt;
pt = creat(); //pt接受返回的链表头指针
//printf("%ld%5.1f\n",pt->num,pt->score);
print(pt); //输出链表数据内容
return 0;
}
对字符串字母进行排序,并写入文件
#include
#include
#include
int main()
{
FILE *fp;
char str[3][10],temp[10];
int i,j,k,n=3; //n表示输入字符串数量
//输入数据
printf("Enter English string:\n");
for(i=0;i<n;i++)
gets(str[i]);
//比较法排序
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(str[k],str[j])>0) k=j;
if(k!=i)
{
strcpy(temp,str[i]);
strcpy(str[i],str[k]);
strcpy(str[k],temp);
}
}
//打开文件
if((fp = fopen("string.dat","w")) == NULL)
{
printf("can't open file!\n'");
exit(0);
}
//输入数据进文件
printf("\nThe new squeue:\n");
for(i=0;i<n;i++)
{
fputs(str[i],fp);
fputs("\n",fp);
printf("%s\n",str[i]);
}
return 0;
}
#include
#include
#include
int main()
{
char str[3][10];
FILE *fp;
int i=0;
if((fp = fopen("string.dat","r"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
while(fgets(str[i],10,fp) != NULL)
{
printf("%s",str[i]);
i++;
}
fclose(fp);
return 0;
}
#include
#include
#define SIZE 10
//定义两个结构体数组,一个用作输入,一个用作输出
struct Student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud_in[SIZE],stud_out[SIZE];
//向文件写入数据
void save()
{
FILE *fp;
if((fp=fopen("stud.dat","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(int i=0;i<SIZE;i++)
if(fwrite(&stud_in[i],sizeof(struct Student_type),1,fp) != 1) //逐个数据项输入,输入地址 &stud_in[i] 并设置判断是否正常写入数据
printf("file write erroe!\n");
fclose(fp);
}
//从文件输入数据到内存
void show()
{
FILE *fp;
if((fp=fopen("stud.dat","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(int i=0;i<SIZE;i++) //逐个数据项输出,先写入到stud_out结构体数组里,再从中输出到终端
{
if(fread(&stud_out[i],sizeof(struct Student_type),1,fp) !=1)
printf("file read error!\n");
else printf("%-7s %4d %4d %-15s\n",stud_out[i].name,stud_out[i].num,stud_out[i].age,stud_out[i].addr);
}
fclose(fp);
}
int main()
{
int i;
printf("Please enter data of student:\n");
for(i=0;i<SIZE;i++)
scanf("%s%d%d%s",stud_in[i].name,&stud_in[i].num,&stud_in[i].age,stud_in[i].addr); //从键盘输入数据
save();
printf("data of student:\n");
show();
return 0;
}
#include
#include
#define SIZE 10
struct Student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
int main()
{
FILE *fp;
if((fp = fopen("stud.dat","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(int i=0;i<SIZE;i+=2)
{
fseek(fp,i*sizeof(struct Student_type),0); //移动读写位置坐标
fread(&stud[i],sizeof(struct Student_type),1,fp);
printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(fp);
return 0;
}