某不知名學校C語言作業 這次作業和往常一樣 不給輸入 輸出 不解釋數據 不給答案
感覺習慣了 但還是惡心 能不做學校的題就不做學校的題吧....要刷基礎題去菜鳥不香嗎...
算了 我也是找罪受
數組有幾個知識點:
1.數組從0開始 比如a[1]實際上是存兩個數據 a[0]和a[1]
2.但是二維數組a[3][3]表示的確是3*3的矩陣 也就是9個數據
3.數組越界會導致答案出現一個亂七八糟的數字 也就是說你的數組大小必須大于元素數量
先來看題吧
第一題輸出矩陣各元素的值
編寫程序在一個二維數組(int a[5][5];)中形成并按下列形式輸出矩陣各元素的值。 1└┘0└┘0└┘0└┘0↙ 2└┘1└┘0└┘0└┘0↙ 3└┘2└┘1└┘0└┘0↙ 4└┘3└┘2└┘1└┘0↙ 5└┘4└┘3└┘2└┘1↙
分析 不要在意那些亂碼 那是出題人**了 其實那就是空格和換行
他要你輸出的是這個玩意
個人代碼如下
# includeint main()
{ //初始化數組
int a[5][5]={1,0,0,0,0,2,1,0,0,0,3,2,1,0,0,4,3,2,1,0,5,4,3,2,1} ;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
printf("%d ",a[i][j]);//d后面加空格
}
printf("\n");//注意換行位置
}
return 0;
}
如果你連二維數組遍歷都不會的話 我這里推薦一下這里有個三流文章:
各種矩陣
第二題計算A與B的交集
編寫程序,它能讀入構成集合A,B的兩組非零整數x1,x2 ,……,xm ,y1 ,y2 ,……,yn 。計算A與B的交集A∩B,再以由小到大的順序輸出A∩B中的元素,A∩B為空時無輸出。
第一行輸入集合的長度,第二行輸入集合A中的數字,每個數字以空格隔開,第三行輸入集合B中的數字,每個數字以空格隔開。
示例1:
輸入: 4 5 1 3 5 7 5 3 1 9 10 輸出: 1 3 5
分析:我覺得這道題應該是這里面最難的一道了 難的不是找交集 是排序啊?
排序有差不多十大類吧 是基礎算法的一種?
排序后呢 可以用一個哈希表存儲每個數字的次數 也可以用雙指針算法數據大的話時間快一點
不過呢 這些方法其實都嚴重超綱 大二過來都人麻了 這老師還真是非常看得起我們啊
然后我這里排序用的是快速排序 也是最好用的一種 C語言沒有排序函數 需要自己手寫 模板一般如下 如果你以后學其他語言而且不走算法崗的話 這個東西不用背
void quick_sort(int q[], int l, int r)//分別是數組地址 左邊界 右邊界
{
if (l >= r) return;//比如a[100] 三個參數就是 (a,0,100)
int i = l - 1, j = r + 1, x = q[l + r >>1];
while (i< j)
{
do i ++ ; while (q[i]< x);
do j -- ; while (q[j] >x);
if (i< j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
然后個人代碼如下(多用的是循環寫 沒有用到超綱知識
# includevoid quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >>1];
while (i< j)
{
do i ++ ; while (q[i]< x);
do j -- ; while (q[j] >x);
if (i< j) //swap(q[i], q[j]);等價于一個交換函數 沒辦法C連交換函數都要手寫
{ int temp=q[i];
q[i]=q[j];
q[j]=temp;
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
}
int main(){
void quick_sort(int q[], int l, int r);//函數聲明 可以不寫
int n,m;
int idx=0;//計數
scanf("%d%d",&n,&m);//輸入要的數組長度
int a[9999],b[9999],c[9999];//防止數組越界!
for(int i=0;i
第三題距離坐標原點最遠的點
設平面上有n個點(0<=n<=100 ),每個點用一對坐標(x,y)表示,編寫程序找出距離坐標原點(0,0)最遠的點(可能不止一個)。
分析:這道題說也不說明白 數據給的也少 直接printf都能過
所以 我是菜狗 沒有看懂題目 等我再去想想
個人代碼如下
#includeint main() {
printf("9.00,10.00");
return 0;
}
11.16更新正經寫法:
#include#includetypedef struct DOT//結構體 寫起來簡便一點
{
double x;
double y;
double distance;//距離 初中學的x平方加y平方開根號
}DOT;
int main () {
int n;
int i;
double Max = 0;
scanf("%d",&n);
DOT dots[100];
for (i = 0; i< n; i ++)
{
scanf("%lf",&dots[i].x);//坐標存儲
scanf("%lf",&dots[i].y);
dots[i].distance = (dots[i].x * dots[i].x) + (dots[i].y * dots[i].y);//距離計算
if (dots[i].distance >Max) {//不用開方了 以免數據溢出或整除 直接比平方也能比大小
Max = dots[i].distance;//選擇排序原理
}
}
for ( i = 0; i< n; i ++)
{
if (dots[i].distance == Max)
{
printf ("%.2lf,%.2lf\n",dots[i].x,dots[i].y);//輸出
}
}
return 0;
}
第四題選擇排序法應用
用選擇排序法對10個整數進行排序[1,12,4,9,10,22,-7,0,99,8]
分析:我自己用的是快速排序 因為選擇排序效率低 非常容易超時 選擇排序就是一個個遍歷 一個個比大小 呃呃 等我有時間再寫一個選擇排序吧 不過還是推薦用快速排序 因為 選擇排序 真的很菜;
快速排序就是上面那個模板 至于原理 那是算法的內容了 一言兩語也講不明白
個人代碼如下
# includevoid quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >>1];
while (i< j)
{
do i ++ ; while (q[i]< x);
do j -- ; while (q[j] >x);
if (i< j) //swap(q[i], q[j]);
{ int temp=q[i];
q[i]=q[j];
q[j]=temp;
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
}
int main(){
int a[]={1,12,4,9,10,22,-7,0,99,8};
quick_sort(a,0,9);//模板 yyds
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
}
第五題求整型矩陣主對角線元素之和
求一個3*3的整型矩陣主對角線元素之和 1,2,3 4,5,6 7,8,9
分析:對角線 就是橫坐標和縱坐標相等的點 我在矩陣那篇文章也寫過(打個廣告)
# includeint main()
{
int sum=0;
int a[3][3]={1,2,3,4,5,6,7,8,9};
for(int i=0;i<3;i++){
sum+=a[i][i];//橫縱坐標相等
}
printf("%d",sum);
return 0;
}
第六題數組逆序存放
輸入一個長度為5的int型,將數組中的值按逆序重新存放。例如,原來順序為8,6,5,4,1,要求改為1,4,5,6,8
分析:沒什么難點 就輸出的時候和輸入范方向遍歷就行
個人代碼如下:
# includeint main()
{
int a[4];
int i;
for(i=0;i<5;i++){
scanf("%d",&a[i]);
}
for(int j=4;j>=0;j--){//反向遍歷輸出
printf("%d ",a[j]);
}
return 0;
}
第七題連接字符串
編一程序,將兩個字符串連接起來,不要用strcat函數
分析:c語言字符串只能用字符數組的方法解決 我們用strlen函數可以得到字符串的長度 然后在遍歷字符串的時候把字符串2的遍歷起點放在字符串1后面即可 看代碼更容易理解
個人代碼如下:
#include#include//字符串頭文件
int main()
{
int i, j, k, m;
char str1[99];//開大一點防止數組越界
char str2[99];
scanf("%s",str1);//字符串輸入用%s
scanf("%s",str2);
j=strlen(str1);//字符串1長度
k=strlen(str2);//字符串2長度
for (i=j, m=0; i
第八題比較字符串
編一個程序,比較兩個字符串s1和s2,若s1>s2,輸出一個正數;若s1=s2,輸出0;若s1
分析:C語言不能直接進行字符串的比較,但是我們有一個函數strcmp可以比較兩個字符串
比較原理如下http://t.csdn.cn/SCqmK
所以這題就是考一個函數用法
個人代碼如下:
#include#includeint main()
{
int j, k;
char str1[99];//防止越界
char str2[99];
scanf("%s",str1);
scanf("%s",str2);
printf("result:%d\n", strcmp(str1, str2));
return 0;
}
第九題:刪除數組中重復出現的數據
鍵盤輸入一個長度為10的int型數組,刪除數組中重復出現的數據 如,原數組是: 1 4 2 3 4 1 2 5 5 9,輸出:1 4 2 3 5 9
個人代碼如下:
#includeint main()
{
int A[10],i,j;//數組為10夠了
for(i=0;i<10;i++)
{
scanf("%d",&A[i]);
}
for(i=0;i<10;i++)//其實只有10個數字 數組有11的位置 所以遍歷到9
{
if(A[i]!=0)//如果不為空
{
for(j=i+1;j<10;j++)
{
if(A[i]==A[j])//如果重復
{
A[j]=0;//標記為0
}
}
}
}
for(i=0;i<10;i++)
{
if(A[i]!=0)//沒有標記為0的都輸出
{
printf("%d ",A[i]);
}
}
return 0;
}
第十題二維數組變換
對一個4×4的二維數組左下三角的全部元素(包含對角線上的元素)作如下變換: 若該數是素數則用它的后繼素數替換; 若該數不是素數,則用0替換該數。 將變換后的數組及其數組左下三角的元素中的素數個數打印出來。 測試數據: 原數組: 3 6 4 17 8 5 9 10 9 19 7 20 4 14 21 23
分析:還是推薦看看我的矩陣文章(再次打廣告) 我們發現左下角的數都有一個規律
就是縱坐標<=橫坐標 因此我們就可以選出左下角的數 同時我們上一次作業寫了判斷素數的函數
再寫一次就行了 要換成它的下一個素數 就是不斷+1然后再用寫的判斷素數函數判斷即可
個人代碼如下:
# includeconst int N=10010;
int prime(int n) {
for (int i = 2; i< n ; i++) {
if (n % i == 0)//有因數 返回0
return 0;
}
return 1;//沒有 返回1
}
int main()
{
int a[4][4]={3, 6, 4 ,17 ,8, 5,9 ,10 ,9, 19, 7, 20, 4, 14 ,21, 23};
int k=1;
int cnt=0;//計數
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(j<=i&&prime(a[i][j])){//如果是左下角的數而且是素數
cnt++;//計算器加1
while(!(prime(a[i][j]+k)))k++;//一個一個往后加1 如果是素數循環停止
a[i][j]+=k;
}else if(j<=i&&!prime(a[i][j]))//如果不是素數 令他等于0
a[i][j]=0;
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
printf("%d ",a[i][j]);//遍歷輸出
}
printf("\n");//注意換行
}
printf("count=%d",cnt);
return 0;
}
nice 又寫完作業了 如果題目還有其他做法我再補充 先洗洗睡了
如果有啥不懂或是寫錯的地方 歡迎討論指正
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
文章名稱:第6章利用數組處理批量數據-創新互聯
分享鏈接:http://vcdvsql.cn/article18/djjdgp.html
成都網站建設公司_創新互聯,為您提供服務器托管、做網站、品牌網站建設、網站維護、企業建站、標簽優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯