学校C语言实验——指针2&&结构1
本博客为非计算机专业的实验,均是采用最基础的思路和代码。
老规矩,先给出头文件:
#include "stdafa.h"
#include<stdio.h>
#include<stdlib.h>
正文:
一、写个函数sort能对任意个数的数组排序,在main里定义并初始化10个元素的整型数组,输出,调用sort函数后再输出。
知识点:很明显这是个排序问题,排序问题基本就是使用两层for循环,通过依次比较把最小的提到前面去,我们使用改进的选择排序(即先第一个元素与后面所有元素一次比较,大则交换,然后第二个与后面的依次比较,...,知道全部元素比较完)
代码实现:
void sort(int* p, int n) {
int i, j, t;
for (i = 0;i < n;i++)
for (j = 0;j < n - i - 1;j++)
if (*(p + j) > *(p + j + 1)) {
t = p[j]; //这里的p[j],也可以使用*(p+j)
p[j] = p[j + 1];
p[j + 1] = t;
}
};
int main() {
int i, a[10];
printf("请输入十个数字: ");
for (i = 0;i < 10;i++)
scanf("%d", &a[i]);
printf("\n");
sort(a, 10);
for (i = 0;i < 10;i++)
printf("%d ", a[i]);
}
运行结果如下图:
如上。
二、写一个函数,实现求一元二次方程的根。在主程序中调用它求方程x^2+3x+2=0的根。
知识点:二次函数求根的第一步是判别是否有根,然后利用球根函数求解。
下面给出代码,注意看球根函数root是怎么判别是否有根的、求根的公式:
void root(double a,double b,double c) {
double x1, x2;
if ((b * b - 4 * a * c) < 0)
printf("无解");
else{
x1 = (-b + sqrt((b * b - 4 * a * c))) / (2*a);
x2 = (-b - sqrt((b * b - 4 * a * c))) / (2*a);
if (x1 != x2)
printf("%.1f,%.1f", x1, x2);
else
printf("%.1f", x1);
}
};
int main() {
int x, y;
int a = 0, b = 0, c = 0;
scanf("%d%d%d", &a, &b, &c);
root(a, b, c);
return 0;
}
运行结果:
为什么root要这么传参,因为对于一个固定的二次方程,我们只需要知道其对应的系数就好了,其实我们发现这里面也是用到根的,所以这个函数也可以传进去五个参数,这就诞生了思路二,如下:
int roots(float a, float b, float c, float* x1, float* x2);
int main() {
float x1, x2, c;
c = roots(1, 3, 2, &x1, &x2);
if (c > 0)
printf("%.1f %.1f", x1, x2);
else
printf("无解");
}
int roots(float a, float b, float c, float* x1, float* x2) {
float d = b * b - 4 * a * c;
if (d < 0) return 0;
else if (d > 0) {
*x1 = (-b + sqrt(d)) / (2 * a);
*x2 = (-b - sqrt(d)) / (2 * a);
return 2;
}
else {
*x1 = *x2 = (-b + sqrt(d)) / (2 * a);
return 1;
}
}
也也能得出以上一样的答案。
三、
定义一个结构类型stu,能够描述以下数据结构。
num | name | sex | age | brithday | addr | ||
month | day | year | |||||
并用scanf输入3个人的信息,然后再输出。
知识点:结构体,在形式上其实就相当于C语言中的数据库,只不过这个数据库很小是用数组来储存的,所以占用空间需要很多,不如数据库方便,其本质上就是一个描述物体属性的东西,就比如说一个迷宫宝藏,它必须要有坐标、大小、需不需要钥匙一样,一个结构体,本质上就是定义了一类属性合,比如说学生结构体,那就包含了一个学生有的学号、姓名、性别、年龄、出生年月、班级、家庭地址等等。
在代码中其与函数的定义方法类似,只是需要一个专门的关键字“struct”。
struct brith {
int month;
int day;
int year;
};
struct stu {
int num;
char name[12];
char sex;
int age;
struct brith brithday;
char addr[30];
};
int main() {
struct stu x[3] = { {1,"Li","nan",14,12,2,2004,"翻斗花园"},{2,"Wang","nv",24,10,24,2014,"筋斗花园"},{ 3,"ZHAO","nv",14,1,24,2024,"翻斗花园" } };
int i;
for (i = 0; i < 3; i++)
printf("%d %s %s %d %d %d %d %s\n", x[i].num, x[i].name, x[i].sex, x[i].age, x[i].brithday.month, x[i].brithday.day, x[i].brithday.year, x[i].addr);
}
这里面还在结构体stu里面逃了一个结构体birth。
四、实现函数input进行数据输入,函数display输出。
struct stu { char name[20]; int age ;};
void input(struct stu *pman);
void display (struct stu *dd,int n);
#define M 4
main() {
struct stu man[M]; int i;
for(i=0;i<M;i++)
input(&man[i]);
display(man , M) ;
}
代码:
#define M 4
struct stu {
char name[20];
int age;
};
void input(struct stu* pman);
void display(struct stu* dd, int n);
int main() {
struct stu man[M]; int i;
for (i = 0;i < M;i++)
input(&man[i]);
display(man, M);
}
void input(struct stu* pman) {
scanf("%s%d", &((*pman).name), &((*pman).age));
}
void display(struct stu* dd, int n) {
int i;
for (i = 0;i < n;i++) {
printf("%s,%d\n", (dd+i)->name, (dd+i)->age);
}
}
运行结果如下:
五、总结
OK,本次分享的是涉及指针和结构的一些小实验,有需要的小伙伴可以自取练习。
原文地址:https://blog.csdn.net/2303_76843399/article/details/145159023
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!