c語言a54a3a5
A. c語言編程,輸入10個學生5門課的成績,分別用函數實現以下功能:
#include<stdio.h>
#include<windows.h>
main()
{
int
i,j,li=0,lj=0;
float
score[10][5],average[10],a1,a2,a3,a4,a5,largest=0,fc=0,a=0;
//score是50個學生的成績,average是5門課的平均成績,a1-a5分別是5門課的平均成績,li是最高分的學生
//lj是最高分的學科,largest是最高分,fc是平均分方差,a是50個成績的平均分
printf("請輸入10個學生的成績,按照語文、數學、英語、物理、化學的順序依次輸入:\n");
for(i=0;i!=10;++i)
{
printf("第%d個學生:\n",i+1);
for(j=0;j!=5;++j)
{
scanf("%f",&score[i][j]);
if(largest<score[i][j])
{
largest=score[i][j];
li=i+1;
lj=j+1;
}
a=a+score[i][j];
}
average[i]=(score[i][0]+score[i][1]+score[i][2]+score[i][3]+score[i][4])/5;
a1=a1+score[i][0];
a2=a2+score[i][1];
a3=a3+score[i][2];
a4=a4+score[i][3];
a5=a5+score[i][4];
}
a=a/50;
for(i=0;i!=10;++i)
{
for(j=0;j!=5;++j)
{
fc=fc+(score[i][j]-a)*(score[i][j]-a);
}
}
fc=fc/50;
a1=a1/10;
a2=a2/10;
a3=a3/10;
a4=a4/10;
a5=a5/10;
printf("50個學生的成績如下:\n");
printf("學生編號
語文
數學
英語
物理
化學\n");
for(i=0;i!=10;++i)
{
printf("%8d
",i);
for(j=0;j!=5;++j)
{
printf("%2.2f
",score[i][j]);
}
printf("\n");
}
for(i=0;i!=10;++i)
printf("第%d個學生的平均分為:%.2f\n",i+1,average[i]);
printf("第1門課的平均分為:%.2f\n",a1);
printf("第2門課的平均分為:%.2f\n",a2);
printf("第3門課的平均分為:%.2f\n",a3);
printf("第4門課的平均分為:%.2f\n",a4);
printf("第5門課的平均分為:%.2f\n",a5);
printf("50個分數中最高的分數是第%d個學生的第%d門課,分數為:%.2f\n",li,lj,largest);
printf("平均分方差為:%.2f\n",fc);
system("pause");
}
B. C語言中整型常量有幾種形式它們是如何表示的
在C語言中,整型常量分為十進制整型常量、八進制整型常量和十六進制整型常量三種表示形式。
1、十進制整型常量
此種格式的整型常量只能出現 0~9 的數字,且可帶正、負號。比如:
0 1 364 28 -34
2、八進制整型常量
此種格式的整型常量以數字0開頭的八進制數字串。其中數字為 0~7。例如:
0111十進制 73、 011十進制 9、 0123十進制 83、
3、十六進制整型常量
此種格式的整型常量以0x或0X(x是大寫)開頭的十六進制數字串。其中每個數字可以是 0~9、a~f或 A~
F 中的數字或英文字母。例如:
0x11十進制 17、 0Xa5十進制 165、 0x5a十進制 90、
C. c語言編程子數整除
#include<stdio.h>
main()
{
intk,a,num1,num2,num3;
scanf("%d",&k);
for(a=10000;a!=30001;a++)
{
num1=a/100;
num2=a/10-(a/10000)*1000;
num3=a-(a/1000)*1000;
if(num1==0||num2==0||num3==0)
continue;
elseif((num1%k)==0&&(num2%k)==0&&(num3%k)==0)
printf("%d ",a);
}
getchar();
getchar();
return0;
}
結果:如圖
D. 一道關於樂透獎兌獎演算法的C語言編程題
##include "stdio.h"
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int awardnum[6],yournum[6],sum=0,special,i,j;
bool mark=false;
srand(time(NULL));
for(i=0;i<6;i++)
{
awardnum[i]=rand()%42;
for(j=0;j<i;j++)
{
while(awardnum[i]==awardnum[j]) awardnum[i]=rand()%42;//這里確保搖出的獎沒有重復號
}
cout<<awardnum[i]<<endl;//這句話用作調試
}
special=rand()%42;//特殊號碼這里沒有確保和前面6個數不一樣,這樣可能出現沒有二等獎的情況
cout<<"特殊號碼為"<<special<<endl; //這里也用作調試
cout<<"請輸入6個不重復的彩票號碼"<<endl;
for(i=0;i<6;i++) cin>>yournum[i];
for (i=0;i<6;i++)
{
int temp=sum;
for (j=0;j<6;j++)
{
if (yournum[i]==awardnum[j]) sum++;
}
if(temp==sum)
{
if(yournum[i]==special) mark=true;
}
}
if(sum==6) {cout<<"恭喜,你中了特等獎!"<<endl; return;};
if(sum==5 && mark){cout<<"恭喜,你中了二等獎!"<<endl; return;};
if(sum==5 && !mark){cout<<"恭喜,你中了三等獎!"<<endl; return;};
if(sum==4){cout<<"恭喜,你中了四等獎!"<<endl; return;};
if(sum==3){cout<<"恭喜,你中了五等獎!"<<endl; return;};
if(sum<3){cout<<"對不起,你沒有中獎!"<<endl; return;};
}
//看看是不是你想要的!在Vc6.0上調試通過
E. 一個C語言全排列的演算法。 比如,輸入3,則將123的全排列全部輸出:123,132,213,231
#include
main()
{
int a1,a2,a3,a4,a5,a6,a7,a8,a9,n,t=0;
scanf("%d",&n);
for(a1=1;a1<=n;a1++)
if(n==1){printf("%d\n",a1);t=t+1;}
else
for (a2=1;a2<=n;a2++)
if(a2!=a1)
{if(n==2) {printf("%d%d\n",a1,a2);t=t+1;}
else
for (a3=1;a3<=n;a3++)
if(a3!=a2&&a3!=a1)
{if(n==3) {printf("%d%d%d\n",a1,a2,a3);t=t+1;}
else
for (a4=1;a4<=n;a4++)
if(a4!=a3&&a4!=a2&&a4!=a1)
{if(n==4) {printf("%d%d%d%d\n",a1,a2,a3,a4);t=t+1;}
else
for (a5=1;a5<=n;a5++)
if(a5!=a4&&a5!=a3&&a5!=a2&&a5!=a1)
{if(n==5) {printf("%d%d%d%d%d\n",a1,a2,a3,a4,a5);t=t+1;}
else
for (a6=1;a6<=n;a6++)
if(a6!=a5&&a6!=a4&&a6!=a3&&a6!=a2&&a6!=a1)
{if(n==6) {printf("%d%d%d%d%d%d\n",a1,a2,a3,a4,a5,a6);t=t+1;}
else
for (a7=1;a7<=n;a7++)
if(a7!=a6&&a7!=a5&&a7!=a4&&a7!=a3&&a7!=a2&&a7!=a1)
{if(n==7) {printf("%d%d%d%d%d%d%d\n",a1,a2,a3,a4,a5,a6,a7);t=t+1;}
else
for (a8=1;a8<=n;a8++)
if(a8!=a7&&a8!=a6&&a8!=a5&&a8!=a4&&a8!=a3&&a8!=a2&&a8!=a1)
{if(n==8) {printf("%d%d%d%d%d%d%d%d\n",a1,a2,a3,a4,a5,a6,a7,a8);t=t+1;}
else
for (a9=1;a9<=n;a9++)
if(a9!=a8&&a9!=a7&&a9!=a6&&a9!=a5&&a9!=a4&&a9!=a3&&a9!=a2&&a9!=a1)
{if(n==9) {printf("%d%d%d%d%d%d%d%d%d\n",a1,a2,a3,a4,a5,a6,a7,a8,a9);t=t+1;}
}
}
}
}
}
}
}
}
printf("共有%d種\n",t);
getchar();getchar();
}
自己辛辛苦苦寫的,用dev c運行成功
F. 用C語言寫一個程序:輸入5個實型數求平均值,輸出這5個數的和及平均值,保留4位小數,要求輸出格式整齊。
#include<stdio.h>
void main()
{
float a,b,c,d,sum,average;
printf("請依次輸入4個實數,以空格間隔,以回車鍵結束:\n");
scanf("%f%f%f%f",&a,&b,&c,&d);
sum=a+b+c+d;
average=sum/4;
printf("4個實數的總和為: %.4f\n",sum);
printf("4個實數的平均值為:%.4f\n",average);
}
測試:
請依次輸入4個實數,以空格間隔,以回車鍵結束:
12 13.5 15.7 16.89
4個實數的總和為: 58.0900
4個實數的平均值為:14.5225
G. C語言隨即生成字母數字
(1)前兩位是10是因為printf("10%c%c%d%c%c%d%c%c\n",a3,a4,a5,a6,a7,a8,a9,a10);
的輸出格式字元串前兩位是10。
(2)因為你的輸出都是用%c格式輸出的,所以你說的「隨機數字」和「隨機字母」其實都是ASCII碼表裡面的字元,char類型只有128個字元,所以運行1000次肯定是有重復的。
H. 什麼是(c語言編程)順序比較法,不是冒泡和選擇額
順序比較法,就是冒泡呀。。。
答案由提問者自己選擇,並不代表愛問知識人的觀點 揪錯 ┆ 評論 ┆ 舉報
祥子
[學者] 相關知識介紹(所有定義只為幫助讀者理解相關概念,並非嚴格定義):
1、穩定排序和非穩定排序
簡單地說就是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,我們就
說這種排序方法是穩定的。反之,就是非穩定的。
比如:一組數排序前是a1,a2,a3,a4,a5,其中a2=a4,經過某種排序後為a1,a2,a4,a3,a5,
則我們說這種排序是穩定的,因為a2排序前在a4的前面,排序後它還是在a4的前面。假如變成a1,a4,
a2,a3,a5就不是穩定的了。
2、內排序和外排序
在排序過程中,所有需要排序的數都在內存,並在內存中調整它們的存儲順序,稱為內排序;
在排序過程中,只有部分數被調入內存,並藉助內存調整數在外存中的存放順序排序方法稱為外排序。
3、演算法的時間復雜度和空間復雜度
所謂演算法的時間復雜度,是指執行演算法所需要的計算工作量。
一個演算法的空間復雜度,一般是指執行這個演算法所需要的內存空間。
================================================================================
*/
/*
================================================
功能:選擇排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
================================================
*/
/*
====================================================
演算法思想簡單描述:
在要排序的一組數中,選出最小的一個數與第一個位置的數交換;
然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環
到倒數第二個數和最後一個數比較為止。
選擇排序是不穩定的。演算法復雜度O(n2)--[n的平方]
=====================================================
*/
void select_sort(int *x, int n)
{
int i, j, min, t;
for (i=0; i<n-1; i++) /*要選擇的次數:0~n-2共n-1次*/
{
min = i; /*假設當前下標為i的數最小,比較後再調整*/
for (j=i+1; j<n; j++)/*循環找出最小的數的下標是哪個*/
{
if (*(x+j) < *(x+min))
{
min = j; /*如果後面的數比前面的小,則記下它的下標*/
}
}
if (min != i) /*如果min在循環中改變了,就需要交換數據*/
{
t = *(x+i);
*(x+i) = *(x+min);
*(x+min) = t;
}
}
}
/*
================================================
功能:直接插入排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
================================================
*/
/*
====================================================
演算法思想簡單描述:
在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排
好順序的,現在要把第n個數插到前面的有序數中,使得這n個數
也是排好順序的。如此反復循環,直到全部排好順序。
直接插入排序是穩定的。演算法時間復雜度O(n2)--[n的平方]
=====================================================
*/
void insert_sort(int *x, int n)
{
int i, j, t;
for (i=1; i<n; i++) /*要選擇的次數:1~n-1共n-1次*/
{
/*
暫存下標為i的數。注意:下標從1開始,原因就是開始時
第一個數即下標為0的數,前面沒有任何數,單單一個,認為
它是排好順序的。
*/
t=*(x+i);
for (j=i-1; j>=0 && t<*(x+j); j--) /*注意:j=i-1,j--,這里就是下標為i的數,在它前面有序列中找插入位置。*/
{
*(x+j+1) = *(x+j); /*如果滿足條件就往後挪。最壞的情況就是t比下標為0的數都小,它要放在最前面,j==-1,退出循環*/
}
*(x+j+1) = t; /*找到下標為i的數的放置位置*/
}
}
/*
================================================
功能:冒泡排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
================================================
*/
/*
====================================================
演算法思想簡單描述:
在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上
而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較
小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要
求相反時,就將它們互換。
下面是一種改進的冒泡演算法,它記錄了每一遍掃描後最後下沉數的
位置k,這樣可以減少外層循環掃描的次數。
冒泡排序是穩定的。演算法時間復雜度O(n2)--[n的平方]
=====================================================
*/
void bubble_sort(int *x, int n)
{
int j, k, h, t;
for (h=n-1; h>0; h=k) /*循環到沒有比較范圍*/
{
for (j=0, k=0; j<h; j++) /*每次預置k=0,循環掃描後更新k*/
{
if (*(x+j) > *(x+j+1)) /*大的放在後面,小的放到前面*/
{
t = *(x+j);
*(x+j) = *(x+j+1);
*(x+j+1) = t; /*完成交換*/
k = j; /*保存最後下沉的位置。這樣k後面的都是排序排好了的。*/
}
}
}
}
/*
================================================
功能:希爾排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
================================================
*/
/*
====================================================
演算法思想簡單描述:
在直接插入排序演算法中,每次插入一個數,使有序序列只增加1個節點,
並且對插入下一個數沒有提供任何幫助。如果比較相隔較遠距離(稱為
增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除
多個元素交換。D.L.shell於1959年在以他名字命名的排序演算法中實現
了這一思想。演算法先將要排序的一組數按某個增量d分成若干組,每組中
記錄的下標相差d.對每組中全部元素進行排序,然後再用一個較小的增量
對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成
一組,排序完成。
下面的函數是一個希爾排序演算法的一個實現,初次取序列的一半為增量,
以後每次減半,直到增量為1。
希爾排序是不穩定的。
=====================================================
*/
void shell_sort(int *x, int n)
{
int h, j, k, t;
for (h=n/2; h>0; h=h/2) /*控制增量*/
{
for (j=h; j<n; j++) /*這個實際上就是上面的直接插入排序*/
{
t = *(x+j);
for (k=j-h; (k>=0 && t<*(x+k)); k-=h)
{
*(x+k+h) = *(x+k);
}
*(x+k+h) = t;
}
}
}
/*
================================================
功能:快速排序
輸入:數組名稱(也就是數組首地址)、數組中起止元素的下標
================================================
*/
/*
====================================================
演算法思想簡單描述:
快速排序是對冒泡排序的一種本質改進。它的基本思想是通過一趟
掃描後,使得排序序列的長度能大幅度地減少。在冒泡排序中,一次
掃描只能確保最大數值的數移到正確位置,而待排序序列的長度可能只
減少1。快速排序通過一趟掃描,就能確保某個數(以它為基準點吧)
的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法處理
它左右兩邊的數,直到基準點的左右只有一個元素為止。它是由
C.A.R.Hoare於1962年提出的。
顯然快速排序可以用遞歸實現,當然也可以用棧化解遞歸實現。下面的
函數是用遞歸實現的,有興趣的朋友可以改成非遞歸的。
快速排序是不穩定的。最理想情況演算法時間復雜度O(nlog2n),最壞O(n2)
=====================================================
*/
void quick_sort(int *x, int low, int high)
{
int i, j, t;
if (low < high) /*要排序的元素起止下標,保證小的放在左邊,大的放在右邊。這里以下標為low的元素為基準點*/
{
i = low;
j = high;
t = *(x+low); /*暫存基準點的數*/
while (i<j) /*循環掃描*/
{
while (it) /*在右邊的只要比基準點大仍放在右邊*/
{
j--; /*前移一個位置*/
}
if (i<j)
{
*(x+i) = *(x+j); /*上面的循環退出:即出現比基準點小的數,替換基準點的數*/
i++; /*後移一個位置,並以此為基準點*/
}
while (i<j && *(x+i)<=t) /*在左邊的只要小於等於基準點仍放在左邊*/
{
i++; /*後移一個位置*/
}
if (i<j)
{
*(x+j) = *(x+i); /*上面的循環退出:即出現比基準點大的數,放到右邊*/
j--; /*前移一個位置*/
}
}
*(x+i) = t; /*一遍掃描完後,放到適當位置*/
quick_sort(x,low,i-1); /*對基準點左邊的數再執行快速排序*/
quick_sort(x,i+1,high); /*對基準點右邊的數再執行快速排序*/
}
}
/*
================================================
功能:堆排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
================================================
*/
/*
====================================================
演算法思想簡單描述:
堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。
堆的定義如下:具有n個元素的序列(h1,h2,...,hn),當且僅當
滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)
時稱之為堆。在這里只討論滿足前者條件的堆。
由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項。完全二叉樹可以
很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。
初始時把要排序的數的序列看作是一棵順序存儲的二叉樹,調整它們的存儲順序,
使之成為一個堆,這時堆的根節點的數最大。然後將根節點與堆的最後一個節點
交換。然後對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點
的堆,並對它們作交換,最後得到有n個節點的有序序列。
從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後一個元素
交換位置。所以堆排序有兩個函數組成。一是建堆的滲透函數,二是反復調用滲透函數
實現排序的函數。
堆排序是不穩定的。演算法時間復雜度O(nlog2n)。
*/
/*
功能:滲透建堆
輸入:數組名稱(也就是數組首地址)、參與建堆元素的個數、從第幾個元素開始
*/
void sift(int *x, int n, int s)
{
int t, k, j;
t = *(x+s); /*暫存開始元素*/
k = s; /*開始元素下標*/
j = 2*k + 1; /*右子樹元素下標*/
while (j<n)
{
if (j<n-1 && *(x+j) < *(x+j+1))/*判斷是否滿足堆的條件:滿足就繼續下一輪比較,否則調整。*/
{
j++;
}
if (t<*(x+j)) /*調整*/
{
*(x+k) = *(x+j);
k = j; /*調整後,開始元素也隨之調整*/
j = 2*k + 1;
}
else /*沒有需要調整了,已經是個堆了,退出循環。*/
{
break;
}
}
*(x+k) = t; /*開始元素放到它正確位置*/
}
/*
功能:堆排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
*/
void heap_sort(int *x, int n)
{
int i, k, t;
int *p;
for (i=n/2-1; i>=0; i--)
{
sift(x,n,i); /*初始建堆*/
}
for (k=n-1; k>=1; k--)
{
t = *(x+0); /*堆頂放到最後*/
*(x+0) = *(x+k);
*(x+k) = t;
sift(x,k,0); /*剩下的數再建堆*/
}
}
void main()
{
#define MAX 4
int *p, i, a[MAX];
/*錄入測試數據*/
p = a;
printf("Input %d number for sorting :\n",MAX);
for (i=0; i<MAX; i++)
{
scanf("%d",p++);
}
printf("\n");
/*測試選擇排序*/
p = a;
select_sort(p,MAX);
/**/
/*測試直接插入排序*/
/*
p = a;
insert_sort(p,MAX);
*/
/*測試冒泡排序*/
/*
p = a;
insert_sort(p,MAX);
*/
/*測試快速排序*/
/*
p = a;
quick_sort(p,0,MAX-1);
*/
/*測試堆排序*/
/*
p = a;
heap_sort(p,MAX);
*/
for (p=a, i=0; i<MAX; i++)
{
printf("%d ",*p++);
}
printf("\n");
system("pause");
}
------------------------------------------------------------------------------------------------Mr_computer
I. C語言中如何提取出一個位元組的八位各自的狀態
Port I/O操作常用寫法:定義8個位域,並且和一個Char放到聯合體中。
簡單寫一下:
位域用樓上的寫法就行
union {
_aaa testBit;
unsigned char ucTestByte;
} P1;
首先把位元組整體賦值,比如0xAA。
P1.ucTestByte = 0xAA;
則可直接使用各Bit進行判斷,如:
if ( P1.testBit.a1 == 0 ) {
.....;
}
當然也可以直接對某一位賦值,如:
P1.testBit.a1 = 0;
則P1.ucTestByte變成0xAB;
位域不建議定義成a1-a8,最好是a0-a7,或bit0-bit7。
不編程已好久,具體寫法可能不正確,但思路沒問題,謹供參考。
J. 5個數求最大值 c語言用if語句怎麼求
#include<stdio.h>
intmain()
{
inta1,a2,a3,a4,a5,max;
printf("輸入5個數的值:");
scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
max=a1;
if(max<a2)
max=a2;
if(max<a3)
max=a3;
if(max<a4)
max=a4;
if(max<a5)
max=a5;
printf("5個數中的最大值為:%d ",max);
return0;
}
示例運行結果:
輸入5個數的值: 12 36 5 88 64
5個數中的最大值為: 88