㈠ c语言题目算法解析
自己的一点看法,可能有不对的,欢迎探讨。
#include <stdio.h>
#include <malloc.h>
int **stu_g;//这个二维数组存储学生团体里边的学生编号
int *ret;//存储结果
int ret_num;//感觉这个变量没用到。。。。。
int n, k;//n学生总数,k学生团体总数
void add(int *pArr, int num){ // @num : a number > -//将与被感染者有关的人加入到ret数组中
int *t = pArr;
while(*t != -1 && *t != num) t++;//这个不知道// 这里是排除重复,当前num是需要加入到ret数组中的,如果ret数组中num之前不存在,则将num加进去。
if(*t == -1) *t = num;//这个不知道
}
int find(int index){ //@index : index of ret[]//这个不知道//len变量用来表明最后输出的时候总共有多少个疑似病例
int i, j;
if(ret[index] == -1) return index;//这个不知道//在调用过程中index的值为0,如果ret[index]=0的话那么表明不存在疑似病例,直接返回,len=0;
for(i = 0; i < k; i++){
for(j = 0; j < stu_g[i][0] - 1; j++)//这个不知道
{
if(stu_g[i][j+1] == ret[index]){ // the student in this group//这两个嵌套的for循环是用来判断学生团体成员中是否存在某个学生的编号与ret数组中的值相同,如果有相同的话就把真个当前的学生团体的所有成员添加到ret数组中。
j = 1;
while(j < stu_g[i][0])add(ret, stu_g[i][j++]);
break;
}
}
}
return find(index + 1);//递归调用find,依次判断ret数组中的各个成员和stu_g中的成员,扩充ret数组。
}
int func(){
int i, j, sum, num, len;
// malloc
ret = (int *)malloc(sizeof(int) * n);//这个不知道//malloc函数给变量分配地址空间,这个具体用法你自行网络
stu_g = (int **)malloc(sizeof(int) *k);//根据K值给stu_g数组分配第一维空间
i = 0;
while(i < n) ret[i++] = -1;//初始化ret数组
ret_num = 0;
for(i = 0; i < k; i++)
{
scanf("%d", &sum);//sum在这里是学生团体中学生的人数
stu_g[i] = (int *)malloc(sizeof(int) * (sum + 1));//分配第二维空间
stu_g[i][0] = sum + 1; // sum as arry len//这个不知道//这里不是很确定哈,stu_g[i][0]这个值表示stu_g[i]这个一维数组的长度,因为sum的值是暂时的,用[0]这个值来记录每个学生团体中的具体人数的值
for(j = 0; j < sum; j++) scanf("%d", &stu_g[i][j+1]);//录入每个团体的学生编号
}
scanf("%d", &ret[0]);//这个不知道//这里就是将首次给出的感染的学生的编号放入ret数组的起始单元中
//以上都是初始化数组和读取数据
//@ret : 结果
//@str_g : 一个二维数组 存放每组成员
len = find(0);//这个不知道
printf("%d", len);
i = 0;
while(i < len)printf(", %d", ret[i++]);//输出ret数组内容
printf("\n");
//free
free(ret);//释放空间
for(i = 0; i < k; i++) free(stu_g[i]);
}
int main(){
while(scanf("%d %d", &n, &k) == 2){
func();
}
return 0;
}
㈡ 在C语言中如何判断学生的学号为3位数字,这个学号应该把他定义为int型还是string啊
如果是用字符串 来保存的话 可以用strlen(s)来得到s的位数,三个数字肯定 长度为3么。。。
㈢ C语言编写一个成绩用来输入学生学号姓名成绩,并统计学生成绩的最大值,最小值,平均值,方差,判断学生
1、更多交流可参考我空间主页有关文章。
2、#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
/*定义结构体*/
struct student
{
int num;
float score;
struct student *next;
};
/*创建一个只有头结点的空链表*/
struct student *create_head()
{
struct student *head;
head=(struct student*)malloc(sizeof (struct student) );
if(head==NULL) //小心别漏这个
{
printf("申请头结点失败!\n");
return NULL;
}
head->next=NULL;
return head;
}
/*将s指向的结点插入链表,使链表保持升序,并返回头结点*/
struct student *insert(struct student *head,struct student *s)
{
struct student *p=head;
while(p->next!=NULL&&s->score>p->next->score)//特别注意&&左右不能写反,若s最大,最后p->next=NULL,p->next->score运行出错
p=p->next;
if(p->next==NULL) //s->score最大的情况 //其实两种情况可以并在一块写
{
p->next=s; //连接结点
s->next=NULL; //p->next就等于NULL
}
else
{
p->next=s; //连接结点
s->next=p->next;
}
return head ;
}
/*查找符合条件的结点,并返回指向该结点的指针*/
struct student *search(struct student *head)
{
struct student *p=head->next;
int num;
printf("请输入要查找学生的学号:\n");
scanf("%d",&num);
while(p!=NULL&&p->num!=num) //特别注意两条件不能写反,若写反最后p指向NULL时p->num找不到 运行出错
p=p->next;
if(p==NULL) //特别注意两个if不能调换,若调换最后p指向NULL时p->num运行出错
{
printf("找不到符合条件的结点!!!");
return NULL; //查找不到返回空指针
}
if(p->num==num)
{
printf("找到符合条件的结点\n该结点为%d\t%f",p->num,p->score);
return p; //返回查找到的指针
}
}
/*输出链表各结点的值,也称对链表的遍历*/
void print(struct student *head)
{
struct student *p;
printf(" 链表如下: \n");
p=head->next;
while(p!=NULL)
{
printf("%d\t%.1f\n",p->num,p->score);
p=p->next;
}
}
/*释放链表*/
void free_list(struct student *head)
{
struct student *p=head ;
printf("释放链表:\n");
while(p!=NULL)
{
head=head->next;
free(p);
p=head;
}
printf("释放链表成功!\n");
}
/*删除链表中值为num的结点,并返回链表的首指针*/
struct student *delete_note(struct student *head,int num_x)
{
struct student *p1=head->next , *p2=head ;
while(p1!=NULL&&p1->num!=num_x) //特别注意&&左右条件不能调换,若调换如果p1指向NULL时p1->num运行出错
{
p2=p1;
p1=p1->next;
}
if(p1==NULL) //特别注意两个if不能调换,若调换如果p1指向NULL时,p1->num运行出错
printf("找不到符合删除要求的结点!!!\n");
if(p1->num==num_x)
{
p2->next=p1->next;
free(p1);
printf("结点删除成功!\n");
}
return head;
}
/*完整的有头结点链表操作程序*/
void main()
{
struct student *p , *head ;
char c;
int num ;
float score ;
printf("有头结点链表操作程序:\n");
head=create_head();
while(1)
{
printf("I:插入结点(自动升序) P:输出链表 S:查找结点 D:删除结点 E:释放链表并退出程序! ");
c=getch();
switch(c)
{
case'I':
printf("请分别输入要插入学生的学号和分数:\n");
scanf("%d%f",&num,&score);
p=(struct student*)malloc( sizeof(struct student) );
if(p==NULL)
{
printf("申请该结点失败!!!\n");
exit (0) ;
}
p->num=num; p->score=score; //给p赋值
insert(head,p);
printf("插入成功!\n");
break;
case'P':
print(head);
break;
case'S':
search(head);
break;
case'D':
printf("请输入要删除的学生的学号:\n");
scanf("%d",&num);
delete_note(head,num);
break;
case'E':
free_list(head);
exit (0);
}
}
}
㈣ C语言编程,输入学生编号,显示出此人各项信息,已编写过,对switch语句和ave函数的调用求详解.急急急~~
你的程序根本就不对啊,switch语句的表达式咋能是实数呢?很简单的一个程序编的太离谱了!
㈤ C语言 学生成绩排序 按学生的序号输入 n 名学生的成绩,按照分数由高到低的顺序输出学生的名次、序号和成绩
#include<stdio.h>
#include<malloc.h>
typedefstructstudent
{
intid;
intscore;
structstudent*next;
}STU;
intstuIndex;
voidinputStuInfo(STU*stuHead);//输入学生信息
voidorderStuInfo(STU*stuHead);//按照分数高到低顺序重组链表
voidprintStuInfo(STU*stuHead,intflag);//打印学生信息。参数flag=0:正常打印链表信息。flag!=0:打印排序后的名次信息
intmain()
{
STU*stuHead=(STU*)malloc(sizeof(STU));
stuHead->next=NULL;
stuIndex=1;
inputStuInfo(stuHead);
printf("--打印原始输入的链表!--
");
printStuInfo(stuHead,0);
printf("--开始按分数降序排列!--
");
orderStuInfo(stuHead);
printf("--链表按降序重组完成!--
");
printf("--打印降序排序的链表!--
");
printStuInfo(stuHead,1);
return0;
}
voidorderStuInfo(STU*stuHead)
{
STU*stuSave1=NULL,*stuSave2=NULL,stuSave3;
stuSave1=stuHead;
while(stuSave1->next!=NULL)//冒泡排序
{
stuSave2=stuSave1->next;
while(stuSave2->next!=NULL)
{
if(stuSave1->next->score<stuSave2->next->score)//交换成员值,保留原链表指针值
{
stuSave3=*(stuSave1->next);
stuSave1->next->id=stuSave2->next->id;
stuSave1->next->score=stuSave2->next->score;
stuSave2->next->id=stuSave3.id;
stuSave2->next->score=stuSave3.score;
}
stuSave2=stuSave2->next;
}
stuSave1=stuSave1->next;
}
}
voidprintStuInfo(STU*stuHead,intflag)
{
inti=1;
while(stuHead->next!=NULL)
{
if(flag==0)
printf("学生%d,成绩%d
",stuHead->next->id,stuHead->next->score);
else
printf("第%d名,学生%d,成绩%d
",i++,stuHead->next->id,stuHead->next->score);
stuHead=stuHead->next;
}
}
voidinputStuInfo(STU*stuHead)
{
intscore;
STU*stuNew=NULL,*stuTail=NULL;
while(1)
{
printf("输入学生%d的成绩:(输入负数结束输入)",stuIndex);
scanf("%d",&score);
if(score<0)
break;
stuNew=(STU*)malloc(sizeof(STU));
stuNew->score=score;
stuNew->id=stuIndex;
stuNew->next=NULL;
if(stuHead->next==NULL)
stuHead->next=stuNew;
else
stuTail->next=stuNew;
stuTail=stuNew;
stuIndex++;
}
}
㈥ C语言填写函数查找学生学号姓名
#include<stdio.h>
void main()
{
struct
{
char name[10];
int num;
char sex[2];
int age;
}s[10];
int i;
for(i=0;i<10;i++)
{
printf("请依次输入学生的姓名,学号,性别,年龄等信息");
scanf("%s%d%s%d",s[i].name,&s[i].num,s[i].sex,&s[i].age);
}
for(i=0;i<10;i++)
{
printf("姓名:%s 学号:%d 性别:%s 年龄:%d ",s[i].name,s[i].num,s[i].sex,s[i].age);
}
}
㈦ c语言编写一个函数sort按照学生编号由小到大的顺序排列二维数组,两门课程的成
数组的4种声明方式:
1.先声明再初始化
例如:
//1.声明
int[] nums;
//初始化
nums = new int[5];
2.声明并初始化
例如:
//2.声明、初始化
int[] nums = new int[10];
3.创建数组同时赋值
例如:
//3.创建数组同时赋值
String[] names=new String[]{"大名","小米","夏雨荷"};
int[] ages=new int[]{21,22,21,56,13};
for (int i = 0;i < names.length;i++){
System.out.prinrln(names[i]);
}
for (int i = 0;i < ages.length;i++){
System.out.prinrln(ages[i]);
}
4.创建同时赋值,简写,不能写成两条语句
例如:
//4.创建同时赋值,简写,不能写成两条语句
String[] cities = {"上海","北京"};
(7)c语言判断学生的编号扩展阅读:
数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。
在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
㈧ c语言编程,语言打印不及格学生的序号,我这样写的话,序号只能发出来一个,这个printf应该怎样写
让人帮忙解决问题前,请先让人认识你的字。
直接一个循环,然后if判断。很简单的啊
㈨ C语言 头插法的链表该如何建立 算法是什么 麻烦各位兄弟讲一下 小弟实在理解不了
链表其实很简单,很容易理解的,只要把它当做循环理解就好了,只不过是一个较为特殊的循环,不要把它想象的太难
首先结构体知道吧,知道就好办,不知道就赶紧复习一下,只有吃透了结构体,才能明白链表,不然链表没法讲
首先定义全局变量 结构体(链表结点的结构体类型,也可以简单的理解所谓结点就是指这个结构体)
案例:输入学生名字和编号
#include "stdio.h"
struct person
{
char *name;
int numbers;
struct person *next;
};
//指针*next起连接作用,是结点和下一个结点的桥梁,必不可少!
在定义 主程序
main()
{
struct person *head,*p1,*p2;
//定义链表操作时的三个指针,*head为头指针;*p1为申请下一个结构体的内存空间(即新的结点),用于存放新的数据;*p2为保存*p1所申请的内存空间(即保存新结点),也就是保存p1中的数据;三个指针缺一不可!
p1=p2=(struct person *)malloc(size);
head=p1;
//malloc函数申请第一个结点,让p1、p2、head共同指向同一个内存空间(即申请的第一个结点)
scanf("%s%d",p1->name,&(p1->numbers));
//向申请的第一个结点输入数据
//下来就该进入循环了
while(p1->numbers !=0)
{
p2=p1;
p2->next=p1;
p1=( struct person *)malloc(size);
scanf("%s%d",p1->name,&(p1->numbers));
}
p2->next=NULL;
//此时就进入了链表的核心算法,得给你好好讲讲!
//循环的判断条件是学生的编号(numbers)不等于0,首先判断第一个结点输入的学生编号是否为0
1.当不为0时,执行循环当中的内容
首先,让p2保存p1申请的结点(即p2=p1)
然后让p2中的next指向p1(即p2->next=p1),在让p1去开辟下个结点
然后用malloc函数申请下一个结点,也就是p1开辟新结点(即p1=(struct person *)malloc(size));在这个新开辟的结点输入数据(即scanf("%s%d",p1->name,&(p1->numbers)));
接着就又进入循环判断条件,满足条件继续进入循环语句,不满足则进入语句2
注意p1、p2、head都指向第一个结点,其中head保存第一个结点,而p1、p2都是相互配合变化的,即p1开辟新结点,p2保存p1开辟的结点,如果循环几次,你就可以发现他们的规律了,
2.当学生编号(numbers)等于0时,退出循环
执行p2->next=NULL;其意思是停止p1开辟新结点(在循环语句里next是指向p1,让p1去开辟新结点)
}
如果你能看懂以上内容,那么链表的输入和链表的删除、插入应该也就很容易明白,若有别的问题QQ留言121590680
如果对你有所帮助,请记得采纳最佳答案,谢谢!
㈩ C语言解答 求代码
#include<stdio.h>
#define N 2000000
#define M 10000
int f[N]= {0};
int b[M]= {0};
int main()
{
int n,x;
int m;
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d",&x);//所有的提交过的人的编号
f[x]++;//出现过的编号标记
}
scanf("%d",&m);
for(int i=0; i<m; i++) {/*抽取这m个人的编号,其中某个人在数组a中出现过,就输出Yes,否则输出No*/
scanf("%d",&b[i]);
}
for(int i=0; i<m; i++)
{
int t=b[i];
if(f[t]!=0)//判断;
printf("Yes ");
else
printf("No ");
}
return 0;
}