[過去ログ] 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
978(1): デフォルトの名無しさん [sage] 2017/11/02(木) 20:49:14.23 ID:QvGPm7pP(1) AAS
読むのと書くのを関数に分けるべきかな
979: はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/02(木) 23:14:01.04 ID:4tfXXWiS(1) AAS
>>975975(2): sage [] 2017/11/02(木) 19:37:23.87 ID:Vcb2n/8t(1) AAS
以下,かっこよくなりませんか?
while文の条件がダサすぎるので何とかしたい.
std::array は使わず,2次元の生配列でお願い.
以下,ソース.
#include <iostream>
#include <cstdlib>
#include <fstream>
int main(){
std::ifstream fin( "xxx.txt", std::ios::in );
double data[6][4];
int i = 0;
while( fin >> data[i][0] >> data[i][1] >> data[i][2] >> data[i][3] ){
for( int j=0; j<4; ++j )
std::cout << data[i][j] << " ";
std::cout << std::endl;
++i;
}
return EXIT_SUCCESS;
}
個人的にはこんな感じにするかな……。
#include <iostream>
#include <fstream>
std::istream& operator>>(std::istream& in, double (&data)[4]) {
for(auto& e: data) in >> e;
return in;
}
std::ostream& operator<<(std::ostream& out, double (&data)[4]) {
for(auto e: data) out << e << " ";
return out;
}
int main(void) {
std::ifstream fin( "xxx.txt", std::ios::in );
double data[6][4];
int i = 0;
for(auto& data_line: data) {
if((fin>>data_line).fail()) break;
std::cout << data_line << std::endl;
}
return EXIT_SUCCESS;
}
配列のままがお望みらしいのでこう書いたけど、専用の型を用意した方が綺麗っちゃ綺麗
980(2): デフォルトの名無しさん [sage] 2017/11/03(金) 00:03:21.41 ID:4eJ/7N9T(1/3) AAS
>>975
while( [&]{ for(auto& e: data[i]) fin >> e; }(), fin.good() ){
for( auto& e: data[i] )
std::cout << e << " ";
981(2): デフォルトの名無しさん [sage] 2017/11/03(金) 00:49:56.36 ID:LOXVFC/o(1/3) AAS
975です,sage方法すら忘れててすまぬ.
>>976そのソースを示してくれると嬉しい
>>977いや,これだと生理的にダメなんすよ
>>978 979
大層なことするわけじゃないからなるべく短く行きたいんや
>>980
つか,whileの条件式に登場する , は何ぞや,なレベル.
以下のソースだと,ラムダ式部分に警告 expression result unused が出る.
バイナリは吐くが,実行すると大量のコンソール出力があり,
しかも全く読めていないっぽいうえ,Segmentation faultしやがる.
以下,試したソース
#include <iostream>
#include <cstdlib>
#include <fstream>
int main(){
std::ifstream fin( "xxx.txt", std::ios::in );
double data[6][4];
int i = 0;
while( [&]{ for( auto& e : data[i] ) fin >> e; }, fin.good() ) {
for( auto& e : data[i] ) std::cout << e << " ";
std::cout << std::endl;
++i;
}
return EXIT_SUCCESS;
}
982(1): デフォルトの名無しさん [sage] 2017/11/03(金) 01:05:35.02 ID:4eJ/7N9T(2/3) AAS
>>981 外部リンク:www.google.comカンマ演算子
983(1): デフォルトの名無しさん [saga] 2017/11/03(金) 01:56:10.83 ID:LOXVFC/o(2/3) AAS
>>982
カンマ演算子か.なるほど.
whileの条件式に与えたラムダ式を評価してその成否は破棄しつつ
カンマ演算子の右にあるfinがまだ使えるかどうか,
で処理継続の可否を判断している,という理解でいいのかな.
でも,981のソースだと,while文が終わらずに,無限ループに突入しているもよう.
この現象を説明しつつ,問題を解決するソースをくれると喜びます.
984: デフォルトの名無しさん [sage] 2017/11/03(金) 04:19:30.63 ID:4eJ/7N9T(3/3) AAS
>>983 >>980
985: デフォルトの名無しさん [sage] 2017/11/03(金) 06:53:03.34 ID:LOXVFC/o(3/3) AAS
975です,
>>981 のソースでいう
while( [&]{ for( auto& e : data[i] ) fin >> e; }, fin.good() ) {
を
while( [&]{ for( auto& e : data[i] ) fin >> e; }(), fin.good() ) {
にしたら正常に動作しました.
まずはありがとうでした.
986: デフォルトの名無しさん [sage] 2017/11/03(金) 16:37:14.49 ID:t+2N1bPb(1/2) AAS
c++初心者向けの名著コードない?
987: デフォルトの名無しさん [sage] 2017/11/03(金) 20:48:45.38 ID:fZH3r81G(1) AAS
お前の頭は既にしてバーコードだろ?
988: デフォルトの名無しさん [sage] 2017/11/03(金) 20:59:39.93 ID:t+2N1bPb(2/2) AAS
坊主頭なんだが、ストレスで10円ハゲがたくさんできてQRコードだ。安心しろ。
989(2): デフォルトの名無しさん [sage] 2017/11/04(土) 09:57:38.12 ID:io7R91TU(1/2) AAS
char a[8]="12 34 56";
と言うのがあったとして
これを数値の123456にしたい時、一番速い書き方ってどんなだろうか
990: デフォルトの名無しさん [sage] 2017/11/04(土) 10:21:35.26 ID:KEPGzX0z(1) AAS
>>989
aの内容は書き換えても良い?
数値は必ず2桁の空白区切り?
991(1): デフォルトの名無しさん [sage] 2017/11/04(土) 10:58:19.72 ID:OnkwfBEU(1) AAS
普通に文字列の先頭から、数字が表れたら'0'との差を加算して桁上げして、ってのを繰り返すのが速いと思うが。
992: デフォルトの名無しさん [sage] 2017/11/04(土) 11:09:08.10 ID:XesRBOxx(1) AAS
>>989 スレッド終盤に面白い問題を出してくれるなぁ。
a[8] と要素数を明示して "12 34 56" を代入する部分に罠の臭いを感じる。
'\0' 終端の一般的なCの文字列ではない、8byte専用のトリックが存在するのかも。
993: はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/04(土) 11:29:59.70 ID:oNhsu9lL(1/2) AAS
条件次第ではあるけど、
平均的には標準で用意されている関数を使うのがまともな速さになると思う。
↓こんなの
*std::remove(std::begin(a), std::end(a), ' ') = '\0';
994: デフォルトの名無しさん [sage] 2017/11/04(土) 11:47:30.29 ID:zGy4Oklk(1/3) AAS
速さってコーディンクの速さ?
実行速度?
995: デフォルトの名無しさん [sage] 2017/11/04(土) 11:51:36.02 ID:zGy4Oklk(2/3) AAS
a[0]*100000+a[1]*10000+a[3]*1000+a[4]*100+a[6]*10+a[7]-'0'*(111111)
996: デフォルトの名無しさん [sage] 2017/11/04(土) 11:59:30.61 ID:zGy4Oklk(3/3) AAS
int v = 0;
for (int i = 0 ; a[i] != '??0' ; i++){
if (a[i] == ' ')
continue;
v = v*10+(a[i]-'0');
}
997: デフォルトの名無しさん [sage] 2017/11/04(土) 12:28:06.26 ID:io7R91TU(2/2) AAS
みんなありがとう
>>991を参考にこんな感じでやってみたけど、どうなんだろうか。
#include <stdio.h>
#include<time.h>
int main(){
char a[8]="12 34 56";
int b;
clock_t c c;
c=clock();
for(int d=1000000000;d;d--){
b=10*(10*(10*(10*(10*(a[0])+a[1])+a[3])+a[4])+a[6])+a[7]-5333328;
}
printf("%d\n%.3f\n",b,(double)(clock()-c)/CLOCKS_PER_SEC);
}
スマホで書いたからミスってるかもw
998: デフォルトの名無しさん [sage] 2017/11/04(土) 16:35:05.69 ID:NYxCuvMY(1) AAS
次スレ
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
2chスレ:tech
999: デフォルトの名無しさん [sage] 2017/11/04(土) 20:16:28.54 ID:wPtyVAZ4(1) AAS
文字化けしてる奴がMZくさい
1000: はちみつ餃子 ◆8X2XSCHEME [sage] 2017/11/04(土) 20:57:59.73 ID:oNhsu9lL(2/2) AAS
結果を整数で得たいならこういうのでもいいかな。
std::accumulate(std::begin(a), std::end(a), 0, [](int acc, int e) { return std::isdigit(e) ? acc*10+e-'0' : acc;})
1001(1): 1001 [] ID:Thread(1/2) AAS
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 109日 13時間 50分 32秒
1002(1): 1002 [] ID:Thread(2/2) AAS
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
外部リンク:premium.5ch.net
▼ 浪人ログインはこちら ▼
外部リンク[php]:login.5ch.net
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.207s*