當前位置:首頁 » 編程語言 » c語言實驗原理和解題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言實驗原理和解題

發布時間: 2022-04-21 09:50:21

㈠ 求這個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演算法比較容易實現,不需要特殊的數據結構,就是可能演算法的時間和空間復雜度比較高,不知道你怎麼看