实验1 C语言结构体、指针与函数
一、实验目的
- 复习C语言基础知识
- 加强对C语言的函数参数传递、指针和结构体等知识点的运用,加强数据结构语言基础训练;
二、实验内容
1.设计一个函数,计算S=1-2+3-4+5-6+……+/-N的值,并计算你所设计的函数的时间复杂度。
2.歌德巴赫猜想:任一大于2的偶数,都可以表示成两个素数之和。请验证:2000以内大于2的偶数都能够分解为两个素数之和。请尽量优化自己的算法。
- 实现病历查询功能。具体要求如下:
定义一个结构体描述病人病历信息(病历号,姓名,症状);完成功能如下:
1)输入功能:输入5个病人的信息;
2)查询功能:输入姓名,在5个病历中进行查找,如果找到则显示该人的信息,如果没有找到,则显示“查无此人”。
假设病历类型名为patient,要求使用指针,并使用以下两个函数(函数的实现自行完成):
void readin(patient *p);//用来输入病人信息。
void search(patient *p, char *x);//根据姓名查询病人病历信息,并打印出来。
提示:请注意输入函数的用法。
第一题解法:
#include <stdio.h>
#include <stdlib.h>
long fn(long n) //计算并返回结果
{
if(n<=0) //判断输入的值是否为0
{
printf("error: n must > 0");
exit(1); //结束进程
}
if(0==n%2) //判断输入的数是否为偶数
return (n>>1)*(-1); //偶数的话就是数字的个数乘以-1
else
return(n>>1)*(-1)+n;
//不是偶数的话就是在偶数的基础上再加上最后一个数
}
int main()
{
static long s_number;
printf("请输入一个大于0的数");
scanf("%ld",&s_number);
printf("%ld",fn(s_number));
}
第二题解法:
#include <stdio.h>
#include <math.h>
int i; //偶数
int j; //素数循环判断数
int number = 0; //输入的变量
int k; //分解的数
int number2 = 0; //另一个分解的数
int sushu(int num1) //判断素数
{
int flag = 0;
for(j = 1;j <= sqrt(num1);j++)
{
if(num1 % j == 0) //余数为零为素数
{
flag = 1;
break;
}
}
if(flag != 0) //判断是否为素数
{
return 1;
}
}
int main()
{
static int numb;
printf("请输入一个大于2且不大于2000的偶数: ");
scanf("%d",&number); //输入一个偶数
for(i = 2;i <= number;i = i + 2) //得出偶数
{
for(int k = 1;k <= number;k++) //分解的数循环判断
{
if(sushu(k)) //判断第一个分解的数是否为素数
{
number2 = i - k; //得出另一个分解的数
if(sushu(number2)) //再判断另一个数是否为素数
{
numb++; //素数的数量
printf("符合猜想的偶数: %d\n",i);
break;
}
}
}
}
if(numb == number / 2) //判断出来的素数数量是否与偶数的数量相同
{
printf("\n猜想正确");
}
else
{
printf("\n猜想错误");
}
}
第三题解法:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct patient{ //定义一个 结构体patient
char medicalRecordNo[20];
char name[50];
char symptom[20];
}myPatient[5];
void readin(patient *p) //输入病人的信息
{
printf("请输入5个病人的信息\n");
for(int i = 0;i < 5;i++)
{
printf("第%d个病人的病历号: ",i + 1);
scanf("%s",&*(p + i)->medicalRecordNo);
printf("第%d个病人的姓名: ",i + 1);
scanf("%s",&*(p + i)->name);
printf("第%d个病人的症状: ",i + 1);
scanf("%s",&*(p + i)->symptom);
}
}
void search(patient *p,char *x) //查询病人的信息
{
int i;
for(i = 0;i <5;i++) //匹配病人的名字
{
if(strcmp(x, p[i].name) == 0)
{
break;
}
}
if(i == 5) //匹配不到
{
printf("查无此人");
}
else //匹配成功输出该病人信息
{
printf("病人的病历号:");
printf("%s",p[i].medicalRecordNo);
printf("\n");
printf("病人的名字:");
printf("%s",p[i].name);
printf("\n");
printf("病人的症状");
printf("%s",p[i].symptom);
}
}
int main()
{
char searchName[20]; //定义空间
char *Name = searchName; //查找的名字放在这
readin(myPatient); //输入病人信息
printf("请输入要查询的病人的姓名:\n");
scanf("%s",Name); //输入要搜索的名字
search(myPatient,Name); //搜索病人信息
return 0;
}