㈠ 求这个c语言题目的解题思路和解法
解题思路:
1.采用二维数组(int型)存放所有学生编号,一行为一个团体。
2.用一个一维数组存放所有疑似病的学生编号
3.按编号查询所有团体的学生,
4.查找到后,即将该行所有编号存入2.中的数组
5.输出2.中的数组即可。
编写程序时,第4.和5.采用递归调用。
程序如下(该程序已经在WIN-TC上通过)
#include<stdio.h>
#include<stdlib.h>
#define N 100 /*学生总人数的最高限制数额*/
#define M 10 /*团体的个数的最高限制数额*/
#define S 10 /*团体的人数的最高限额*/
int num[S+1]; /*存放疑似病历的学生编号*/
int count; /*累计有疑似病历学生的数量*/
void findnumber(int k,int groupn,int a[][S+1])/*查找并保存所有关联学生编号*/
{
int i,j,flag;
int da[S],tem,n;
for(i=0;i<groupn;i++) /*对每个团体做如下操作*/
{
if(a[i][1]<0)continue;/*表示对已经确定的团体不再重复操作*/
tem=a[i][0];
flag=0;
for(j=1;j<=tem;j++)/*搜索团体的每一个编号,看是否与欲查编号k是否相符*/
if(a[i][j]==k)
{
flag=1; /*如果相符则记flag为1,以作为下面操作的条件*/
break;
}
if(flag) /*flag不为零则表示该团体包含疑似病的学生编号,进行如下的操作:*/
{
for(j=1;j<=tem;j++) /*将该团体的所有编号保存*/
{
da[j-1]=a[i][j];
for(n=0;n<count;n++) /*这一循环是为了保证已经记录过的编号不再重复录入*/
{
if(num[n]==a[i][j])
{
n=-1;break;
}
}
if(n>=0)num[count++]=a[i][j];
a[i][j]=-1; /*对已经确定的团体在保存后赋负值,以便后面不再重复*/
}
for(j=0;j<tem;j++)
findnumber(da[j],groupn,a); /*对该团体的其他编号再一次递归调用*/
}
}
}
main()
{
int students[N],number[M],data[M][S+1];
int studentsum,groupsum,i,j,k;
char str[10];
/*输入学生总人数和团体的个数*/
scanf("%d %d",&studentsum,&groupsum);
/*输入每个团体的学生的编号*/
for(i=0;i<groupsum;i++)
{
printf("NO.%d:(输入y或Y结束)\n",i+1);/*提示以下对第i个团体进行录入*/
scanf("%d",&data[i][0]); /*输入团体包含的人数*/
for(j=1;j<=S;j++)/*录入一个团体的每个学生的编号*/
{
scanf("%s",str);
if(stricmp(str,"y")==0)break; /*检查是否输入了y 或Y,如是则表示本团体录入完成*/
data[i][j]=atoi(str);
}
}
/*输入第一个疑似病的学生编号*/
printf("numbering=");
scanf("%d",&k);
/*以下开始查找*/
count=0;/*记数器初始化清零*/
findnumber(k,groupsum,data);/*采用递归函数找所有相关联的团体的学生编号*/
/*将查找结果输出*/
printf("\n%d ",count);/*先输出所有有关联的学生的总数*/
for(i=0;i<count;i++)/*在总数后面罗列所有编号*/
printf("%d ",num[i]);
getch(); /*显示结束后,等待按任意键后程序*/
return 0;
}
㈡ C语言解题技巧
1.首先你要清楚题目是什么
2.确定处理题目要用到哪些实际上的,生活中的实际意义的实体,然后分析这些实体可以用C语言中哪些数据类型代替。
3.生活中,即题目中实体会发生什么关系,对应到你程序中第2部做的对应的数据类型会有什么操作。
4.程序数据类型操作前,根据实际情况,确定输入,然后操作后,确定输出。
希望对你有帮助!
㈢ C语言实验题求解(。)
第1题
1.改为while(n<=7)
2.改为while(a<1||a>50)
3.改为i=1
㈣ C语言编程,求解原理~
#define row 20 ..宏定义一些常量值
#define col 30
int gra[row][col]={0}; //把全部元素都初始化为0
int ball_x=1,ball_y=4; //ball的起始下标值 (1,4) 第一行第四个位置
int dir_x=1,dir_y=1; //dir的显示位置初始值(1,1)第一行第一个位置
㈤ c语言实验,求解
#include "stdio.h"
typedef struct Student
{
int ChineseScore;//语文成绩
int MathScore; //数学成绩
int EnglishScore; //英语成绩
}student[10];
void SumScore(Student student[]) //求每个学生的总分
{
int i;
for(i=0;i<10;i++)
{
int sum=0;
sum=student[i].ChineseScore+student[i].MathScore+student[i].EnglishScore;
printf("第%d个学生的总成绩为:%d\n",i+1,sum);
}
}
void MaxAndMinScore(Student student[]) //求每门课程最低和最高分数
{
int i;
int max,min;
max=min=student[0].ChineseScore;
for(i=0;i<10;i++)
{
if(max<student[i].ChineseScore)
{
max=student[i].ChineseScore;
}
if(min>student[i].ChineseScore)
{
min=student[i].ChineseScore;
}
}
printf("语文成绩中最高分数为:%d,最低分数为:%d\n",max,min);
max=min=student[0].MathScore;
for(i=0;i<10;i++)
{
if(max<student[i].MathScore)
{
max=student[i].MathScore;
}
if(min>student[i].MathScore)
{
min=student[i].MathScore;
}
}
printf("数学成绩中最高分数为:%d,最低分数为:%d\n",max,min);
max=min=student[0].EnglishScore;
for(i=0;i<10;i++)
{
if(max<student[i].EnglishScore)
{
max=student[i].EnglishScore;
}
if(min>student[i].EnglishScore)
{
min=student[i].EnglishScore;
}
}
printf("英语成绩中最高分数为:%d,最低分数为:%d\n",max,min);
}
void StuAverScore(Student student[]) //求每个学生的平均成绩
{
int i;
int sum;
float aver;
for(i=0;i<10;i++)
{
sum=0;
aver=0;
sum=student[i].ChineseScore+student[i].MathScore+student[i].EnglishScore;
aver=sum/3.0;
printf("第%d个学生的平均成绩为:%.1f\n",i+1,aver);
}
}
void CourAverScore(Student student[]) //求每门课程的平均成绩
{
int i;
int sum=0;
float aver=0.0;
for(i=0;i<10;i++)
{
sum+=student[i].ChineseScore;
}
aver=sum/10.0;
printf("语文平均成绩为:%.1f\n",aver);
sum=0;
aver=0;
for(i=0;i<10;i++)
{
sum+=student[i].MathScore;
}
aver=sum/10.0;
printf("数学平均成绩为:%.1f\n",aver);
sum=0;
aver=0;
for(i=0;i<10;i++)
{
sum+=student[i].EnglishScore;
}
aver=sum/10.0;
printf("英语平均成绩为:%.1f\n",aver);
}
void insert(Student student[]) //录入10个学生的成绩
{
int i;
for(i=0;i<10;i++)
{
printf("请输入第%d个学生语文成绩:",i+1);
scanf("%d",&student[i].ChineseScore);
printf("请输入第%d个学生数学成绩:",i+1);
scanf("%d",&student[i].MathScore);
printf("请输入第%d个学生英语成绩:",i+1);
scanf("%d",&student[i].EnglishScore);
}
}
void main()
{
/*Student student[10]={{90,98,76},{56,85,98},{23,56,78},{67,87,59},{90,90,90},
{87,65,45},{76,67,89},{56,90,98},{67,69,80},{78,90,93}};*/ //可以直接初始化
Student student[10];
insert(student);
SumScore(student);
MaxAndMinScore(student);
StuAverScore(student);
CourAverScore(student);
}
希望你看的明白,不明白的地方可以联系我。
㈥ c语言实验原理应该写什么内容
c语言实验原理:利用结构体、函数的调用和指针的传输等原理进行实验。
C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%-20%。因此,C语言可以编写系统软件。
当前阶段,在编程领域中,C语言的运用非常之多,它兼顾了高级语言和汇编语言的优点,相较于其它编程语言具有较大优势。计算机系统设计以及应用程序编写是C语言应用的两大领域。同时,C语言的普适较强,在许多计算机操作系统中都能够得到适用,且效率显着。
㈦ c语言:解题思路
只要按照公式计算每月还款金额就可以了,其中"已归还本金累计额"等于"贷款本金 除以 还款月数 乘以 已还款月数".
按照题目要求编写的等额本金还款的C语言程序如下
#include<stdio.h>
int main(){
double P,R,repayment;
int N,i;
scanf("%lf;%d;%lf",&P,&N,&R);
printf("[");
for(i=0;i<N;i++){
repayment=(P/N)+(P-P/N*i)*R;
if(i==N-1)
printf("%.2lf]",repayment);
else
printf("%.2lf,",repayment);
}
return 0;
}
㈧ c语言 程序设计 解题步骤是什么
你的这个问题只是简单的语法和逻辑。
两个for循环,不算有什么步骤,语法分析和逻辑分析。真正用在工作
上的程序,复杂的有时需要用时序图、序列图或UML图来分析。
1、语法和逻辑处理,这个是最基本的基本功。一定要扎实。
2、要有分层分离的概念,从整个框架来理解代码,最好可以作图辅助分析。
3、了解技术相关的关键词以及功能作用,积少成多。
4、c语言面向过程,C++、java面向对象。两种思想都需要学习并融合,
才有机会成为牛人。
㈨ 用C语言实现以下问题并讲解大概思路和所用算法,非常感谢!
唔,你这个问题的话,因为你这个不指定起点,所以应该是多源最长路径问题,我参考了一下多源最短路径的Floyd算法如下,不知道可不可以啊:
首先是输入
g[i][j]表示从i城市到j城市所需要的路费,
int g[M][M]={{null,2,1,null},{null,null,5,4},{null,null,null,null},{null,null,null,null}}
null表示两个城市之间不存在路径,看上去这个数组很浪费,因为Floyd算法是可以针对更复杂的图进行计算的算法,具体有没有更优算法我也不知道=。=
然后让M=你输入的城市数量-1,这里M=4
输入设置好以后,就可以进行循环比较了,通过三重循环的比较,最终得到D[4][4]这样一个数组,这个数组中的D[i][j]表示从i城市到j城市所需要的最高的路费,然后再通过比较数组D中最大值,应该就可以得出结果了。
这里复制一下原理:
Floyd-Warshall算法的原理是动态规划。
设Di,j,k为从i到j的只以(1..k)集合中的节点为中间节点的最短路径的长度。
若最短路径经过点k,则Di,j,k = Di,k,k − 1 + Dk,j,k − 1;
若最短路径不经过点k,则Di,j,k = Di,j,k − 1。
因此,Di,j,k = min(Di,k,k − 1 + Dk,j,k − 1,Di,j,k − 1)。(而我们是求最长,所以应该换成max就可以了)
void floyd(int g[M][M],int D[M][M])
{
for(int k = 0;k<M;k++)
for(int i = 0;i<M;i++)
{
for(int j = 0;j<M;j++)
{
if(k == 0)//k=0,第一轮循环时,先将基础值赋值给D数组
{
if(g[i][j]!=null)
D[i][j] =g[i][j];
else
{
g[i][j]=-30000;//在k=0的第一轮循环中,让没有路径的地方等于一个大的负数,这样之后的比较就不需要重复的判断非空了
D[i][j]=-30000;
}}
else//当k不等于0时,也就是第二轮循环之后,进行最长路径的比较和计算,大的值赋值给D数组
{
D[i][j] = MAX(D[i][j],D[i][k]+D[k][j]);
}
}
}
}
最后再写个循环,取出数组D中的最大值就可以得到最大路程了然后再算最大路费,如果前面的算法没错的话。
我的感觉的话,Floyd-Warshall算法比较容易实现,不需要特殊的数据结构,就是可能算法的时间和空间复杂度比较高,不知道你怎么看