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