百日大刷题No.8
?博客主頁:?CS semi主頁
?歡迎關注:點贊收藏+留言
?系列專欄:百日大刷題
?代碼倉庫:C Advanced
家人們更新不易,你們的點贊和關注對我而言十分重要,友友們麻煩多多點贊+關注,你們的支持是我創(chuàng)作最大的動力,歡迎友友們私信提問,家人們不要忘記點贊收藏+關注哦!!!
百日大刷題No.8
- 一、統計某類完全平方數
- 1.題目內容和解題思路
- 2.代碼實現
- 二、統計一行文本的單詞個數
- 1.題目內容和解題思路
- 2.代碼實現
- 三、找最長的字符串
- 1.題目內容和解題思路
- 2.代碼實現
- 四、N個數排序
- 1.題目內容和解題思路
- 2.代碼實現
- 五、字符串逆置(逆置完單詞不變)
- 1.題目內容和解題思路
- 2.代碼實現
- 六、按等級統計學生成績
- 1.題目內容和解題思路
- 2.代碼實現
- 七、通訊錄排序
- 1.題目內容和解題思路
- 2.代碼實現
- 八、通訊錄的錄入與顯示
- 1.題目內容和解題思路
- 2.代碼實現
- 九、查找書籍
- 1.題目內容和解題思路
- 2.代碼實現
- 總結
一、統計某類完全平方數
1.題目內容和解題思路
思路:進入函數以后,首先要先判斷的是這個數是不是完全平方數,如果不是,則返回值為0,如果是,則把它每一位數拿出來放到數組里面,再進行比較每一位數是否相等(這里用到了循環(huán)比較)。
2.代碼實現
#include <stdio.h> #include <math.h>int IsTheNumber(const int N) {int k = 0;int n = N;int num[10];if (sqrt(n) != (int)sqrt(n)) { //先比較是不是完全平方數return 0;}while (n) {num[k] = n % 10; //將每一位都拆開放到數組里面n /= 10;k++;}for (int i = 0; i < k; i++) {for (int j = i + 1; j < k; j++) {if (num[i] == num[j]) { //比較一個數組每一位的大小return 1;}}}return 0; }int main() {int n1, n2, i, cnt;scanf("%d %d", &n1, &n2);cnt = 0;for (i = n1; i <= n2; i++) {if (IsTheNumber(i))cnt++;}printf("cnt = %d\n", cnt);return 0; }二、統計一行文本的單詞個數
1.題目內容和解題思路
思路:先看開頭有沒有空格,如果沒有空格則計數器從1開始,如果有空格則計數器從0開始,將{空格、字母}為一組作為計數器相加減的條件,滿足則加一,不滿足則不變。
2.代碼實現
#include<stdio.h> #include<string.h> int main() {char arr[1000];int i = 0;int cnt = 0;gets(arr);//判斷第一個輸入的是不是空格,如果是空格則計數器為0,如果不為0則計數器為1if (arr[0] == ' ') {cnt = 0;}else {cnt = 1;}for (i = 0; i < strlen(arr) - 1; i++) {if (arr[i] == ' ' && arr[i + 1] != ' ') { //當前一個字母為空格,后一個不為空格則計數器加一cnt++;}}printf("%d", cnt);return 0; }三、找最長的字符串
1.題目內容和解題思路
思路:定義一個二維數組,從二維數組中找到最長的字符串,如果大家不太理解strlen的使用,我在下面放一篇我自己寫的博客供大家參考參考。
模擬strlen函數的使用(超詳細)
2.代碼實現
#include<stdio.h> #include<string.h> int main() {int n = 0;int max = 0;int a = 0;int j = 0; //記錄位置int i = 0;scanf("%d", &n);char arr[n][80] = { 0 }; /*char arr[100][80]*/ //n為變長數組,從C99的標準后可以支持變長數組,但是在C89/C90就不可以用變長數組for (i = 0; i < n; i++) {scanf("%s", arr[i]);}//進入一個循環(huán)找最長數組for (i = 0; i < n; i++) {a = strlen(arr[i]); //求數組長度if (a > max) { //細節(jié)是沒有等于號,當后續(xù)輸入的字符串和它相等的時候,輸出的是第一個,因為后續(xù)相等的字符串進不來max = a;j = i; //記錄此時i的位置,后續(xù)還要進去循環(huán)判斷,i的值會進行改變}}printf("The longest is: %s", arr[j]); //輸出這個最長數組的值return 0; }四、N個數排序
1.題目內容和解題思路
思路:先進行輸入總共數組的個數,再輸入每一個數組的個數,再輸入每一個數組的所有元素,傳參進入函數進行指針排序。
這里要注意的是每一行的最前面那個數是元素的個數,千萬不要當成數組內元素進行排序。
2.代碼實現
法一:
#include <stdio.h>void swap(int* p1, int* p2) { //交換int temp = *p1;*p1 = *p2;*p2 = temp; }void pai(int* p, int n) { //接受數組的首地址和該行元素數量int i = 0;int j = 0;for (i = 0; i < n - 1; i++) { //n個數的數列總共掃描了n-1次for (j = 0; j < n - 1 - i; j++) { //每一趟掃描到p[n-i-1]與p[n-i-2]比較為止結束if (*(p + j) > *(p + 1 + j)) { //冒泡法排序swap(p + j, p + j + 1); //傳參}}} }int main() {int a[100] = { 0 };int k = 0;int n = 0;int j = 0;int i = 0;scanf("%d ", &k); //總共有k組for (i = 0; i < k; i++) {scanf("%d ", &n); //每一組的元素個數for (j = 0; j < n; j++) {scanf("%d", &a[j]); //每一組的元素}pai(a, n); //傳參進入數組進行排序for (j = 0; j < n - 1; j++) { //打印前n-1項,目的是為了行末無空格printf("%d ", a[j]);}printf("%d\n",a[n-1]); //打印最后一個元素并進行換行}return 0; }法二(備用):
#include <stdio.h> void pai(int* p, int n) {int i, j, t;int m;for (i = 0; i < n - 1; i++) { //總共掃描n-1次m = i;for (j = i + 1; j < n; j++) {if (*(p + j) < *(p + m)) {m = j;}}t = *(p + m);*(p + m) = *(p + i);*(p + i) = t;} }int main() {int a[100];int k, n, j, i;scanf("%d", &k); //輸入數組個數for (i = 0; i < k; i++) {scanf("%d ", &n); //輸入每個數組的個數for (j = 0; j < n; j++) {scanf("%d", &a[j]); //輸入每個數組的各個元素}pai(a, n); //傳參進行排序for (j = 0; j < n - 1; j++) { //輸出前n-1個數,因為行末無空格printf("%d ", a[j]);}printf("%d\n", a[n - 1]);}return 0; }五、字符串逆置(逆置完單詞不變)
1.題目內容和解題思路
內容:將一組字符串進行逆置,例如:I like you. 逆置成:you. like I即可。
思路:如下圖
2.代碼實現
#include<stdio.h> #include<string.h> #include<assert.h> void swap(char* left, char* right) { //傳送的為指針指向該字符串最左端和最右端assert( left && right); //斷言判斷是不是傳進來空指針while (left < right) {int tmp = *left;*left = *right;*right = tmp;left++;right--;} } int main() {//定義一個數組char arr[100] = { 0 };gets(arr); //輸入字符串//1.先整體交換int sz = strlen(arr);swap(arr, arr + sz - 1);//2.逐個單詞交換char* cur = arr;while (*cur!='\0') { //大循環(huán)找所有的單詞char* start = cur; //start跟著cur走while (*cur != ' ' && *cur != '\0') { //判斷如果不為空格或者\0,則往后接著移動cur++;}swap(start, cur - 1); //傳參,進行單個單詞的排序if (*cur != '\0') {cur++; //在上式中有可能跳過\0,導致死循環(huán)}}//3.打印printf("%s\n", arr);return 0; }六、按等級統計學生成績
1.題目內容和解題思路
*思路:根據裁判給的程序可知,是把成績傳輸進去,所以要在函數里面進行判斷,p就是p[]數組的首地址。
2.代碼實現
int set_grade( struct student *p, int n ){int count=0;int i=0;for(i=0;i<n;i++){if(p[i].score<60){p[i].grade='D';count++;}else if(p[i].score<70){p[i].grade='C';}else if(p[i].score<=84){p[i].grade='B';}else if(p[i].score<=100){p[i].grade='A';}}return count; }七、通訊錄排序
1.題目內容和解題思路
思路:此題有點巧妙的地方在于它需要再加一個結構體變量并進行交換,總體的交換,使得整個結構體數組進行交換。
2.代碼實現
#include<stdio.h> struct people {char name[11];int birthday;char tel[18]; }peo[10], peo1; //結構體變量int main() {int n = 0;scanf("%d", &n);int i = 0;int j = 0;for (i = 0; i < n; i++) {scanf("%s %d %s", peo[i].name, &peo[i].birthday, peo[i].tel);}for (i = 0; i < n - 1; i++) { //冒泡法排序for (j = 0; j < n - i - 1; j++) {if (peo[j].birthday > peo[j + 1].birthday) {peo1 = peo[j]; //很關鍵,要用的是整體的交換,如果后面加了后綴,那肯定是出錯的peo[j] = peo[j + 1];peo[j + 1] = peo1;}}}for (i = 0; i < n; i++) {printf("%s %d %s\n", peo[i].name, peo[i].birthday, peo[i].tel);}return 0; }八、通訊錄的錄入與顯示
1.題目內容和解題思路
思路:按照題目意思定義一個結構體,再從結構體里面輸入信息,按照題目意思輸出就好了。
2.代碼實現
#include<stdio.h>struct inf { //定義一個結構體里面存放需要輸入的字符串char name[20];char birth[20];char sex[10];char tel[20];char phone[20]; }peo[10]; //結構體變量int main() {int n = 0;scanf("%d", &n);int i = 0;for (i = 0; i < n; i++) {scanf("%s %s %s %s %s", peo[i].name, peo[i].birth, peo[i].sex, peo[i].tel, peo[i].phone);}int k = 0;scanf("%d", &k);int arr[15] = { 0 };for (i = 0; i < k; i++) {scanf("%d", &arr[i]); //編號用數組表示}//輸出for (i = 0 ; i < k; i++) {if (arr[i] >= 0 && arr[i] < n) {printf("%s %s %s %s %s", peo[arr[i]].name, peo[arr[i]].tel, peo[arr[i]].phone, peo[arr[i]].sex, peo[arr[i]].birth);//按照題目意思輸出}else {printf("Not Found"); }if (i < k - 1) {printf("\n");}}return 0; }九、查找書籍
1.題目內容和解題思路
思路:有個比較棘手的問題,這個書名是有空格的,所以要用gets,而且有換行,也是一個很棘手的問題,所以要用到getchar作為緩沖。
2.代碼實現
#include<stdio.h> struct student {char name[31];double price; }stu[10]; int main() {int n = 0;scanf("%d", &n);int i = 0;int j = 0;int k = 0;for (i = 0; i < n; i++) {getchar(); //空格gets(stu[i].name); //輸入書籍的名稱,因為有空格,所以用getsscanf("%lf", &stu[i].price); //輸入書籍的價格}int max = stu[0].price; //先假定最便宜的和最貴的都是第一本書int min = stu[0].price;for (i = 0; i < n; i++) {if (stu[i].price > max) {max = stu[i].price;j = i; //后面破壞了i,用j來表示一個數的位置}}for (i = 0; i < n; i++) {if (stu[i].price < min) {min = stu[i].price;k = i;}}printf("%.2lf, %s\n", stu[j].price, stu[j].name);printf("%.2lf, %s", stu[k].price, stu[k].name);return 0; }總結
第八天刷的題稍有些難度,量也有點大,但也要努力認真的習慣做這些題目。
總結
- 上一篇: onShareAppMessage小程序
- 下一篇: JS 高级(继承、函数)