c 網(wǎng)站建設網(wǎng)絡營銷推廣計劃
目錄
一、程序填空📝 ---?矩陣主、反對角線元素之和
題目📃
分析🧐
二、程序修改🛠? ---?二分法求方程根
題目📃
分析🧐????????
三、程序設計💻 ---?處理字符串中 * 號
題目📃
分析🧐
今日題的總結
前言
本文講解:矩陣主、反對角線元素之和,二分法求方程根,處理字符串中 * 號🏠我的主頁:我的主頁
📚系列專欄:系列專欄
一、程序填空📝 ---?矩陣主、反對角線元素之和
難度:?
題目📃
在此程序中,函數(shù) fun 的功能是:計算 N×N 矩陣的主對角線元素和反對角線元素之和,并作為函數(shù)值返回。要求先累加主對角線元素中的值,再累加反對角線元素中的值。
例如,若 N = 3,有下列矩陣:
1 2 3
4 5 6
7 8 9首先累加 1、5、9,然后累加 3、5、7,函數(shù)返回值為 30。
代碼如下:?
在1??2??3??處填空
#include <stdio.h>
#define N 4
int fun(int t[][N], int n)
{ int i, sum;
/**********found**********/1??;for(i=0; i<n; i++)
/**********found**********/sum+= 2??;for(i=0; i<n; i++)
/**********found**********/sum+= t[i][n-i-3??] ;return sum;
}
void main()
{ int t[][N]={21,2,13,24,25,16,47,38,29,11,32,54,42,21,3,10},i,j;printf("\nThe original data:\n");for(i=0; i<N; i++){ for(j=0; j<N; j++) printf("%4d",t[i][j]);printf("\n");}printf("The result is: %d",fun(t,N));
}
分析🧐
這道題相對簡單
- 填寫:sum = 0
由下方的sum的使用可以知道
這個sum沒有賦初值
又因為是sum是用來做累加求和
所以初始值是0 - 填寫:t[ i ][ i ]
由題意可以知道,這里有兩個for循環(huán)
這里的第一個就是累加從左往右(主對角線)的長度
可以看出規(guī)律,都是行列相等的 - 填寫:1
這個循環(huán),是來實現(xiàn)反對角線的(從右往左)
可以寫一下反對角線的各個元素,就可以得出規(guī)律了
?
解答代碼如下:
#include <stdio.h>
#define N 4
int fun(int t[][N], int n)
{ int i, sum;
/**********found**********/1??sum = 0;for(i=0; i<n; i++)
/**********found**********/2??sum+= t[i][i];for(i=0; i<n; i++)
/**********found**********/3??sum+= t[i][n-i-1] ;return sum;
}
void main()
{ int t[][N]={21,2,13,24,25,16,47,38,29,11,32,54,42,21,3,10},i,j;printf("\nThe original data:\n");for(i=0; i<N; i++){ for(j=0; j<N; j++) printf("%4d",t[i][j]);printf("\n");}printf("The result is: %d",fun(t,N));
}
二、程序修改🛠? ---?二分法求方程根
難度:?
題目📃
在此程序中,函數(shù) fun 和 funx 的功能是:用二分法求方程 2x3 - 4x2 + 3x - 6 = 0 的一個根,并要求絕對誤差不超過 0.001。
例如,若給 m 輸入 - 100,n 輸入 90,則函數(shù)求得的一個根為 2.000。
請改正程序中的錯誤,使它能得出正確的結果。
注意:部分源程序在文件 modi1.c 中。
不要改動 main 函數(shù),不得增行或刪行,也不得更改程序的結構!
代碼如下:
在代碼中找出2個錯誤并修改
#include <stdio.h>
#include <math.h>
double funx(double x)
{ return(2*x*x*x-4*x*x+3*x-6); }
double fun( double m, double n)
{
/************found************/int r;r=(m+n)/2;
/************found************/while(fabs(n-m)<0.001){ if(funx(r)*funx(n)<0) m=r;else n=r;r=(m+n)/2;}return r;
}
void main( )
{ double m,n, root;printf("Enter m n : \n"); scanf("%lf%lf",&m,&n);root=fun( m,n );printf("root = %6.3f\n",root);
}
分析🧐????????
這道題的意思難以理解,但是不要被這個文字描述嚇到了,看他在程序里挖的錯,都是一眼能夠看出來的
- 第8行改為
double ?r;
函數(shù)的返回值是double類型
而最后是返回r的,所以很明顯 i 是double - 第11行改為
while(fabs(r)<0.001)
由題目可知,絕對值不超過0.001
所以是小于0.001
解答代碼如下:
#include <stdio.h>
#include <math.h>
double funx(double x)
{ return(2*x*x*x-4*x*x+3*x-6); }
double fun( double m, double n)
{
/************found************/1?? double r;r=(m+n)/2;
/************found************/2?? while(fabs(r)<0.001){ if(funx(r)*funx(n)<0) m=r;else n=r;r=(m+n)/2;}return r;
}
void main( )
{ double m,n, root;printf("Enter m n : \n"); scanf("%lf%lf",&m,&n);root=fun( m,n );printf("root = %6.3f\n",root);
}
三、程序設計💻 ---?處理字符串中 * 號
難度:???
題目📃
在此程序中,規(guī)定輸入的字符串中只包含字母和 *?號。
?
編寫函數(shù) fun,其功能是:除了字符串前導和尾部的號外,將串中其它的 * 號全部刪除。形參 h 已指向字符串中第一個字母,形參 p 指向字符串的中最后一個字母。在編寫函數(shù)時,不得使用 C 語言提供的字符串函數(shù)。例如,若字符串中的內(nèi)容為 ******ABC*DEFG******,刪除后,字符串中的內(nèi)容應當是:******ABCDEFG******。在編寫函數(shù)時,不得使用 C 語言提供的字符串函數(shù)。
?注意:部分源程序在文件 prog1.c 中。
請勿改動主函數(shù) main 和其他函數(shù)中的任何內(nèi)容,僅在函數(shù) fun 的花括號中填入你編寫的若干語句。
代碼如下:
在fun函數(shù)中編寫?
#include <stdio.h>
void fun( char *a, char *h,char *p )
{}void main()
{ char s[81],*t, *f;printf("Enter a string:\n");gets(s);t=f=s;while(*t)t++;t--;while(*t=='*')t--;while(*f=='*')f++;fun( s , f,t );printf("The string after deleted:\n");puts(s);
}
分析🧐
可以先看main函數(shù)的功能,就是將t指針跳過后面的*號,還有將f指針是跳過前面的*號
而后在fun函數(shù)中,h指針相當于指向在左邊第一個非*號地址的位置
p指針是指向右邊非*號地址的位置
這也就相當于是幫我們省去了考慮前后導零的情況了
之后就可以想到覆蓋,當h指針是*號,就覆蓋它
如果不是*號就向前走
解答代碼如下:
#include <stdio.h>
void fun( char *a, char *h,char *p )
{//p指向最右邊非星號的位置//h指向最左邊非星號的位置int j;while(h < p){//讓flag指向h,代替h指針移動//如果直接讓h指針移動的話,就只能執(zhí)行一次了char *flag = h;if(*flag == '*'){//如果是*號,就將其覆蓋for(j = 0; flag[j] != '\0'; j++)flag[j] = flag[j + 1];//覆蓋完后,長度也要減少一個,所以p--p--;//如果不是*號的話h指針就向前移動}else h++;}
}void main()
{ char s[81],*t, *f;printf("Enter a string:\n");gets(s);t=f=s;while(*t)t++;t--;while(*t=='*')t--;while(*f=='*')f++;fun( s , f,t );printf("The string after deleted:\n");puts(s);
}
今日題的總結
如果遇到題目看不懂,一定不要慌,先看看代碼中能不能找出解出這個空的條件
希望本文能夠幫助到你😊