动态数组c语言 求助!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态数组c语言 求助!相关的知识,希望对你有一定的参考价值。
从文件Random.txt文件中读入n(n<=100)个50~100之间的整数,输出其中与平均值最接近的元素的值及下标。Random.txt文本文件请自己建立,其中的数字格式如下:
(94, 95, 98, 78, 95, 91, 69, 67, 74, 56, 58, 58, 91, 79, 100, 70, 60, 71, 93, 78
, 0, 59, 58, 52, 84, 84, 57, 84, 58, 88, 85, 74, 59, 53, 84, 97, 98, 64, 53, 51,
99, 0, 82, 60, 52, 63, 92, 53, 67, 77, 65, 55, 70, 66, 71, 76, 78, 94, 60, 70,
75, 91, 0, 95, 74, 52, 69, 78, 89, 51, 68, 59, 78, 57, 85, 89, 80, 74, 88, 94, 6
6, 99, 84, 0, 68, 56, 69, 54, 50, 82, 60, 87, 67, 84, 82, 85, 68, 83, 89, 84)
【要求】定义函数原型如下的功能函数,并在main函数中调用这些函数测试其功能,源程序文件名为“3_2.c”。
① 调用calloc或malloc函数创建动态数组,free释放动态数组
说明:标准C语言中,在定义数组时,数组元素个数必须为常量(即在编译时能确定的值)。而本题中的n为变量,是在程序运行时确定的,为了“既不浪费内存空间,又没有最大处理能力的限制”,应采用动态数组(相关标准函数原型在头文件<stdlib.h>中声明)。
② void GetData(int *a, int n);
功能:设置具有n个元素的数组a的各个元素值,要求元素值取自50至100之间的随机整数(提示:方法1:可从文件Random.txt中读入数据,数据之间由逗号分隔;方法2:为了获得随机性更好的随机数,请用语句srand(time(NULL));设置随机数发生器的种子,然后调用原型为int rand();的函数,它产生0~RAND_MAX之间的随机整数。需要包含头文件<stdlib.h>和<time.h>;程序提交请用提示方法1)。
③ void Display(int *a, int n);
功能:输出数组a的所有元素。
④ double GetAverage(int *a, int n);
功能:计算并返回包含n个元素的数组a的平均值。
⑤ int GetIndex1(int *a, int n, double x);
功能:获取与x的值最接近的数组元素的最小下标值。
⑥ int GetIndex2(int *a, int n, double x);
功能:获取与x的值最接近的数组元素的最大下标值。
输入输出样例
请输入元素个数(0退出): 100
平均值: 71.300000
与平均值最接近的下标最小的元素:a[17] = 71
与平均值最接近的下标最大的元素:a[54] = 71
请输入元素个数(0退出): 20
平均值: 78.750000
与平均值最接近的下标最小的元素:a[13] = 79
与平均值最接近的下标最大的元素:a[13] = 79
请输入元素个数(0退出): 50
原始数据:
平均值: 71.240000
与平均值最接近的下标最小的元素:a[17] = 71
与平均值最接近的下标最大的元素:a[17] = 71
请输入元素个数(0退出): 0
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#define RND_MAX 100
#define RND_MIN 50
#define MAX 200
/*用于产生随机数*/
void GenData()
FILE *fp = fopen("Random.txt", "w");
int i;
int mod = RND_MAX - RND_MIN;
int num;
if(fp==NULL) return;
srand(time(NULL));
num = rand() % mod + RND_MIN;
for(i=0;i<MAX;i++)
num = rand() % mod + RND_MIN;
fprintf(fp, "%d,", num);
fprintf(fp, "%d", num);
fclose(fp);
void GetData(int *a, int n)
FILE *fp = fopen("Random.txt", "r");
int i;
char x;
int *p = a;
if(fp==NULL) return;
for(i=0; i<n && !feof(fp); i++)
fscanf(fp, "%d%c", p++, &x);
fclose(fp);
void Display(int *a, int n)
int i;
for(i=0;i<n;i++)
printf("%d", a[i]);
if(i%8 == 7) printf("\\n");
else printf("\\t");
printf("\\n");
double GetAverage(int *a, int n)
int count = 0;
int i;
for(i=0; i<n; i++) count += a[i];
return (double)count / n;
int GetIndex2(int *a, int n, double x)
int index = n-1, i;
double min = (a[index] - x) * (a[index] - x), pc;
for(i=n-2;i >= 0;i--)
pc = (a[i] - x) * (a[i] - x); /* 保证偏差都是正数,以便于比较 */
if(min > pc)
index = i;
min = pc;
return index;
int GetIndex1(int *a, int n, double x)
int index = 0, i;
double min = (a[index] - x) * (a[index] - x), pc;
for(i=1;i<n;i++)
pc = (a[i] - x) * (a[i] - x);
if(min > pc)
index = i;
min = pc;
return index;
void main()
int * a = NULL, n, readNum, index;
double aver;
char c;
/*GenData()*/ /*用于生成一个随机数的文件*/
while(1)
printf("请输入元素个数(0退出):");
readNum = scanf("%d", &n);
if(readNum == 1)
if(n == 0) break;
if(a)
free(a);
a = NULL;
a = (int *)malloc(sizeof(int) * n);
GetData(a, n);
printf("原始数据:\\n");
Display(a, n);
aver = GetAverage(a, n);
printf("平均值: %.6f\\n", aver);
index = GetIndex1(a, n, aver);
printf("与平均值最接近的下标最小的元素:a[%d] = %d\\n", index, a[index]);
index = GetIndex2(a, n, aver);
printf("与平均值最接近的下标最大的元素:a[%d] = %d\\n", index, a[index]);
else
printf("输入错误,请输入一个数字!\\n");
while((c = getchar()) != '\\n' && c != EOF); /*清除输入缓冲*/
参考技术A 奖励多少财富值啊,这么复杂,至少40财富值吧。。要是40以上的话,我就帮你做。 参考技术B 擦……这个……
c语言查找二维数组的鞍点 新生求助大佬
对于给定的整数矩阵A[5,5],设计算法查找出所有的鞍点。
提示:鞍点的特点:列上最小,行上最大。
输入格式:
输入5行5列整数,同行数据间以空格为间隔。
输出格式:
在一行中以以下格式输出矩阵中的所有鞍点,每个鞍点的显示格式为:
[<鞍点的行坐标>,<鞍点的列坐标>,<鞍点的值>]
输入样例:
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 8
15 10 11 20 25
结尾无空行
输出样例:
[3,0,8][3,4,8]
结尾无空行
C语言查找二维数组的鞍点详细代码如图:
具体思路:
一、先把每行的最大值求出来×到数组;
二、依次遍历每行,如果其值等于最大值,再判断在列中是否最小即可。
三、输出结果。
参考技术A#include <stdio.h>
int main()
int i,j,min,max,m=5,n=5,found=0;
int a[5][5],h[5],l[5];
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d",&a[i][j]);
for(i=0; i<m; i++)
h[i]=a[i][0];
for(j=1; j<n; j++)
if(a[i][j]>h[i])
h[i]=a[i][j];
//找出每行最大值
for(j=0; j<n; j++)
l[j]=a[0][j];
for(i=1; i<m; i++)
if(a[i][j]<l[j])
l[j]=a[i][j];
//找出每列最小值
for(i=0; i<m; i++)
for(j=0; j<n; j++)
if(l[j]==h[i])
printf("[%d,%d,%d]",i,j,a[i][j]);
found=1;
//进行比较,若行最小与列最大相等,则输出
if(!found)printf("没有鞍点");
本回答被提问者采纳 参考技术B 开两个数组,一个数组存每一行的最大值,一个数组存每一列的最小值。先扫两遍矩阵把这两个数组计算出来,然后再扫一遍检查矩阵中每个元素是否同时等于其所处列的最小值与所处行的最大值,如果是就是鞍点,这样就行了吧。以上是关于动态数组c语言 求助!的主要内容,如果未能解决你的问题,请参考以下文章