用c语言解决数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c语言解决数组相关的知识,希望对你有一定的参考价值。

实验目的,
1.用数组结构存放10个学生各门功课的成绩(3门)
2.调用子函数,求每门总分。
3,调用子函数,统计每门功课的最高最低分。
4.调用子函数,求每门功课平均成绩和每个学生的平均成绩
不要捣乱,我急用

// Students.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <time.h>

//每个学生 的成绩
typedef struct _STU_SCORE

unsigned int uiScoreOne;
unsigned int uiScoreTwo;
unsigned int uiScoreThree;
STU_SCORE, *LPSTU_SCORE;

void CalcScores(STU_SCORE* ssScore);//计算每门总分
void GetMaxMinScore(STU_SCORE* ssScore);//每门功课的最高最低分。
void GetAvgScore(STU_SCORE* ssScore);//每门功课平均成绩和每个学生的平均成绩

//先输入学生成绩
void ScanfStuScore(STU_SCORE* ssScore)

for (int i = 0; i < 10; ++i)

srand((unsigned)time( NULL));
ssScore[i].uiScoreOne = rand()%100 + i * 5;
ssScore[i].uiScoreTwo = rand()%100 + i * 6;
ssScore[i].uiScoreThree = rand()%100 + i * 7;



//计算每门总分
void CalcScores(STU_SCORE* ssScore)

unsigned int uiOne = 0;
unsigned int uiTwo = 0;
unsigned int uiThree = 0;
for (int i = 0; i < 10; ++i)

uiOne += ssScore[i].uiScoreOne;
uiTwo += ssScore[i].uiScoreTwo;
uiThree += ssScore[i].uiScoreTwo;

printf("第一门成绩总分为%u\n第二门成绩总分为%u\n第三门成绩总分为%u\n",
uiOne, uiTwo, uiThree);


void CalcMaxMin(unsigned int uiScore[], unsigned int& uiMin, unsigned int& uiMax)

uiMin = uiMax = uiScore[0];
for (int i = 1; i < 10; ++i)

if (uiMin > uiScore[i])

uiMin = uiScore[i];

if (uiMax < uiScore[i])

uiMax = uiScore[i];



void CalcMaxMinScore(STU_SCORE* ssScore, unsigned int& uiMin, unsigned int& uiMax, unsigned int uiGrade)

switch (uiGrade)

case 1:

unsigned int uiOneScore[10] = 0;
for (int i = 0; i < 10; ++i)

uiOneScore[i] = ssScore[i].uiScoreOne;

CalcMaxMin(uiOneScore, uiMin, uiMax);

break;
case 2:

unsigned int uiTwoScore[10] = 0;
for (int i = 0; i < 10; ++i)

uiTwoScore[i] = ssScore[i].uiScoreTwo;

CalcMaxMin(uiTwoScore, uiMin, uiMax);

break;
case 3:

unsigned int uiThreeScore[10] = 0;
for (int i = 0; i < 10; ++i)

uiThreeScore[i] = ssScore[i].uiScoreThree;

CalcMaxMin(uiThreeScore, uiMin, uiMax);

break;
default:
break;


void GetMaxMinScore(STU_SCORE* ssScore)//每门功课的最高最低分。

unsigned int uiOneMin = 0, uiOneMax = 0;
unsigned int uiTwoMin = 0, uiTwoMax = 0;
unsigned int uiThreeMin = 0, uiThreeMax = 0;
//
CalcMaxMinScore(ssScore, uiOneMin, uiOneMax, 1);
CalcMaxMinScore(ssScore, uiTwoMin, uiTwoMax, 2);
CalcMaxMinScore(ssScore, uiThreeMin, uiThreeMax, 3);

printf("第一门功课的最高分为%u, 最低分为%u\n", uiOneMax, uiOneMin);
printf("第二门功课的最高分为%u, 最低分为%u\n", uiTwoMax, uiTwoMin);
printf("第三门功课的最高分为%u, 最低分为%u\n", uiThreeMax, uiThreeMin);



//每门功课平均成绩和每个学生的平均成绩
void GetAvgScore(STU_SCORE* ssScore)

unsigned int uiAvgOne = 0, uiAvgTwo = 0, uiAvgThree = 0;
for (int i = 0; i < 10; ++i)

uiAvgOne += ssScore[i].uiScoreOne;
uiAvgTwo += ssScore[i].uiScoreTwo;
uiAvgThree += ssScore[i].uiScoreThree;

printf("第一门功课的平均分为%u,第2门功课的平均分为%u,第3门功课的平均分为%u\n\n",
uiAvgOne /= 10,
uiAvgTwo /= 10,
uiAvgThree /= 10);

for (int i = 0; i < 10; ++i)

int iAvg = 0;
iAvg += ssScore[i].uiScoreOne;
iAvg += ssScore[i].uiScoreTwo;
iAvg += ssScore[i].uiScoreThree;
printf("第%d个学生的平均分为%u\n", i, iAvg / 3);


int _tmain(int argc, _TCHAR* argv[])

STU_SCORE ssScore[10] = 0;
ScanfStuScore(ssScore);//输入成绩,这里先自动生成一些

CalcScores(ssScore);//计算每门总分
printf("----------------------------------------\n");

GetMaxMinScore(ssScore);

printf("----------------------------------------\n");
GetAvgScore(ssScore);

system("pause");
return 0;
参考技术A 完整的
#include<stdio.h>

void TotalScoreOfEachSubject(float ob[][4])

int i;
float sum = 0;

printf("The total score is:\n");
for(i = 0; i < 10; i++)
sum += ob[i][0] + ob[i][1] + ob[i][2];
printf("%6.1f\n", sum);

void MaxAndMinOfEachSubject(float ob[][4])

int i, j;
float max, min;

for(i = 0; i < 3; i++)

min = max = ob[0][i];

for(j = 1; j < 10; j++)

if(max < ob[j][i])
max = ob[j][i];
if(min > ob[j][i])
min = ob[j][i];

if(!i)
printf("Chinese max and min:\n");
else if(i == 1)
printf("Math max and min:\n");
else
printf("English max and min:\n");
printf("%6.1f %6.1f\n", max, min);



void AveOfEachSubject(float ob[][4])

int i, j;
float sum;

for(i = 0; i < 3; i++)

sum = 0;
for(j = 0; j < 10; j++)
sum += ob[j][i];
if(!i)
printf("Chinese ave:\n");
else if(i == 1)
printf("Math ave:\n");
else
printf("English ave:\n");
printf("%6.1f\n", sum / 10);


void AveOfEachStudent(float ob[][4])

int i;

for(i = 0; i < 10; i++)
ob[i][3] = (ob[i][0] + ob[i][1] + ob[i][2]) / 3;
printf("Each student ave:\n");
for(i = 0; i < 10; i++)
printf("Num %d: %6.1f\n", i + 1, ob[i][3]);

int main()

int i;
float ob[10][4];

for(i = 0; i < 10; i++)

printf("The %d :\n", i + 1);
printf("Chinese score:");
scanf("%f", &ob[i][0]);
printf("Math score:");
scanf("%f", &ob[i][1]);
printf("English score:");
scanf("%f", &ob[i][2]);


TotalScoreOfEachSubject(ob);
MaxAndMinOfEachSubject(ob);
AveOfEachSubject(ob);
AveOfEachStudent(ob);
return 0;
参考技术B 伪代码
double stu[10][3]=....;
int i,j;
求每门总分:
double sum(double array[][])

double sum[3]=0,0,0;
for(i=0;i<3;i++)

for(j=0;j<10;j++)

sum[i]+=array[j][i];


return sum[3];

统计最高最低分:
最高分:
double max(double array[][])

double max[3];
for(i=0;i<3;i++)

for(j=0;j<9;j++)

if(array[i][j]>=array[i][j+1])
max[i]=array[i][j];
else max[i]==array[i][j+1];


return max[3];


现写的,大概就这样,剩下的照着写吧。有点仓促,希望能帮到你。
参考技术C 用二维数组a[10][3]存储 参考技术D #include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct student



char name[10];

float s1;
float s2;
float s3;

stu[10],temp;

void main()



int i,j;

char ch,t[6];

for(i=0;i<10;i++)



printf("please input the data of student %d\n",i+1);

gets(stu[i].name);

gets(t);

stu[i].s1=atoi(t);

gets(t);

stu[i].s2=atoi(t);
gets(t);

stu[i].s3=atoi(t);



第5个回答  2012-05-02 这个太简单了噻~!

C语言申请内存?

我想知道这句申请内存的语句的意思怎么用?是什么意思?
int *p,n;
scanf("%d",&n);
p=(int *)malloc(sizeof(int)*n);

但在某些时候,我们需要的数组的长度是无法预先确定的,要解决这样的限制,需要使用动态数组。动态数组是相对于静态数组而言。动态数组的内存空间是从堆(heap)上分配的,是在执行代码过程中分配的,当程序执行到这些语句时,才为其分配。注意,程序员自己负责释放内存。
1
2
#include<stdio.h>
#include<stdlib.h>

int main(int arcv, char * argv[])

int arrLen;
char *array;

char c;
int i;

printf("please set the size of the len:\n");
scanf("%d", &arrLen);

array = (char *)malloc(arrLen*sizeof(char));
if(array == NULL)

printf("malloc fail\n");
return -1;


for(i = 0; i < arrLen;i++)

c = getchar();
array[i] =c;//*array++ =c;


for( i = 0; i < arrLen; i++)

printf("this array is %c\n", array[i]);


free(array);
return 0;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mallco和free成对出现,在用完申请的内存之后及时释放,否则会造成内存泄漏。
我们在一些项目中经常出现内存泄漏
参考技术A 如果c语言申请,但是它的内存的话可以清理掉,然后再重新的申请。 参考技术B #include
<stdio.h>
#include
<malloc.h>
void
main()
int
a=10;
int
p*;//定义了一个整数类型的指针
p=malloc(sizeof(int)*a);//分配40个字节的内存空间
*p=5;
*(p+1)=6;
//将分配的内存空间的前两个整数赋值为5和6
free(p);
//使用完之后释放内存空间
参考技术C 语言申请内存就是把语句说的清楚呃,游离让别人能听出来他这个什么意思?不能胡说乱说。 参考技术D 在C语言中,使用malloc函数来申请内存。函数原型如下:

#include<stdlib.h>

void *malloc(size_t size);

参数size代表需要动态申请的内存的字节数,若内存申请成功,函数返回申请到的内存的起始地址,若申请失败,返回NULL, 在使用该函数时应注意以下几点

1.只关心申请内存的大小,该函数的参数很简单,只有申请内存的大小,单位是字节

2.申请的是一块连续的内存,该函数一定是申请一块连续的区间,可能申请到内存比实际申请的大,但也有可能申请不到,若申请失败,则返回NULL

3.返回值类型是void*,函数的返回值是void*,不是某种具体类型的指针,可以理解成该函数只是申请内存,对在内存中存储什么类型的数据,没有要求,因此,返回值是void*,实际编程中,根据实际情况将void*转换成需要的指针类型

4.显示初始化,注意:堆区是不会自动在分配时做初始化的(包括清零),所以程序中需要显示的初始化

以上是关于用c语言解决数组的主要内容,如果未能解决你的问题,请参考以下文章

c语言 怎么解决调用函数导致的原数组改变

C语言全排列问题为啥用指针比数组慢很多?

C语言结构体数组排序

C语言 用调用函数和数组求斐波那契数列的前10项。 f[i]=F(f,i); 能这样用吗

怎样用c语言来解决排序问题

数组中有一个数字出现次数超过数组长度一半,找出这个数字(用C语言解决)。要求时间复杂度尽量小。