在浙大刷题遇到的问题

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

——来自班导短学期
注意

  1. fread和fwrite,fprintf和fscanf,是成对使用的。
  2. fwrite用的时候,是将数据转化为二进制的形式,然后输入到文件中(比如输入一个65,将65转化为二进制的形式1000001存储,然后使用记事本打开文件后显示为A,是因为记事本程序默认为存储的数据都是ASCII码,65当作ASCII码翻译下来就是字符A。
  3. 当输入数据过多时,%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:完美利用数组下标;

详见我的: 下一篇博客

持续更新中……

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值