㈠ 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;
}