在浙大刷题时遇到的问题
C语言
基础题(2020年12月25号)
问题1:精度高,不可直接算阶乘
题目
求cos(x)的近似值
下面是我第一次编写的代码
//求cos(x)的近似值出现:精度高,不可直接计算阶乘的问题
//以下为题目代码:
#include <stdio.h>
#include <math.h>
double funcos( double e, double x );
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
/* 你的代码将被嵌在这里 */
//此处为自己编写的函数代码
double funcos( double e, double x )
{
double s=1;
int i=2;int j=1;
while(1)
{
int t;
int s_1=1;
for(t=1;t<=i;t++)
s_1*=t;
s+=(j%2==0?pow(x,i)/s_1:(-pow(x,i)/s_1));
if((pow(x,i)/s_1>0?pow(x,i)/s_1:(-pow(x,i)/s_1))<e)
break;
i+=2;j++;
}
return s;
}
问题:精度高,不可计算阶乘。
解决问题:(有点弱智hhh)
int s_1=1;
//改为 double s_1=1;
在我以为是其他错误时:发现double只能计算有限个数量的阶乘,大的回越界,可以向字符串加减法一样编写乘法,期待我的后续哦嘿嘿。
问题2:传文件指针(地址)
——来自班导短学期
自己定义一个函数,但是怎么将文件地址传给函数,然后函数来使用呢?
如下代码:
#include <stdio.h>
#include <stdlib.h>
void ReadStudInfo(const char *fileName);
int main()
{
//……
ReadStudInfo("C:\\……\\……");
//……
return 0;
}
void ReadStudInfo(const char *fileName);
{
FILE *fp=fopen(fileName,"r");
//……
}
附加(文件)fprint和fscanf,fread和fwrite
——来自班导短学期
注意:
- fread和fwrite,fprintf和fscanf,是成对使用的。
- fwrite用的时候,是将数据转化为二进制的形式,然后输入到文件中(比如输入一个65,将65转化为二进制的形式1000001存储,然后使用记事本打开文件后显示为A,是因为记事本程序默认为存储的数据都是ASCII码,65当作ASCII码翻译下来就是字符A。
- 当输入数据过多时,%d和%s在文件里可能不太好区分,建议使用‘\n’来作分隔符(fprintf和fscanf都要加哦)避免多读产生错误。
问题3:在结构体中->
与.
的区别
在写C语言程序时,经常会遇到->
需要改成.
的问题,现在统一下:
1.在用结构体变量或者数组中的变量时,需要对结构体中的元素赋值时用
.
#include<stdio.h>
struct Data
{
int ID;
char Name[10];
};
typedef struct Data data;
int main()
{
data data1;//或者data[1]
scanf("%d%s",&data1.ID,data1.Name);//scanf("%d%s",&data1[0].ID,data1[0].Name);
printf("%d\n%s\n",data1.ID,data1.Name);//printf("%d\n%s\n",data1[0].ID,data1[0].Name);
return 0;
}
2.在用结构体指针时,用
->
#include<stdio.h>
struct Data
{
int ID;
char Name[10];
};
typedef struct Data data;
int main()
{
data *data1;
scanf("%d%s",&data1->ID,data1->Name);
printf("%d\n%s\n",data1->ID,data1->Name);
return 0;
}
问题4:结构题指针需初始化才能赋值
定义一个结构指针需要给它初始化后才能给它里面的元素赋值
typedef struct {
double real;
double i;
}complex;
complex* add(complex a, complex b)
{
/*********begin*********/
complex s;
complex *re=&s;//初始化
re->real=a.real+b.real;
re->i=a.i+b.i;
return re;
/*********end*********/
}
问题5:如何加随机数
- 利用 rand() 函数来实现包含在头文件stdlib.h中
- 在0~RAND_MAX之间产生一个随机数
- rand() 没有输入参数,直接用
- 需要m~n之间的随机数rand()%(n-m+1)+m
0<=rand()%(n-m+1)<=n-m
m<=rand()%(n-m+1)+m<=n
//每次生成的随机数一样
//但是每次循环后的数是不一样的哦
为了使用简便,看以下代码
#include<stdio.h>
#include<stdlib.h>
#define random1(x,y) (rand()%(y-x+1)+x)
int random2(int x,int y)
{
return (rand()%(y-x+1)+x);
}
int main()
{
printf("%d\n",random1(1,100));//1~100之间随机数
int i;
for(i=0;i<100;i++)
{
printf("%d\n",random2(1,100));
}
return 0;
}
如果需要每次都是随机的,可以稍作以下修改。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//这里
#define random1(x,y) (rand()%(y-x+1)+x)
int random2(int x,int y)
{
return (rand()%(y-x+1)+x);
}
int main()
{
srand( (unsigned)time( NULL ) );//这里
printf("%d\n",random1(100,200));//1~100之间随机数
int i;
for(i=0;i<100;i++)
{
printf("%d\n",random2(100,200));
}
return 0;
}
解决思路1:添加visit数组
例题:
这道题题目会给你创建一个退场人的顺序的数组,让我们编写函数,来计录每个人是第几个退场的。
思路:添加一个visit数组(和out的大小一样),然后定义visit中每个元素都为0;退场则为1
添加变量i: 当i=n时,从0开始,遍历;
添加变量m1: 让m1从1开始,如果它等于m且visit=0,则这个人出场;
添加变量n1: 用来统计到第几次退场了,退1个则+1,直到n1==n时,退出循环;
以下是源代码:
#include <stdio.h>
#define MAXN 20
void CountOff( int n, int m, int out[] );
int main()
{
int out[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
CountOff( n, m, out );
for ( i = 0; i < n; i++ )
printf("%d ", out[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
void CountOff( int n, int m, int out[] )
{
int visit[MAXN]={0};
int n1=1;
int i=0;
int m1=1;
while(n1<=n)
{
if(i==n)
{
i=0;
}
if(visit[i]==0)
{
if(m1==m)
{
m1=1;
out[i]=n1;
visit[i]=1;
n1++;
}
else
{
i++;
m1++;
continue;
}
}
i++;
}
}
解决思路2:完美利用数组下标;
详见我的: 下一篇博客
持续更新中……